npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-pert

v1.0.4

Published

Interactive PERT chart component for React

Readme

react-pert

- - Build Size Downloads

:star2: Overview

This package provides tools to calculate and visualize a PERT (Program Evaluation and Review Technique) diagram. It includes the following components and utilities:

  • Pert: A component to render the PERT diagram.
  • usePert: A custom hook to retrieve PERT results.
  • Chart Interaction: Allows interaction with the diagram, enabling the selection of tasks and displaying only the path related to the selected task.

:rocket: Progress

  • :white_check_mark: PERT Calculator: Fully functional.
  • :white_check_mark: PERT Diagram: Fully functional.

:computer: Demo

Check out the live demo here.


:clipboard: Installation

Install the package via npm:

npm install react-pert

:book: Usage

Using Pert Component

import { Pert, type TaskInput } from "react-pert";

const App = () => {
  const tasks: TaskInput[] = [
    { key: "1", duration: 5, text: "A" },
    { key: "2", duration: 4, text: "B" },
    { key: "3", duration: 2, text: "C", dependsOn: ["1"] },
    { key: "4", duration: 3, text: "D", dependsOn: ["2"] },
    //...
  ];

  return <Pert tasks={tasks} />;
};

Using usePert Hook

You need to wrap your application with PertProvider to use the usePert hook. Here is an example of how you can use it:

  • Note: You should put the Pert component and usePert hook in the same PertProvider to ensure that the PERT data is available to both.
import { PertProvider, usePert, type TaskInput } from "react-pert";

const App = () => {
  const tasks: TaskInput[] = [
    { key: "1", duration: 5, text: "A" },
    { key: "2", duration: 4, text: "B" },
    { key: "3", duration: 2, text: "C", dependsOn: ["1"] },
    { key: "4", duration: 3, text: "D", dependsOn: ["2"] },
    //...
  ];
  return (
    <PertProvider>
      <Pert tasks={tasks} />
      <PertDetails />
    </PertProvider>
  );
};
import { usePert } from "react-pert";

const PertDetails = () => {
  const { projectDuration, criticalPaths } = usePert();

  return (
    <div>
      <h3>Project Duration : {projectDuration}</h3>
      <h3>Critical Paths:</h3>
      <div>
        {criticalPaths.map((cp, index) => (
          <div key={index}>
            {cp.map((p, i) => (
              <span key={i}>
                {p.text}
                {i < cp.length - 1 && " → "}
              </span>
            ))}
          </div>
        ))}
      </div>
    </div>
  );
};

:bulb: Examples

  • setSelectedTask

You can use the setSelectedTask function to select a task in the PERT diagram. This function is available when you import setSelectedTask from react-pert.

setSelectedTask: (taskKey: string | null) => void;
import { Pert, PertProvider, setSelectedTask } from "react-pert";

const App = () => {
  const tasks = [
    { key: "1", duration: 5, text: "A" },
    //...
  ];

  const handleClick = () => {
    setSelectedTask("1");
  };
  const handleClear = () => {
    setSelectedTask(null);
  };

  return (
    // PertProvider is optional if you are using only setSelectedTask
    <PertProvider>
      <Pert tasks={tasks} />
      <button onClick={handleClick}>Select Task 1</button>
      <button onClick={handleClear}>Clear Selection</button>
    </PertProvider>
  );
};
  • onSelect

You can use the onSelect prop to get the selected task when a task is selected in the PERT diagram.

onSelect?: (task: Task) => void;
import { Pert } from "react-pert";

const App = () => {
  const tasks = [/*...*/];
  const handleSelect = (task) => {
    console.log("Selected Task:", task);
  };

  return <Pert tasks={tasks} onSelect={handleSelect} />;
};
  • usePert with PertOptions

You can pass options to the usePert hook to customize the output data.

const results = usePert({ bounds: true });
  • Default: true

The usePert hook can be customized using the bounds option to include or exclude boundary tasks (Start and Finish) in the returned tasks.

Input

const input: TaskInput[] = [
  { key: "1", duration: 5, text: "A" },
  { key: "2", duration: 4, text: "B", dependsOn: ["1"] },
  { key: "3", duration: 2, text: "C", dependsOn: ["2"] },
];

Output with bounds = true

When bounds is set to true, the Start and Finish tasks are included:

const output: Task[] = [
  { key: "Start", text: "Start", duration: 0, dependsOn: [] },
  { key: "1", text: "A", duration: 5, dependsOn: ["Start"], ...rest /* other properties */ },
  { key: "2", text: "B", duration: 4, dependsOn: ["1"], ...rest /* other properties */ },
  { key: "3", text: "C", duration: 2, dependsOn: ["2"], ...rest /* other properties */ },
  { key: "Finish", text: "Finish", duration: 0, dependsOn: ["3"] },
];

Output with bounds = false

When bounds is set to false, the Start and Finish tasks are excluded:

const output: Task[] = [
  { key: "1", text: "A", duration: 5, dependsOn: [], ...rest /* other properties */,},
  { key: "2", text: "B", duration: 4, dependsOn: ["1"], ...rest /* other properties */ },
  { key: "3", text: "C", duration: 2, dependsOn: ["2"], ...rest /* other properties */ },
];

:books: API Reference

PertProps

| Attribute | Type | Description | | ----------- | --------------------------- | --------------------------------------------------------------- | | tasks | TaskInput[] | Array of tasks to be used for the calculation and PERT diagram. | | styles? | PertStyles | Optional styles configuration for the PERT chart. | | onSelect? | (task: Task) => void | Optional callback invoked when a task is selected. |

Pert

A visual representation of the PERT diagram (currently in development).


usePert

Options:

PertOptions

| Attribute | Type | Description | | --------- | --------- | ------------------------------------------------------------------------------------------------------------------ | | bounds | boolean | Determines whether the boundary tasks (Start and Finish) should be included in the returned tasks. Default: true |

  • If true, the Start and Finish tasks will be included.
  • If false, the Start and Finish tasks will be excluded.
  • Default: true

Returns:

  • PertDataType: Contains all PERT data including tasks, levels, links, critical paths, and project duration.

PertDataType

| Attribute | Type | Description | | ----------------- | --------------------------------- | ----------------------------------------------------------- | | tasks | Task[] | Array of tasks with PERT calculation results. | | levels | LevelType | Mapping of task keys to their respective levels. | | links | LinkType[] | Array of links representing the dependencies between tasks. | | criticalPaths | CriticalPath[] | Array of critical paths in the project. | | projectDuration | number | Total duration of the project. | | error? | string \| null | Current error message, if any. |

TaskInput

Represents a task with input data for PERT calculation.

| Attribute | Type | Description | | ------------ | ---------- | --------------------------------------------------------------- | | key | string | Unique identifier for the task. | | text | string | Description or name of the task. | | duration | number | Duration of the task in some unit (e.g., days). | | dependsOn? | string[] | Array of task keys that the current task depends on (optional). |

Task

Represents a task with PERT calculation results.

| Attribute | Type | Description | | ------------- | ---------- | -------------------------------------------- | | key | string | Unique identifier for the task. | | text | string | Description or name of the task. | | duration | number | Duration of the task. | | dependsOn? | string[] | Array of task keys the task depends on. | | earlyStart | number | The earliest start time for the task. | | earlyFinish | number | The earliest finish time for the task. | | lateStart | number | The latest start time for the task. | | lateFinish | number | The latest finish time for the task. | | level | number | The level of the task in the PERT diagram. | | critical | boolean | Indicates if the task is on a critical path. | | freeFloat | number | The free float time of the task. | | totalFloat | number | The total float time of the task. | | index | number | Index of the task in the sequence. |

PertStyles

Styles configuration for the PERT chart.

| Attribute | Type | Description | | ---------------------- | ---------------------------- | -------------------------------------------------------- | | disableGrid? | boolean | Whether to disable grid lines in the chart. | | taskSize? | number | Size of the task node in pixels. | | fontFamily? | string | Font family for the text in the task nodes. | | fontSize? | FontSize | Font size for the text in the task nodes. | | textColor? | string | Color of the text inside the task nodes. | | chartBackground? | string | Background color of the entire chart. | | taskBackground? | string | Background color of the task nodes. | | gridColor? | string | Color of the grid lines in the chart. | | borderWidth? | number | Width of the border for task nodes. | | selectedBorderWidth? | number | Width of the border for selected task nodes. | | hoverBorderWidth? | number | Width of the border when hovering over task nodes. | | borderColor? | string | Color of the border for task nodes. | | selectedBorderColor? | string | Color of the border for selected task nodes. | | criticalColor? | string | Color for critical path elements (e.g., tasks or links). | | arrowColor? | string | Color of the arrows (links) between task nodes. | | arrowWidth? | number | Width of the arrows (links) between task nodes. | | gap? | { x?: number; y?: number } | Gap between task nodes in the chart. |

FontSize

| Type | Description | | ------------------------------------------------------------------------- | --------------------------------------------- | | "sm", "md", "lg", "xl", "2xl", "3xl", string & {}, number | Font size options for text in the task nodes. |

LevelType

Represents a mapping of task keys to their respective levels in the PERT diagram.

| Attribute | Type | Description | | --------- | ---------- | ----------------------------------------- | | key | number | The level number in the PERT diagram. | | value | string[] | Array of task keys at the specific level. |

LinkType

Represents a link between two tasks in the PERT diagram.

| Attribute | Type | Description | | ---------- | --------- | ------------------------------------------------- | | from | string | The task key from which the link originates. | | to | string | The task key to which the link leads. | | critical | boolean | Indicates if the link is part of a critical path. |

CriticalPath

Represents a critical path in the PERT diagram.

| | Type | Description | | -------------- | -------------------------- | ------------------------------------------------------------------------- | | CriticalPath | PathItem[] | An array of tasks (PathItem) forming the critical path. |

PathItem

| Attribute | Type | Description | | --------- | -------- | ---------------------------------- | | text | string | Description or name of the task. | | key | string | Task key identifier. |


:handshake: Contributing

We welcome contributions! If you encounter any bugs or have feature requests, please open an issue or submit a pull request.


:page_with_curl: License

This package is open-source and licensed under the MIT License.

Enjoy building with PERT Diagram! :relaxed: