summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorYuren Hao <97327730+YurenHao0426@users.noreply.github.com>2025-08-06 01:39:08 -0700
committerYuren Hao <97327730+YurenHao0426@users.noreply.github.com>2025-08-06 01:39:08 -0700
commit343978870774f81ecaa06d7f253020265f601fd2 (patch)
treedbb414f3b4e840c7c52d79fa4443ad87ad93056a /src/components
parent79ec5fd1f0188a88f937737185c542e644cf98e4 (diff)
feat: scaffold prereq graph project
Diffstat (limited to 'src/components')
-rw-r--r--src/components/Graph.tsx49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/components/Graph.tsx b/src/components/Graph.tsx
new file mode 100644
index 0000000..5e81b38
--- /dev/null
+++ b/src/components/Graph.tsx
@@ -0,0 +1,49 @@
+import CytoscapeComponent from "react-cytoscapejs";
+import cytoscape from "cytoscape";
+import dagre from "cytoscape-dagre";
+import { useMemo } from "react";
+
+cytoscape.use(dagre);
+
+type Catalog = Record<string, string[]>;
+
+export default function Graph({ catalog }: { catalog: Catalog }) {
+ const elements = useMemo(() => {
+ const els: any[] = [];
+ Object.keys(catalog).forEach(id => {
+ els.push({ data: { id } });
+ catalog[id].forEach(p =>
+ els.push({
+ data: { id: `${p}->${id}`, source: p, target: id }
+ })
+ );
+ });
+ return els;
+ }, [catalog]);
+
+ return (
+ <CytoscapeComponent
+ elements={elements}
+ stylesheet={[
+ {
+ selector: "node",
+ style: {
+ "background-color": "#3182bd",
+ label: "data(id)",
+ color: "#fff"
+ }
+ },
+ {
+ selector: "edge",
+ style: {
+ width: 2,
+ "target-arrow-shape": "triangle",
+ "curve-style": "bezier"
+ }
+ }
+ ]}
+ layout={{ name: "dagre", rankDir: "TB", nodeSep: 30, rankSep: 50 }}
+ style={{ width: "100%", height: "90vh" }}
+ />
+ );
+}