@schlessera/brain-ui-react 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/graph/graph-canvas.d.ts +20 -0
- package/dist/components/graph/graph-canvas.d.ts.map +1 -0
- package/dist/components/graph/graph-canvas.js +310 -0
- package/dist/components/graph/graph-canvas.js.map +1 -0
- package/dist/components/graph/graph-controls.d.ts +8 -0
- package/dist/components/graph/graph-controls.d.ts.map +1 -0
- package/dist/components/graph/graph-controls.js +132 -0
- package/dist/components/graph/graph-controls.js.map +1 -0
- package/dist/components/graph/graph-empty-state.d.ts +15 -0
- package/dist/components/graph/graph-empty-state.d.ts.map +1 -0
- package/dist/components/graph/graph-empty-state.js +21 -0
- package/dist/components/graph/graph-empty-state.js.map +1 -0
- package/dist/components/graph/graph-page.d.ts +7 -0
- package/dist/components/graph/graph-page.d.ts.map +1 -0
- package/dist/components/graph/graph-page.js +400 -0
- package/dist/components/graph/graph-page.js.map +1 -0
- package/dist/components/graph/lib/graph-helpers.d.ts +90 -0
- package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -0
- package/dist/components/graph/lib/graph-helpers.js +217 -0
- package/dist/components/graph/lib/graph-helpers.js.map +1 -0
- package/dist/components/graph/node-popover.d.ts +11 -0
- package/dist/components/graph/node-popover.d.ts.map +1 -0
- package/dist/components/graph/node-popover.js +38 -0
- package/dist/components/graph/node-popover.js.map +1 -0
- package/dist/components/graph/use-graph-theme.d.ts +16 -0
- package/dist/components/graph/use-graph-theme.d.ts.map +1 -0
- package/dist/components/graph/use-graph-theme.js +36 -0
- package/dist/components/graph/use-graph-theme.js.map +1 -0
- package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
- package/dist/components/layout/mobile-tab-bar.js +16 -5
- package/dist/components/layout/mobile-tab-bar.js.map +1 -1
- package/dist/components/layout/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail.js +14 -4
- package/dist/components/layout/side-rail.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/stores/graph-store.d.ts +85 -0
- package/dist/stores/graph-store.d.ts.map +1 -0
- package/dist/stores/graph-store.js +236 -0
- package/dist/stores/graph-store.js.map +1 -0
- package/dist/stores/ui-store.d.ts +5 -0
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +2 -0
- package/dist/stores/ui-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/voice/asr-deepgram.d.ts.map +1 -1
- package/dist/voice/asr-deepgram.js +7 -2
- package/dist/voice/asr-deepgram.js.map +1 -1
- package/package.json +5 -2
- package/src/components/graph/graph-canvas.tsx +366 -0
- package/src/components/graph/graph-controls.tsx +436 -0
- package/src/components/graph/graph-empty-state.tsx +45 -0
- package/src/components/graph/graph-page.tsx +1045 -0
- package/src/components/graph/lib/graph-helpers.ts +288 -0
- package/src/components/graph/node-popover.tsx +124 -0
- package/src/components/graph/use-graph-theme.ts +46 -0
- package/src/components/layout/mobile-tab-bar.tsx +26 -3
- package/src/components/layout/side-rail.tsx +28 -4
- package/src/index.ts +3 -1
- package/src/stores/graph-store.ts +345 -0
- package/src/stores/ui-store.ts +8 -0
- package/src/voice/asr-deepgram.ts +7 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GraphEdgePayload, GraphNodePayload, GraphSubgraphResponse } from "@schlessera/brain-ui-sdk/protocol";
|
|
2
|
+
import { type SizeBy } from "./lib/graph-helpers.js";
|
|
3
|
+
export interface GraphCanvasProps {
|
|
4
|
+
data: GraphSubgraphResponse;
|
|
5
|
+
layout: "fixed" | "radial" | "force";
|
|
6
|
+
selectedId: number | null;
|
|
7
|
+
hoveredId: number | null;
|
|
8
|
+
matchIds: ReadonlySet<number>;
|
|
9
|
+
sizeBy?: SizeBy;
|
|
10
|
+
/** Radial mode: draw this many distance rings (with hop labels) under the graph. */
|
|
11
|
+
rings?: number;
|
|
12
|
+
/** Mode-specific node color (community, distance, …). */
|
|
13
|
+
nodeColor: (node: GraphNodePayload) => string;
|
|
14
|
+
/** Optional per-edge color override (e.g. backlinks into the local center). */
|
|
15
|
+
edgeColor?: (edge: GraphEdgePayload) => string | undefined;
|
|
16
|
+
onSelect: (id: number | null) => void;
|
|
17
|
+
onHover: (id: number | null) => void;
|
|
18
|
+
}
|
|
19
|
+
export default function GraphCanvas({ data, layout, selectedId, hoveredId, matchIds, sizeBy, rings, nodeColor, edgeColor, onSelect, onHover, }: GraphCanvasProps): import("react").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=graph-canvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-canvas.d.ts","sourceRoot":"","sources":["../../../src/components/graph/graph-canvas.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,SAAS,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC9C,+EAA+E;IAC/E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACtC;AASD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,IAAI,EACJ,MAAM,EACN,UAAU,EACV,SAAS,EACT,QAAQ,EACR,MAAiB,EACjB,KAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,OAAO,GACR,EAAE,gBAAgB,+BA+SlB"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The rendering seam: this file is the ONLY module in the package that imports
|
|
4
|
+
* sigma or graphology. Everything it receives is renderer-agnostic (plain
|
|
5
|
+
* nodes/edges/positions + callbacks), so swapping the renderer later touches
|
|
6
|
+
* this file alone.
|
|
7
|
+
*
|
|
8
|
+
* Loaded via React.lazy from graph-page, so sigma lands in its own chunk and
|
|
9
|
+
* the main bundle stays untouched.
|
|
10
|
+
*/
|
|
11
|
+
import { useEffect, useRef } from "react";
|
|
12
|
+
import Graph from "graphology";
|
|
13
|
+
import Sigma from "sigma";
|
|
14
|
+
import forceAtlas2 from "graphology-layout-forceatlas2";
|
|
15
|
+
import { labelSet, nodeSize, radialLayout, } from "./lib/graph-helpers.js";
|
|
16
|
+
import { useGraphTheme } from "./use-graph-theme.js";
|
|
17
|
+
/** Force-layout budget: enough to settle an ego graph, cheap enough for a phone. */
|
|
18
|
+
function forceIterations(nodeCount) {
|
|
19
|
+
if (nodeCount <= 150)
|
|
20
|
+
return 300;
|
|
21
|
+
if (nodeCount <= 500)
|
|
22
|
+
return 150;
|
|
23
|
+
return 60;
|
|
24
|
+
}
|
|
25
|
+
export default function GraphCanvas({ data, layout, selectedId, hoveredId, matchIds, sizeBy = "degree", rings = 0, nodeColor, edgeColor, onSelect, onHover, }) {
|
|
26
|
+
const containerRef = useRef(null);
|
|
27
|
+
const ringCanvasRef = useRef(null);
|
|
28
|
+
const sigmaRef = useRef(null);
|
|
29
|
+
const theme = useGraphTheme();
|
|
30
|
+
const ringCount = layout === "radial" ? rings : 0;
|
|
31
|
+
// State the reducers read without re-instantiating sigma.
|
|
32
|
+
const interactionRef = useRef({
|
|
33
|
+
selectedId,
|
|
34
|
+
hoveredId,
|
|
35
|
+
matchIds,
|
|
36
|
+
forced: new Set(),
|
|
37
|
+
neighborsOfActive: new Set(),
|
|
38
|
+
});
|
|
39
|
+
// Latest callbacks for the event handlers registered once at mount.
|
|
40
|
+
const callbacksRef = useRef({ onSelect, onHover });
|
|
41
|
+
callbacksRef.current = { onSelect, onHover };
|
|
42
|
+
// Mount sigma once.
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const container = containerRef.current;
|
|
45
|
+
if (!container)
|
|
46
|
+
return;
|
|
47
|
+
const graph = new Graph({ type: "directed", multi: false });
|
|
48
|
+
const renderer = new Sigma(graph, container, {
|
|
49
|
+
allowInvalidContainer: true,
|
|
50
|
+
renderLabels: true,
|
|
51
|
+
labelFont: "Plus Jakarta Sans, system-ui, sans-serif",
|
|
52
|
+
labelSize: 11,
|
|
53
|
+
labelColor: { color: theme.label },
|
|
54
|
+
labelRenderedSizeThreshold: 7,
|
|
55
|
+
defaultEdgeType: "arrow",
|
|
56
|
+
minCameraRatio: 0.05,
|
|
57
|
+
maxCameraRatio: 6,
|
|
58
|
+
stagePadding: 40,
|
|
59
|
+
nodeReducer: (node, attrs) => {
|
|
60
|
+
const id = Number(node);
|
|
61
|
+
const s = interactionRef.current;
|
|
62
|
+
const active = s.hoveredId ?? s.selectedId;
|
|
63
|
+
const out = { ...attrs };
|
|
64
|
+
out.forceLabel = s.forced.has(id);
|
|
65
|
+
if (s.matchIds.size > 0 && s.matchIds.has(id)) {
|
|
66
|
+
out.color = theme.nodeSelected;
|
|
67
|
+
out.zIndex = 2;
|
|
68
|
+
}
|
|
69
|
+
if (id === s.selectedId || id === s.hoveredId) {
|
|
70
|
+
out.color = theme.nodeSelected;
|
|
71
|
+
out.highlighted = true;
|
|
72
|
+
out.zIndex = 3;
|
|
73
|
+
}
|
|
74
|
+
else if (active !== null && !s.neighborsOfActive.has(node)) {
|
|
75
|
+
// Fade everything not adjacent to the active node.
|
|
76
|
+
out.color = theme.edge;
|
|
77
|
+
out.label = undefined;
|
|
78
|
+
out.forceLabel = false;
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
},
|
|
82
|
+
edgeReducer: (edge, attrs) => {
|
|
83
|
+
const s = interactionRef.current;
|
|
84
|
+
const active = s.hoveredId ?? s.selectedId;
|
|
85
|
+
const out = { ...attrs };
|
|
86
|
+
if (active !== null) {
|
|
87
|
+
const g = sigmaRef.current?.getGraph();
|
|
88
|
+
if (g) {
|
|
89
|
+
const activeKey = String(active);
|
|
90
|
+
const touchesActive = g.source(edge) === activeKey || g.target(edge) === activeKey;
|
|
91
|
+
if (touchesActive) {
|
|
92
|
+
out.color = theme.edgeHighlight;
|
|
93
|
+
out.size = Math.max(attrs.size ?? 1, 1.5);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
out.hidden = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
renderer.on("clickNode", ({ node }) => callbacksRef.current.onSelect(Number(node)));
|
|
104
|
+
renderer.on("clickStage", () => callbacksRef.current.onSelect(null));
|
|
105
|
+
renderer.on("enterNode", ({ node }) => callbacksRef.current.onHover(Number(node)));
|
|
106
|
+
renderer.on("leaveNode", () => callbacksRef.current.onHover(null));
|
|
107
|
+
sigmaRef.current = renderer;
|
|
108
|
+
return () => {
|
|
109
|
+
renderer.kill();
|
|
110
|
+
sigmaRef.current = null;
|
|
111
|
+
};
|
|
112
|
+
// Theme is read once per mount (dark-only app).
|
|
113
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
114
|
+
}, []);
|
|
115
|
+
// (Re)build the graph when the scene changes.
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
const renderer = sigmaRef.current;
|
|
118
|
+
if (!renderer)
|
|
119
|
+
return;
|
|
120
|
+
const graph = renderer.getGraph();
|
|
121
|
+
// Keep positions of survivors so expansion merges don't reshuffle the scene.
|
|
122
|
+
const previous = new Map();
|
|
123
|
+
graph.forEachNode((node, attrs) => previous.set(node, { x: attrs.x, y: attrs.y }));
|
|
124
|
+
graph.clear();
|
|
125
|
+
const radial = layout === "radial" ? radialLayout(data.nodes) : null;
|
|
126
|
+
data.nodes.forEach((node, i) => {
|
|
127
|
+
let x;
|
|
128
|
+
let y;
|
|
129
|
+
if (layout === "fixed" && node.x !== undefined && node.y !== undefined) {
|
|
130
|
+
x = node.x;
|
|
131
|
+
y = node.y;
|
|
132
|
+
}
|
|
133
|
+
else if (radial) {
|
|
134
|
+
const p = radial.get(node.id);
|
|
135
|
+
x = p.x;
|
|
136
|
+
y = p.y;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const kept = previous.get(String(node.id));
|
|
140
|
+
if (kept) {
|
|
141
|
+
({ x, y } = kept);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Deterministic circle seed; FA2 takes it from here.
|
|
145
|
+
const angle = (2 * Math.PI * i) / data.nodes.length;
|
|
146
|
+
x = Math.cos(angle);
|
|
147
|
+
y = Math.sin(angle);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
graph.addNode(String(node.id), {
|
|
151
|
+
x,
|
|
152
|
+
y,
|
|
153
|
+
// Size and color are (re)applied by the restyle effect below; seeding
|
|
154
|
+
// them here just avoids a one-frame flash of defaults.
|
|
155
|
+
size: nodeSize(node, sizeBy),
|
|
156
|
+
color: nodeColor(node),
|
|
157
|
+
label: node.title || node.path,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
for (const edge of data.edges) {
|
|
161
|
+
const source = String(edge.source);
|
|
162
|
+
const target = String(edge.target);
|
|
163
|
+
if (!graph.hasNode(source) || !graph.hasNode(target))
|
|
164
|
+
continue;
|
|
165
|
+
if (graph.hasEdge(source, target))
|
|
166
|
+
continue;
|
|
167
|
+
graph.addEdge(source, target, {
|
|
168
|
+
color: edgeColor?.(edge) ?? theme.edge,
|
|
169
|
+
size: 1,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (layout === "force" && graph.order > 2) {
|
|
173
|
+
const settings = forceAtlas2.inferSettings(graph);
|
|
174
|
+
forceAtlas2.assign(graph, {
|
|
175
|
+
iterations: forceIterations(graph.order),
|
|
176
|
+
settings: { ...settings, barnesHutOptimize: graph.order > 300 },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
renderer.getCamera().animatedReset({ duration: 250 });
|
|
180
|
+
renderer.refresh();
|
|
181
|
+
// Styling props (nodeColor/edgeColor/sizeBy) are deliberately NOT deps:
|
|
182
|
+
// the restyle effect below reapplies them in place, so a display-only
|
|
183
|
+
// change never re-runs layout or resets the camera.
|
|
184
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
185
|
+
}, [data, layout]);
|
|
186
|
+
// Restyle in place when a display-only prop changes (color-by, size-by).
|
|
187
|
+
// Runs after every rebuild too, which is idempotent and keeps one source of
|
|
188
|
+
// truth for what the current colorFn/sizeBy say a node should look like.
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
const renderer = sigmaRef.current;
|
|
191
|
+
if (!renderer)
|
|
192
|
+
return;
|
|
193
|
+
const graph = renderer.getGraph();
|
|
194
|
+
for (const node of data.nodes) {
|
|
195
|
+
const key = String(node.id);
|
|
196
|
+
if (!graph.hasNode(key))
|
|
197
|
+
continue;
|
|
198
|
+
graph.setNodeAttribute(key, "color", nodeColor(node));
|
|
199
|
+
graph.setNodeAttribute(key, "size", nodeSize(node, sizeBy));
|
|
200
|
+
}
|
|
201
|
+
for (const edge of data.edges) {
|
|
202
|
+
const source = String(edge.source);
|
|
203
|
+
const target = String(edge.target);
|
|
204
|
+
if (!graph.hasEdge(source, target))
|
|
205
|
+
continue;
|
|
206
|
+
graph.setEdgeAttribute(source, target, "color", edgeColor?.(edge) ?? theme.edge);
|
|
207
|
+
}
|
|
208
|
+
renderer.refresh({ skipIndexation: true });
|
|
209
|
+
}, [data, nodeColor, edgeColor, sizeBy, theme]);
|
|
210
|
+
// Interaction + label policy updates (no graph rebuild).
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
const renderer = sigmaRef.current;
|
|
213
|
+
if (!renderer)
|
|
214
|
+
return;
|
|
215
|
+
const state = interactionRef.current;
|
|
216
|
+
state.selectedId = selectedId;
|
|
217
|
+
state.hoveredId = hoveredId;
|
|
218
|
+
state.matchIds = matchIds;
|
|
219
|
+
const active = hoveredId ?? selectedId;
|
|
220
|
+
state.neighborsOfActive = new Set();
|
|
221
|
+
if (active !== null) {
|
|
222
|
+
const graph = renderer.getGraph();
|
|
223
|
+
const key = String(active);
|
|
224
|
+
if (graph.hasNode(key)) {
|
|
225
|
+
state.neighborsOfActive.add(key);
|
|
226
|
+
graph.forEachNeighbor(key, (n) => state.neighborsOfActive.add(n));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const recomputeLabels = () => {
|
|
230
|
+
state.forced = labelSet({
|
|
231
|
+
nodes: data.nodes,
|
|
232
|
+
selectedId,
|
|
233
|
+
hoveredId,
|
|
234
|
+
matchIds,
|
|
235
|
+
cameraRatio: renderer.getCamera().ratio,
|
|
236
|
+
});
|
|
237
|
+
renderer.refresh({ skipIndexation: true });
|
|
238
|
+
};
|
|
239
|
+
recomputeLabels();
|
|
240
|
+
// More labels as the user zooms in; throttled to one recompute per frame batch.
|
|
241
|
+
let pending = 0;
|
|
242
|
+
const onCameraUpdate = () => {
|
|
243
|
+
if (pending)
|
|
244
|
+
return;
|
|
245
|
+
pending = window.setTimeout(() => {
|
|
246
|
+
pending = 0;
|
|
247
|
+
recomputeLabels();
|
|
248
|
+
}, 150);
|
|
249
|
+
};
|
|
250
|
+
renderer.getCamera().on("updated", onCameraUpdate);
|
|
251
|
+
return () => {
|
|
252
|
+
renderer.getCamera().off("updated", onCameraUpdate);
|
|
253
|
+
if (pending)
|
|
254
|
+
window.clearTimeout(pending);
|
|
255
|
+
};
|
|
256
|
+
}, [data, selectedId, hoveredId, matchIds]);
|
|
257
|
+
// Distance rings under the radial layout — an underlay canvas redrawn in
|
|
258
|
+
// sync with sigma's camera (the sigma canvases are transparent, so it shows
|
|
259
|
+
// through).
|
|
260
|
+
useEffect(() => {
|
|
261
|
+
const renderer = sigmaRef.current;
|
|
262
|
+
const canvas = ringCanvasRef.current;
|
|
263
|
+
if (!renderer || !canvas || ringCount === 0)
|
|
264
|
+
return;
|
|
265
|
+
const draw = () => {
|
|
266
|
+
const dpr = window.devicePixelRatio || 1;
|
|
267
|
+
const { clientWidth, clientHeight } = canvas;
|
|
268
|
+
if (canvas.width !== clientWidth * dpr)
|
|
269
|
+
canvas.width = clientWidth * dpr;
|
|
270
|
+
if (canvas.height !== clientHeight * dpr)
|
|
271
|
+
canvas.height = clientHeight * dpr;
|
|
272
|
+
const ctx = canvas.getContext("2d");
|
|
273
|
+
if (!ctx)
|
|
274
|
+
return;
|
|
275
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
276
|
+
ctx.clearRect(0, 0, clientWidth, clientHeight);
|
|
277
|
+
const center = renderer.graphToViewport({ x: 0, y: 0 });
|
|
278
|
+
const edge = renderer.graphToViewport({ x: 1, y: 0 });
|
|
279
|
+
const unit = Math.hypot(edge.x - center.x, edge.y - center.y);
|
|
280
|
+
if (!Number.isFinite(unit) || unit <= 0)
|
|
281
|
+
return;
|
|
282
|
+
ctx.strokeStyle = theme.edge;
|
|
283
|
+
ctx.fillStyle = theme.labelMuted;
|
|
284
|
+
ctx.font = "10px Plus Jakarta Sans, system-ui, sans-serif";
|
|
285
|
+
ctx.textAlign = "center";
|
|
286
|
+
for (let d = 1; d <= ringCount; d++) {
|
|
287
|
+
const radius = unit * d;
|
|
288
|
+
ctx.globalAlpha = 0.5;
|
|
289
|
+
ctx.beginPath();
|
|
290
|
+
ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);
|
|
291
|
+
ctx.stroke();
|
|
292
|
+
// Hop label at the top of the ring, skipped once rings get dense.
|
|
293
|
+
if (unit > 28) {
|
|
294
|
+
ctx.globalAlpha = 0.9;
|
|
295
|
+
ctx.fillText(String(d), center.x, center.y - radius - 4);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
ctx.globalAlpha = 1;
|
|
299
|
+
};
|
|
300
|
+
draw();
|
|
301
|
+
renderer.on("afterRender", draw);
|
|
302
|
+
return () => {
|
|
303
|
+
renderer.off("afterRender", draw);
|
|
304
|
+
const ctx = canvas.getContext("2d");
|
|
305
|
+
ctx?.clearRect(0, 0, canvas.width, canvas.height);
|
|
306
|
+
};
|
|
307
|
+
}, [ringCount, theme, data]);
|
|
308
|
+
return (_jsxs("div", { "aria-hidden": "true", className: "absolute inset-0", children: [ringCount > 0 && (_jsx("canvas", { ref: ringCanvasRef, className: "pointer-events-none absolute inset-0 h-full w-full" })), _jsx("div", { ref: containerRef, className: "absolute inset-0 touch-none" })] }));
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=graph-canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-canvas.js","sourceRoot":"","sources":["../../../src/components/graph/graph-canvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-mode option forms. Desktop: a floating card in the top-right of the
|
|
3
|
+
* canvas. Mobile: a slide-up sheet behind a filter button (tap targets kept
|
|
4
|
+
* at ≥44px). Only the options that matter per mode — everything else stays
|
|
5
|
+
* out until a later phase earns it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function GraphControls(): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=graph-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-controls.d.ts","sourceRoot":"","sources":["../../../src/components/graph/graph-controls.tsx"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAgB,aAAa,gCA2C5B"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Loader2, Search, SlidersHorizontal, X } from "lucide-react";
|
|
4
|
+
import { api } from "../../lib/api-client.js";
|
|
5
|
+
import { useGraphStore, } from "../../stores/graph-store.js";
|
|
6
|
+
import { cn } from "../../lib/utils.js";
|
|
7
|
+
/**
|
|
8
|
+
* Per-mode option forms. Desktop: a floating card in the top-right of the
|
|
9
|
+
* canvas. Mobile: a slide-up sheet behind a filter button (tap targets kept
|
|
10
|
+
* at ≥44px). Only the options that matter per mode — everything else stays
|
|
11
|
+
* out until a later phase earns it.
|
|
12
|
+
*/
|
|
13
|
+
export function GraphControls() {
|
|
14
|
+
const [mobileOpen, setMobileOpen] = useState(false);
|
|
15
|
+
return (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => setMobileOpen(true), className: "absolute right-3 top-3 z-10 flex h-11 w-11 items-center justify-center rounded-full border border-border bg-surface-overlay text-foreground shadow-lg md:hidden", title: "Graph options", children: _jsx(SlidersHorizontal, { className: "h-4.5 w-4.5" }) }), _jsx("div", { className: "absolute right-4 top-4 z-10 hidden w-64 rounded-xl border border-border bg-surface-overlay/95 p-4 shadow-xl backdrop-blur md:block", children: _jsx(ControlsBody, {}) }), mobileOpen && (_jsxs("div", { className: "fixed inset-0 z-40 md:hidden", children: [_jsx("div", { className: "absolute inset-0 bg-background/60", onClick: () => setMobileOpen(false) }), _jsxs("div", { className: "absolute inset-x-0 bottom-0 max-h-[70dvh] overflow-y-auto rounded-t-2xl border-t border-border bg-surface p-5 pb-[calc(1.25rem+env(safe-area-inset-bottom))]", children: [_jsxs("div", { className: "mb-3 flex items-center justify-between", children: [_jsx("h3", { className: "text-sm font-medium text-foreground", children: "Graph options" }), _jsx("button", { onClick: () => setMobileOpen(false), className: "flex h-9 w-9 items-center justify-center rounded-lg text-muted-foreground hover:text-foreground", title: "Close", children: _jsx(X, { className: "h-4 w-4" }) })] }), _jsx(ControlsBody, {})] })] }))] }));
|
|
16
|
+
}
|
|
17
|
+
function ControlsBody() {
|
|
18
|
+
const mode = useGraphStore((s) => s.mode);
|
|
19
|
+
return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx(SceneSearch, {}), mode === "local" && _jsx(LocalControls, {}), mode === "discovery" && _jsx(DiscoveryControls, {}), mode === "clusters" && _jsx(ClustersControls, {}), mode === "maintenance" && _jsx(MaintenanceControls, {})] }));
|
|
20
|
+
}
|
|
21
|
+
/** Highlights matches in the current scene — no refetch. */
|
|
22
|
+
function SceneSearch() {
|
|
23
|
+
const sceneQuery = useGraphStore((s) => s.sceneQuery);
|
|
24
|
+
const setSceneQuery = useGraphStore((s) => s.setSceneQuery);
|
|
25
|
+
return (_jsxs("label", { className: "flex items-center gap-2 rounded-lg border border-border bg-surface-raised px-2.5 py-2 focus-within:border-primary/40", children: [_jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("input", { value: sceneQuery, onChange: (e) => setSceneQuery(e.target.value), placeholder: "Highlight in graph\u2026", className: "min-w-0 flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-muted-foreground", autoComplete: "off", spellCheck: false }), sceneQuery && (_jsx("button", { onClick: () => setSceneQuery(""), className: "shrink-0 text-muted-foreground hover:text-foreground", title: "Clear", children: _jsx(X, { className: "h-3 w-3" }) }))] }));
|
|
26
|
+
}
|
|
27
|
+
function LocalControls() {
|
|
28
|
+
const local = useGraphStore((s) => s.local);
|
|
29
|
+
const setLocalParams = useGraphStore((s) => s.setLocalParams);
|
|
30
|
+
return (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Center note", children: _jsx(NotePicker, { value: local.center, onPick: (path) => setLocalParams({ center: path }) }) }), _jsx(Field, { label: "Depth", children: _jsx(Segmented, { options: [
|
|
31
|
+
{ value: "1", label: "1" },
|
|
32
|
+
{ value: "2", label: "2" },
|
|
33
|
+
{ value: "3", label: "3" },
|
|
34
|
+
], value: String(local.depth), onChange: (v) => setLocalParams({ depth: Number(v) }) }) }), _jsx(Field, { label: "Direction", children: _jsx(Segmented, { options: [
|
|
35
|
+
{ value: "in", label: "In" },
|
|
36
|
+
{ value: "out", label: "Out" },
|
|
37
|
+
{ value: "both", label: "Both" },
|
|
38
|
+
], value: local.direction, onChange: (v) => setLocalParams({ direction: v }) }) })] }));
|
|
39
|
+
}
|
|
40
|
+
function DiscoveryControls() {
|
|
41
|
+
const discovery = useGraphStore((s) => s.discovery);
|
|
42
|
+
const setDiscoveryParams = useGraphStore((s) => s.setDiscoveryParams);
|
|
43
|
+
const colorBy = useGraphStore((s) => s.discoveryColorBy);
|
|
44
|
+
const setColorBy = useGraphStore((s) => s.setDiscoveryColorBy);
|
|
45
|
+
const defaultRoot = useGraphStore((s) => s.meta?.defaultRoot ?? null);
|
|
46
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Field, { label: "Root", children: [_jsx(NotePicker, { value: discovery.root ?? defaultRoot?.path ?? null, placeholder: defaultRoot ? defaultRoot.path : "Pick a root note…", onPick: (path) => setDiscoveryParams({ root: path }) }), discovery.root && defaultRoot && (_jsx("button", { onClick: () => setDiscoveryParams({ root: null }), className: "mt-1 text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline", children: "Reset to default root" }))] }), _jsx(Field, { label: `Max depth: ${discovery.maxDepth}`, children: _jsx("input", { type: "range", min: 1, max: 8, value: discovery.maxDepth, onChange: (e) => setDiscoveryParams({ maxDepth: Number(e.target.value) }), className: "w-full accent-(--color-primary)" }) }), _jsx(Field, { label: "Color by", children: _jsx(Segmented, { options: [
|
|
47
|
+
{ value: "distance", label: "Distance" },
|
|
48
|
+
{ value: "folder", label: "Folder" },
|
|
49
|
+
], value: colorBy, onChange: (v) => setColorBy(v) }) })] }));
|
|
50
|
+
}
|
|
51
|
+
function ClustersControls() {
|
|
52
|
+
const clusters = useGraphStore((s) => s.clusters);
|
|
53
|
+
const setClustersParams = useGraphStore((s) => s.setClustersParams);
|
|
54
|
+
const sizeBy = useGraphStore((s) => s.clustersSizeBy);
|
|
55
|
+
const setSizeBy = useGraphStore((s) => s.setClustersSizeBy);
|
|
56
|
+
return (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Node size", children: _jsx(Segmented, { options: [
|
|
57
|
+
{ value: "degree", label: "Links" },
|
|
58
|
+
{ value: "pagerank", label: "PageRank" },
|
|
59
|
+
], value: sizeBy, onChange: (v) => setSizeBy(v) }) }), _jsx(Field, { label: "Isolated notes", children: _jsx(Toggle, { checked: clusters.isolates, onChange: (v) => setClustersParams({ isolates: v }), label: "Include notes without links" }) })] }));
|
|
60
|
+
}
|
|
61
|
+
function MaintenanceControls() {
|
|
62
|
+
const maintenance = useGraphStore((s) => s.maintenance);
|
|
63
|
+
const setMaintenanceParams = useGraphStore((s) => s.setMaintenanceParams);
|
|
64
|
+
const filters = useGraphStore((s) => s.maintenanceFilters);
|
|
65
|
+
const setFilters = useGraphStore((s) => s.setMaintenanceFilters);
|
|
66
|
+
return (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Findings", children: _jsxs("div", { className: "flex flex-col", children: [_jsx(Toggle, { checked: filters.orphans, onChange: (v) => setFilters({ orphans: v }), label: "Orphans" }), _jsx(Toggle, { checked: filters.unreachable, onChange: (v) => setFilters({ unreachable: v }), label: "Unreachable" }), _jsx(Toggle, { checked: filters.broken, onChange: (v) => setFilters({ broken: v }), label: "Broken links" }), _jsx(Toggle, { checked: filters.stale, onChange: (v) => setFilters({ stale: v }), label: "Stale notes" })] }) }), _jsx(Field, { label: `Stale after ${maintenance.staleDays} days`, children: _jsx("input", { type: "range", min: 30, max: 720, step: 30, value: maintenance.staleDays, onChange: (e) => setMaintenanceParams({ staleDays: Number(e.target.value) }), className: "w-full accent-(--color-primary)" }) })] }));
|
|
67
|
+
}
|
|
68
|
+
// --- Small form primitives ---------------------------------------------------
|
|
69
|
+
function Field({ label, children }) {
|
|
70
|
+
return (_jsxs("div", { children: [_jsx("div", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: label }), children] }));
|
|
71
|
+
}
|
|
72
|
+
function Segmented({ options, value, onChange, }) {
|
|
73
|
+
return (_jsx("div", { className: "flex rounded-lg border border-border bg-surface-raised p-0.5", children: options.map((opt) => (_jsx("button", { onClick: () => onChange(opt.value), className: cn("min-h-9 flex-1 rounded-md px-2 py-1.5 text-xs font-medium transition-colors", value === opt.value
|
|
74
|
+
? "bg-surface-overlay text-foreground"
|
|
75
|
+
: "text-muted-foreground hover:text-foreground"), children: opt.label }, opt.value))) }));
|
|
76
|
+
}
|
|
77
|
+
function Toggle({ checked, onChange, label, }) {
|
|
78
|
+
return (_jsxs("button", { role: "switch", "aria-checked": checked, onClick: () => onChange(!checked), className: "flex min-h-9 w-full items-center justify-between gap-2 text-left text-xs text-foreground", children: [label, _jsx("span", { className: cn("relative h-5 w-9 shrink-0 rounded-full transition-colors", checked ? "bg-primary" : "bg-surface-raised border border-border"), children: _jsx("span", { className: cn("absolute top-0.5 h-4 w-4 rounded-full bg-foreground transition-transform", checked ? "translate-x-4" : "translate-x-0.5") }) })] }));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Debounced note search backed by /api/brain/search — the graph twin of the
|
|
82
|
+
* search modal's flow, inlined so picking a center/root never leaves the view.
|
|
83
|
+
*/
|
|
84
|
+
function NotePicker({ value, placeholder = "Search notes…", onPick, }) {
|
|
85
|
+
const [query, setQuery] = useState("");
|
|
86
|
+
const [editing, setEditing] = useState(false);
|
|
87
|
+
const [results, setResults] = useState([]);
|
|
88
|
+
const [loading, setLoading] = useState(false);
|
|
89
|
+
const controllerRef = useRef(null);
|
|
90
|
+
const trimmed = query.trim();
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!editing || trimmed.length < 2) {
|
|
93
|
+
controllerRef.current?.abort();
|
|
94
|
+
setResults([]);
|
|
95
|
+
setLoading(false);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const t = setTimeout(async () => {
|
|
99
|
+
controllerRef.current?.abort();
|
|
100
|
+
const controller = new AbortController();
|
|
101
|
+
controllerRef.current = controller;
|
|
102
|
+
setLoading(true);
|
|
103
|
+
try {
|
|
104
|
+
const res = await api.brainSearch(trimmed, {
|
|
105
|
+
limit: 8,
|
|
106
|
+
signal: controller.signal,
|
|
107
|
+
});
|
|
108
|
+
if (!controller.signal.aborted)
|
|
109
|
+
setResults(res.results);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Aborted or failed — the next keystroke retries.
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (!controller.signal.aborted)
|
|
116
|
+
setLoading(false);
|
|
117
|
+
}
|
|
118
|
+
}, 250);
|
|
119
|
+
return () => clearTimeout(t);
|
|
120
|
+
}, [editing, trimmed]);
|
|
121
|
+
return (_jsxs("div", { className: "relative", children: [_jsxs("label", { className: "flex items-center gap-2 rounded-lg border border-border bg-surface-raised px-2.5 py-2 focus-within:border-primary/40", children: [_jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("input", { value: editing ? query : (value ?? ""), onFocus: () => {
|
|
122
|
+
setEditing(true);
|
|
123
|
+
setQuery("");
|
|
124
|
+
}, onBlur: () => {
|
|
125
|
+
// Delay so a click on a result lands before the list unmounts.
|
|
126
|
+
setTimeout(() => setEditing(false), 150);
|
|
127
|
+
}, onChange: (e) => setQuery(e.target.value), placeholder: placeholder, className: "min-w-0 flex-1 bg-transparent font-mono text-[11px] text-foreground outline-none placeholder:font-body placeholder:text-xs placeholder:text-muted-foreground", autoComplete: "off", spellCheck: false }), loading && _jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-primary" })] }), editing && results.length > 0 && (_jsx("div", { className: "absolute inset-x-0 top-full z-20 mt-1 max-h-56 overflow-y-auto rounded-lg border border-border bg-surface-overlay shadow-2xl", children: results.map((hit) => (_jsxs("button", { onMouseDown: (e) => e.preventDefault(), onClick: () => {
|
|
128
|
+
onPick(hit.path);
|
|
129
|
+
setEditing(false);
|
|
130
|
+
}, className: "flex w-full flex-col px-3 py-2 text-left transition-colors hover:bg-surface-raised", children: [_jsx("span", { className: "truncate text-xs text-foreground", children: hit.title || hit.path }), _jsx("span", { className: "truncate font-mono text-[10px] text-muted-foreground/60", children: hit.path })] }, hit.path))) }))] }));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=graph-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-controls.js","sourceRoot":"","sources":["../../../src/components/graph/graph-controls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Full-canvas cards for the states where there is no scene to draw:
|
|
4
|
+
* server too old, repo indexed by a pre-graph CLI, graph not yet computed,
|
|
5
|
+
* plain fetch failures, and mode-specific "nothing here" messages.
|
|
6
|
+
*/
|
|
7
|
+
export declare function GraphEmptyState({ icon, title, children, }: {
|
|
8
|
+
icon?: "graph" | "sync" | "server" | "warn";
|
|
9
|
+
title: string;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
export declare function Mono({ children }: {
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=graph-empty-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-empty-state.d.ts","sourceRoot":"","sources":["../../../src/components/graph/graph-empty-state.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAc,EACd,KAAK,EACL,QAAQ,GACT,EAAE;IACD,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAoBA;AAED,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMzD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Waypoints, RefreshCw, ServerCrash, TriangleAlert } from "lucide-react";
|
|
3
|
+
/**
|
|
4
|
+
* Full-canvas cards for the states where there is no scene to draw:
|
|
5
|
+
* server too old, repo indexed by a pre-graph CLI, graph not yet computed,
|
|
6
|
+
* plain fetch failures, and mode-specific "nothing here" messages.
|
|
7
|
+
*/
|
|
8
|
+
export function GraphEmptyState({ icon = "graph", title, children, }) {
|
|
9
|
+
const Icon = icon === "sync"
|
|
10
|
+
? RefreshCw
|
|
11
|
+
: icon === "server"
|
|
12
|
+
? ServerCrash
|
|
13
|
+
: icon === "warn"
|
|
14
|
+
? TriangleAlert
|
|
15
|
+
: Waypoints;
|
|
16
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center p-6", children: _jsxs("div", { className: "flex max-w-sm flex-col items-center gap-3 rounded-xl border border-border bg-surface px-8 py-10 text-center", children: [_jsx(Icon, { className: "h-8 w-8 text-muted-foreground" }), _jsx("h2", { className: "font-display text-lg text-foreground", children: title }), children && (_jsx("div", { className: "text-xs leading-relaxed text-muted-foreground", children: children }))] }) }));
|
|
17
|
+
}
|
|
18
|
+
export function Mono({ children }) {
|
|
19
|
+
return (_jsx("code", { className: "rounded bg-surface-raised px-1.5 py-0.5 font-mono text-[11px] text-foreground", children: children }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=graph-empty-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-empty-state.js","sourceRoot":"","sources":["../../../src/components/graph/graph-empty-state.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,GAAG,OAAO,EACd,KAAK,EACL,QAAQ,GAKT;IACC,MAAM,IAAI,GACR,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,KAAK,QAAQ;YACjB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,KAAK,MAAM;gBACf,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,SAAS,CAAC;IACpB,OAAO,CACL,cAAK,SAAS,EAAC,6CAA6C,YAC1D,eAAK,SAAS,EAAC,6GAA6G,aAC1H,KAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAClD,aAAI,SAAS,EAAC,sCAAsC,YAAE,KAAK,GAAM,EAChE,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,+CAA+C,YAAE,QAAQ,GAAO,CAChF,IACG,GACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAA2B;IACxD,OAAO,CACL,eAAM,SAAS,EAAC,+EAA+E,YAC5F,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full-screen knowledge-graph view — a sibling of ChatPage inside the
|
|
3
|
+
* AppShell. Mounts its own FilePanel/SettingsPanel copies because the chat
|
|
4
|
+
* page (which normally hosts them) is hidden while this view is active.
|
|
5
|
+
*/
|
|
6
|
+
export declare function GraphPage(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=graph-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-page.d.ts","sourceRoot":"","sources":["../../../src/components/graph/graph-page.tsx"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,wBAAgB,SAAS,gCAsFxB"}
|