@principal-ai/principal-view-react 0.16.21 → 0.16.23
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/GraphRenderer.js.map +1 -1
- package/dist/components/session-events/SessionEventFeed.d.ts.map +1 -1
- package/dist/components/session-events/SessionEventFeed.js +10 -3
- package/dist/components/session-events/SessionEventFeed.js.map +1 -1
- package/dist/graphify/consolidated.d.ts +170 -0
- package/dist/graphify/consolidated.d.ts.map +1 -0
- package/dist/graphify/consolidated.js +11 -0
- package/dist/graphify/consolidated.js.map +1 -0
- package/dist/graphify/index.d.ts +9 -0
- package/dist/graphify/index.d.ts.map +1 -0
- package/dist/graphify/index.js +8 -0
- package/dist/graphify/index.js.map +1 -0
- package/dist/graphify/types.d.ts +141 -0
- package/dist/graphify/types.d.ts.map +1 -0
- package/dist/graphify/types.js +8 -0
- package/dist/graphify/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.d.ts +28 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.js +365 -0
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -0
- package/dist/subsystem/model.d.ts +131 -0
- package/dist/subsystem/model.d.ts.map +1 -0
- package/dist/subsystem/model.js +296 -0
- package/dist/subsystem/model.js.map +1 -0
- package/dist/subsystem/nodes.d.ts +28 -0
- package/dist/subsystem/nodes.d.ts.map +1 -0
- package/dist/subsystem/nodes.js +230 -0
- package/dist/subsystem/nodes.js.map +1 -0
- package/dist/utils/elkLayout.d.ts +19 -0
- package/dist/utils/elkLayout.d.ts.map +1 -1
- package/dist/utils/elkLayout.js +72 -9
- package/dist/utils/elkLayout.js.map +1 -1
- package/package.json +3 -3
- package/src/components/GraphRenderer.tsx +2 -2
- package/src/components/session-events/SessionEventFeed.tsx +20 -3
- package/src/graphify/consolidated.ts +202 -0
- package/src/graphify/index.ts +36 -0
- package/src/graphify/types.ts +164 -0
- package/src/index.ts +31 -0
- package/src/stories/SubsystemComponentGraph.stories.tsx +761 -0
- package/src/subsystem/SubsystemComponentGraph.tsx +585 -0
- package/src/subsystem/model.test.ts +81 -0
- package/src/subsystem/model.ts +434 -0
- package/src/subsystem/nodes.tsx +353 -0
- package/src/utils/elkLayout.ts +98 -9
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,uBAAuB,EAEvB,gBAAgB,GACjB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EACV,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACnG,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACvG,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,cAAc,EAEd,eAAe,EACf,SAAS,EACT,eAAe,EACf,eAAe,EAEf,cAAc,EACd,eAAe,EACf,aAAa,EAEb,UAAU,EACV,YAAY,EAEZ,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,YAAY,EAEV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,EAEnB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EAEjB,aAAa,EACb,SAAS,EACT,aAAa,EACb,iBAAiB,EAEjB,sBAAsB,EACtB,cAAc,EACd,UAAU,EACV,cAAc,EAEd,mBAAmB,EACnB,kBAAkB,EAElB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,qBAAqB,EACrB,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SubsystemComponentGraph — a clickable, read-only React Flow component graph
|
|
3
|
+
* for a subsystem snapshot.
|
|
4
|
+
*
|
|
5
|
+
* Nodes are positioned with ELK auto-layout (layered, minimized crossings) and
|
|
6
|
+
* colored by package. Only cross-package edges leave a package region. Clicking
|
|
7
|
+
* a component invokes `onSelect`. (Package frames are deferred — nodes are
|
|
8
|
+
* color-coded by package for now.)
|
|
9
|
+
*
|
|
10
|
+
* This is a focused fork of the package's `GraphRenderer` pipeline (same ELK
|
|
11
|
+
* edge routing, delayed fitView, Background/Controls/MiniMap, node/edge type
|
|
12
|
+
* injection, onNodeClick) adapted to the subsystem model — read-only.
|
|
13
|
+
*/
|
|
14
|
+
import { type SubsystemComponentEdge, type SubsystemComponent } from './model';
|
|
15
|
+
export interface SubsystemComponentGraphProps {
|
|
16
|
+
components: SubsystemComponent[];
|
|
17
|
+
edges: SubsystemComponentEdge[];
|
|
18
|
+
onSelect?: (componentId: string) => void;
|
|
19
|
+
/** Called when an edge is clicked (relationship / mechanism + refs seam). */
|
|
20
|
+
onEdgeSelect?: (edge: SubsystemComponentEdge) => void;
|
|
21
|
+
/** Upper bound for node width in px; nodes grow with content up to this,
|
|
22
|
+
* then the name wraps. Defaults to 300 for components (320 for packages). */
|
|
23
|
+
maxNodeWidth?: number;
|
|
24
|
+
/** Show edge labels (mechanism names) on the graph. @default true */
|
|
25
|
+
showEdgeLabels?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function SubsystemComponentGraph(props: SubsystemComponentGraphProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=SubsystemComponentGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubsystemComponentGraph.d.ts","sourceRoot":"","sources":["../../src/subsystem/SubsystemComponentGraph.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsBH,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EAExB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACtD;kFAC8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyeD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,2CAsC1E"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SubsystemComponentGraph — a clickable, read-only React Flow component graph
|
|
4
|
+
* for a subsystem snapshot.
|
|
5
|
+
*
|
|
6
|
+
* Nodes are positioned with ELK auto-layout (layered, minimized crossings) and
|
|
7
|
+
* colored by package. Only cross-package edges leave a package region. Clicking
|
|
8
|
+
* a component invokes `onSelect`. (Package frames are deferred — nodes are
|
|
9
|
+
* color-coded by package for now.)
|
|
10
|
+
*
|
|
11
|
+
* This is a focused fork of the package's `GraphRenderer` pipeline (same ELK
|
|
12
|
+
* edge routing, delayed fitView, Background/Controls/MiniMap, node/edge type
|
|
13
|
+
* injection, onNodeClick) adapted to the subsystem model — read-only.
|
|
14
|
+
*/
|
|
15
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
16
|
+
import { ReactFlow, ReactFlowProvider, Background, BackgroundVariant, Controls, useReactFlow, useViewport, applyNodeChanges, } from '@xyflow/react';
|
|
17
|
+
import { useTheme } from '@principal-ade/industry-theme';
|
|
18
|
+
import { buildSubsystemGraph, KIND_COLOR, MECHANISM_COLOR, deriveNameFromSymbol, } from './model';
|
|
19
|
+
import { SubsystemComponentNode, SubsystemEdge, SUBSYSTEM_CALLBACKS } from './nodes';
|
|
20
|
+
const nodeTypes = {
|
|
21
|
+
'subsystem-component': SubsystemComponentNode,
|
|
22
|
+
};
|
|
23
|
+
const edgeTypes = {
|
|
24
|
+
'subsystem-edge': SubsystemEdge,
|
|
25
|
+
};
|
|
26
|
+
function Inner({ components, edges, onSelect, onEdgeSelect, measured, maxNodeWidth, showEdgeLabels }) {
|
|
27
|
+
const { theme } = useTheme();
|
|
28
|
+
const { fitView } = useReactFlow();
|
|
29
|
+
const viewport = useViewport();
|
|
30
|
+
const [built, setBuilt] = useState({
|
|
31
|
+
nodes: [],
|
|
32
|
+
edges: [],
|
|
33
|
+
});
|
|
34
|
+
const [layoutReady, setLayoutReady] = useState(false);
|
|
35
|
+
const [selected, setSelected] = useState(null);
|
|
36
|
+
// Ref mirror of `selected` so the SUBSYSTEM_CALLBACKS click handler (a
|
|
37
|
+
// closure over the effect deps) can toggle without a stale value.
|
|
38
|
+
const selectedRef = useRef(null);
|
|
39
|
+
selectedRef.current = selected;
|
|
40
|
+
// Pass 1: build with estimated widths so React Flow can measure the DOM.
|
|
41
|
+
// The pane stays hidden until Pass 2 completes.
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
let alive = true;
|
|
44
|
+
pass2DoneRef.current = false;
|
|
45
|
+
measuredDimsRef.current = new Map();
|
|
46
|
+
prevMeasuredSigRef.current = '';
|
|
47
|
+
void buildSubsystemGraph({ components, edges }, { maxNodeWidth, showEdgeLabels }).then(({ nodes, edges: e }) => {
|
|
48
|
+
if (!alive)
|
|
49
|
+
return;
|
|
50
|
+
setBuilt({ nodes, edges: e });
|
|
51
|
+
setLayoutReady(false);
|
|
52
|
+
});
|
|
53
|
+
return () => { alive = false; };
|
|
54
|
+
}, [components, edges]);
|
|
55
|
+
// Track measured dimensions from React Flow's dimension changes.
|
|
56
|
+
// These arrive as { type: 'dimensions', id, dimensions } in onNodesChange.
|
|
57
|
+
const measuredDimsRef = useRef(new Map());
|
|
58
|
+
const pendingMeasuredRef = useRef(false);
|
|
59
|
+
// Pass 2: once every node has a measured dimension, re-run ELK.
|
|
60
|
+
const prevMeasuredSigRef = useRef('');
|
|
61
|
+
const pass2DoneRef = useRef(false);
|
|
62
|
+
const triggerPass2 = useCallback(() => {
|
|
63
|
+
if (pass2DoneRef.current)
|
|
64
|
+
return;
|
|
65
|
+
const dims = measuredDimsRef.current;
|
|
66
|
+
if (dims.size < built.nodes.length)
|
|
67
|
+
return;
|
|
68
|
+
const sig = built.nodes.map((n) => `${n.id}:${dims.get(n.id)?.width ?? '?'}`).join(',');
|
|
69
|
+
if (sig.includes('?:'))
|
|
70
|
+
return;
|
|
71
|
+
if (sig === prevMeasuredSigRef.current)
|
|
72
|
+
return;
|
|
73
|
+
prevMeasuredSigRef.current = sig;
|
|
74
|
+
pendingMeasuredRef.current = false;
|
|
75
|
+
pass2DoneRef.current = true;
|
|
76
|
+
const measuredWidths = new Map(built.nodes.map((n) => [n.id, dims.get(n.id).width]));
|
|
77
|
+
const measuredHeights = new Map(built.nodes.map((n) => [n.id, dims.get(n.id).height]));
|
|
78
|
+
let alive = true;
|
|
79
|
+
void buildSubsystemGraph({ components, edges }, { maxNodeWidth, showEdgeLabels, measuredWidths, measuredHeights }).then(({ nodes, edges: e }) => {
|
|
80
|
+
if (!alive)
|
|
81
|
+
return;
|
|
82
|
+
setBuilt({ nodes, edges: e });
|
|
83
|
+
setLayoutReady(true);
|
|
84
|
+
});
|
|
85
|
+
return () => { alive = false; };
|
|
86
|
+
}, [built.nodes, components, edges, maxNodeWidth, showEdgeLabels]);
|
|
87
|
+
// Node components call SUBSYSTEM_CALLBACKS.onSelect on click (their inner
|
|
88
|
+
// onClick stops React Flow propagation), so wire selection + width through it.
|
|
89
|
+
// Lookup from edge id → the authored SubsystemComponentEdge (for onEdgeSelect).
|
|
90
|
+
const edgeById = useMemo(() => new Map(edges.map((e) => [e.id, e])), [edges]);
|
|
91
|
+
// Shared edge-selection logic used by both React Flow's onEdgeClick and the
|
|
92
|
+
// clickable edge label (SUBSYSTEM_CALLBACKS.onEdgeSelect).
|
|
93
|
+
const selectEdge = useCallback((edgeId) => {
|
|
94
|
+
if (selectedEdgeIdRef.current === edgeId) {
|
|
95
|
+
setSelectedEdgeId(null);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const src = edgeById.get(edgeId);
|
|
99
|
+
setSelectedEdgeId(edgeId);
|
|
100
|
+
if (src)
|
|
101
|
+
onEdgeSelect?.(src);
|
|
102
|
+
}, [edgeById, onEdgeSelect]);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
SUBSYSTEM_CALLBACKS.onSelect = (id) => {
|
|
105
|
+
const comp = components.find((c) => c.id === id);
|
|
106
|
+
if (comp) {
|
|
107
|
+
// Clicking the already-selected node unselects it (toggle off).
|
|
108
|
+
if (selectedRef.current?.id === comp.id) {
|
|
109
|
+
setSelected(null);
|
|
110
|
+
setSelectedEdgeId(null);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
setSelected(comp);
|
|
114
|
+
setSelectedEdgeId(null);
|
|
115
|
+
onSelect?.(id);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
SUBSYSTEM_CALLBACKS.onEdgeSelect = selectEdge;
|
|
119
|
+
SUBSYSTEM_CALLBACKS.maxNodeWidth = maxNodeWidth;
|
|
120
|
+
return () => {
|
|
121
|
+
SUBSYSTEM_CALLBACKS.onSelect = undefined;
|
|
122
|
+
SUBSYSTEM_CALLBACKS.onEdgeSelect = undefined;
|
|
123
|
+
SUBSYSTEM_CALLBACKS.maxNodeWidth = undefined;
|
|
124
|
+
};
|
|
125
|
+
}, [components, onSelect, maxNodeWidth, selectEdge]);
|
|
126
|
+
const { nodes, edges: convertedEdges } = built;
|
|
127
|
+
const xyflowNodesBase = nodes;
|
|
128
|
+
const baseEdges = convertedEdges;
|
|
129
|
+
const baseNodesKey = useMemo(() => nodes.map((n) => n.id).sort().join(','), [nodes]);
|
|
130
|
+
const baseEdgesKey = useMemo(() => convertedEdges.map((e) => e.id).sort().join(','), [convertedEdges]);
|
|
131
|
+
// When an edge is selected, dim every other edge + its label to focus it.
|
|
132
|
+
const [selectedEdgeId, setSelectedEdgeId] = useState(null);
|
|
133
|
+
// Ref mirror so `selectEdge` (a useCallback over early deps) can toggle
|
|
134
|
+
// without a stale closure value.
|
|
135
|
+
const selectedEdgeIdRef = useRef(null);
|
|
136
|
+
selectedEdgeIdRef.current = selectedEdgeId;
|
|
137
|
+
const dispEdges = useMemo(() => {
|
|
138
|
+
if (!selectedEdgeId)
|
|
139
|
+
return baseEdges;
|
|
140
|
+
return baseEdges.map((e) => ({
|
|
141
|
+
...e,
|
|
142
|
+
data: {
|
|
143
|
+
...e.data,
|
|
144
|
+
dimmed: e.id !== selectedEdgeId,
|
|
145
|
+
},
|
|
146
|
+
}));
|
|
147
|
+
}, [baseEdges, selectedEdgeId]);
|
|
148
|
+
const onNodesChange = useCallback((changes) => {
|
|
149
|
+
// Capture dimension changes (React Flow's measurement callback).
|
|
150
|
+
for (const ch of changes) {
|
|
151
|
+
if (ch.type === 'dimensions' && ch.dimensions) {
|
|
152
|
+
measuredDimsRef.current.set(ch.id, ch.dimensions);
|
|
153
|
+
pendingMeasuredRef.current = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const result = applyNodeChanges(changes, xyflowNodesBase);
|
|
157
|
+
// After applying changes, check if we should trigger pass 2.
|
|
158
|
+
if (pendingMeasuredRef.current) {
|
|
159
|
+
// Use microtask so the state update from applyNodeChanges commits first.
|
|
160
|
+
queueMicrotask(() => triggerPass2());
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}, [xyflowNodesBase, triggerPass2]);
|
|
164
|
+
const onEdgesChange = useCallback((_changes) => dispEdges, [dispEdges]);
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
const t = setTimeout(() => {
|
|
167
|
+
fitView({ padding: 0.1, includeHiddenNodes: false, minZoom: 0.05, maxZoom: 2, duration: 200 });
|
|
168
|
+
}, 200);
|
|
169
|
+
return () => clearTimeout(t);
|
|
170
|
+
}, [baseNodesKey, baseEdgesKey, fitView]);
|
|
171
|
+
const onNodeClick = useCallback((_e, node) => {
|
|
172
|
+
const comp = node.data?.component;
|
|
173
|
+
setSelectedEdgeId(null);
|
|
174
|
+
if (node.type === 'subsystem-component' && comp) {
|
|
175
|
+
// Clicking the already-selected node unselects it (toggle off).
|
|
176
|
+
if (selected?.id === comp.id) {
|
|
177
|
+
setSelected(null);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
setSelected(comp);
|
|
181
|
+
if (comp.id)
|
|
182
|
+
onSelect?.(comp.id);
|
|
183
|
+
}
|
|
184
|
+
}, [onSelect, selected]);
|
|
185
|
+
// React Flow's edge click → the same shared selection logic as the label.
|
|
186
|
+
const onEdgeClick = useCallback((_e, edge) => {
|
|
187
|
+
selectEdge(edge.id);
|
|
188
|
+
}, [selectEdge]);
|
|
189
|
+
const onPaneClick = useCallback(() => {
|
|
190
|
+
setSelected(null);
|
|
191
|
+
setSelectedEdgeId(null);
|
|
192
|
+
}, []);
|
|
193
|
+
// Edge label data for the overlay (rendered OUTSIDE ReactFlow so the pane
|
|
194
|
+
// doesn't intercept pointer events). Uses ELK-computed label midpoints from
|
|
195
|
+
// the actual edge path (not node-center approximations).
|
|
196
|
+
const edgeLabels = useMemo(() => {
|
|
197
|
+
return dispEdges.map((e) => {
|
|
198
|
+
const d = e.data;
|
|
199
|
+
return {
|
|
200
|
+
id: e.id,
|
|
201
|
+
mechanism: d?.mechanism ?? 'imports',
|
|
202
|
+
dimmed: d?.dimmed === true,
|
|
203
|
+
midX: d?.labelX ?? 0,
|
|
204
|
+
midY: d?.labelY ?? 0,
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
}, [dispEdges]);
|
|
208
|
+
return (_jsxs("div", { style: { visibility: layoutReady ? 'visible' : 'hidden', width: '100%', height: '100%' }, children: [showEdgeLabels !== false && (_jsx("div", { style: {
|
|
209
|
+
position: 'absolute',
|
|
210
|
+
inset: 0,
|
|
211
|
+
overflow: 'hidden',
|
|
212
|
+
pointerEvents: 'none',
|
|
213
|
+
zIndex: 5,
|
|
214
|
+
}, children: edgeLabels.map((lbl) => {
|
|
215
|
+
const color = MECHANISM_COLOR[lbl.mechanism] ?? '#888';
|
|
216
|
+
const screenX = lbl.midX * viewport.zoom + viewport.x;
|
|
217
|
+
const screenY = lbl.midY * viewport.zoom + viewport.y;
|
|
218
|
+
return (_jsx("div", { "data-edge-label": lbl.id, onClick: (e) => {
|
|
219
|
+
e.stopPropagation();
|
|
220
|
+
selectEdge(lbl.id);
|
|
221
|
+
}, style: {
|
|
222
|
+
position: 'absolute',
|
|
223
|
+
left: screenX,
|
|
224
|
+
top: screenY,
|
|
225
|
+
fontSize: 10,
|
|
226
|
+
fontFamily: theme.fonts.monospace,
|
|
227
|
+
fontWeight: 500,
|
|
228
|
+
color,
|
|
229
|
+
background: 'rgba(21,21,21,0.9)',
|
|
230
|
+
border: `0.5px solid ${color}`,
|
|
231
|
+
borderRadius: 4,
|
|
232
|
+
padding: '1px 5px',
|
|
233
|
+
cursor: 'pointer',
|
|
234
|
+
pointerEvents: 'auto',
|
|
235
|
+
opacity: lbl.dimmed ? 0.15 : 1,
|
|
236
|
+
whiteSpace: 'nowrap',
|
|
237
|
+
}, children: lbl.mechanism }, lbl.id));
|
|
238
|
+
}) })), _jsxs(ReactFlow, { nodes: xyflowNodesBase, edges: dispEdges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, minZoom: 0.05, maxZoom: 4, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, proOptions: { hideAttribution: true }, nodesDraggable: false, elementsSelectable: true, selectNodesOnDrag: false, nodesConnectable: false, edgesReconnectable: false, onPaneClick: onPaneClick, panOnDrag: true, panOnScroll: true, zoomOnScroll: false, zoomOnPinch: true, zoomOnDoubleClick: false, style: {
|
|
239
|
+
width: measured ? measured.w : '100%',
|
|
240
|
+
height: measured ? measured.h : '100%',
|
|
241
|
+
flex: 1,
|
|
242
|
+
minHeight: 0,
|
|
243
|
+
background: theme.colors.background,
|
|
244
|
+
}, children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 16, size: 1 }), _jsx(Controls, { showZoom: true, showFitView: true, showInteractive: true })] }, `${baseNodesKey}-${baseEdgesKey}`), selected && _jsx(ComponentDetail, { component: selected })] }));
|
|
245
|
+
}
|
|
246
|
+
/** Detail panel for the selected component — the verifiable identity + sources
|
|
247
|
+
* moved off the canvas so nodes stay minimal. */
|
|
248
|
+
function ComponentDetail({ component }) {
|
|
249
|
+
const { theme } = useTheme();
|
|
250
|
+
const muted = theme.colors.textMuted ?? theme.colors.textSecondary;
|
|
251
|
+
const color = KIND_COLOR[component.kind] ?? '#888';
|
|
252
|
+
const displayName = deriveNameFromSymbol(component.symbol, component.kind, component.name, component.file);
|
|
253
|
+
const rows = [];
|
|
254
|
+
if (component.symbol)
|
|
255
|
+
rows.push(['Symbol', component.symbol]);
|
|
256
|
+
if (component.file)
|
|
257
|
+
rows.push(['File', component.file]);
|
|
258
|
+
if (component.purpose)
|
|
259
|
+
rows.push(['Purpose', component.purpose]);
|
|
260
|
+
rows.push(['PURL', component.purl]);
|
|
261
|
+
return (_jsxs("div", { style: {
|
|
262
|
+
borderTop: `1px solid ${theme.colors.border}`,
|
|
263
|
+
background: theme.colors.background,
|
|
264
|
+
padding: '10px 12px',
|
|
265
|
+
fontFamily: theme.fonts.body,
|
|
266
|
+
}, children: [_jsxs("div", { style: {
|
|
267
|
+
display: 'flex',
|
|
268
|
+
alignItems: 'center',
|
|
269
|
+
gap: 8,
|
|
270
|
+
fontSize: theme.fontSizes[1],
|
|
271
|
+
fontWeight: 600,
|
|
272
|
+
marginBottom: 6,
|
|
273
|
+
}, children: [_jsx("span", { style: { color }, children: displayName }), _jsx("span", { style: {
|
|
274
|
+
fontSize: theme.fontSizes[0] * 0.8,
|
|
275
|
+
fontFamily: theme.fonts.monospace,
|
|
276
|
+
textTransform: 'uppercase',
|
|
277
|
+
color,
|
|
278
|
+
}, children: component.kind })] }), rows.map(([k, v]) => (_jsxs("div", { style: { display: 'flex', gap: 8, fontSize: theme.fontSizes[0], lineHeight: 1.5 }, children: [_jsx("span", { style: {
|
|
279
|
+
width: 64,
|
|
280
|
+
flexShrink: 0,
|
|
281
|
+
color: muted,
|
|
282
|
+
fontFamily: theme.fonts.monospace,
|
|
283
|
+
textTransform: 'uppercase',
|
|
284
|
+
fontSize: theme.fontSizes[0] * 0.8,
|
|
285
|
+
}, children: k }), _jsx("span", { style: { color: theme.colors.text, fontFamily: theme.fonts.monospace }, children: v })] }, k))), component.detail && _jsx(GraphifyDetailSections, { detail: component.detail })] }));
|
|
286
|
+
}
|
|
287
|
+
/** Renders the graphify drill-down payload for a component. */
|
|
288
|
+
function GraphifyDetailSections({ detail }) {
|
|
289
|
+
const { theme } = useTheme();
|
|
290
|
+
const muted = theme.colors.textMuted ?? theme.colors.textSecondary;
|
|
291
|
+
const label = (k) => (_jsx("span", { style: {
|
|
292
|
+
width: 64,
|
|
293
|
+
flexShrink: 0,
|
|
294
|
+
color: muted,
|
|
295
|
+
fontFamily: theme.fonts.monospace,
|
|
296
|
+
textTransform: 'uppercase',
|
|
297
|
+
fontSize: theme.fontSizes[0] * 0.8,
|
|
298
|
+
}, children: k }));
|
|
299
|
+
const chip = (name, meta, key) => (_jsxs("span", { style: {
|
|
300
|
+
fontFamily: theme.fonts.monospace,
|
|
301
|
+
fontSize: theme.fontSizes[0],
|
|
302
|
+
color: theme.colors.text,
|
|
303
|
+
border: `1px solid ${theme.colors.border}`,
|
|
304
|
+
borderRadius: 4,
|
|
305
|
+
padding: '1px 6px',
|
|
306
|
+
marginRight: 6,
|
|
307
|
+
marginBottom: 4,
|
|
308
|
+
display: 'inline-block',
|
|
309
|
+
}, children: [name, meta ? _jsxs("span", { style: { color: muted }, children: [" ", meta] }) : ''] }, key));
|
|
310
|
+
const row = (k, children) => (_jsxs("div", { style: { display: 'flex', gap: 8, fontSize: theme.fontSizes[0], lineHeight: 1.5, marginBottom: 4 }, children: [label(k), _jsx("div", { style: { minWidth: 0 }, children: children })] }));
|
|
311
|
+
switch (detail.kind) {
|
|
312
|
+
case 'class':
|
|
313
|
+
return (_jsxs(_Fragment, { children: [detail.methods.length > 0 &&
|
|
314
|
+
row('methods', detail.methods.map((m, i) => chip(m.name, m.returnType, i))), detail.properties.length > 0 &&
|
|
315
|
+
row('props', detail.properties.map((p, i) => chip(p.name, p.type, i))), detail.extends.length > 0 && row('extends', detail.extends.map((e, i) => chip(e, undefined, i))), detail.implements.length > 0 && row('impl', detail.implements.map((e, i) => chip(e, undefined, i))), detail.instantiations.length > 0 &&
|
|
316
|
+
row('insts', detail.instantiations.map((i, idx) => chip(i.name, undefined, idx))), detail.references.length > 0 &&
|
|
317
|
+
row('refs', detail.references.map((r, idx) => chip(r.name, undefined, idx)))] }));
|
|
318
|
+
case 'function':
|
|
319
|
+
return (_jsxs(_Fragment, { children: [detail.parameters.length > 0 &&
|
|
320
|
+
row('params', detail.parameters.map((p, i) => chip(p.type, undefined, i))), detail.returnType && row('return', _jsx("span", { children: detail.returnType })), detail.callers.length > 0 &&
|
|
321
|
+
row('callers', detail.callers.map((c, i) => chip(c.name, undefined, i))), detail.callees.length > 0 &&
|
|
322
|
+
row('callees', detail.callees.map((c, i) => chip(c.name, undefined, i)))] }));
|
|
323
|
+
case 'type':
|
|
324
|
+
return (_jsxs(_Fragment, { children: [detail.properties.length > 0 &&
|
|
325
|
+
row('props', detail.properties.map((p, i) => chip(p.name, p.type, i))), detail.usedBy.length > 0 &&
|
|
326
|
+
row('used by', detail.usedBy.map((u, i) => chip(u.name, undefined, i))), detail.implementors.length > 0 &&
|
|
327
|
+
row('impl', detail.implementors.map((e, i) => chip(e, undefined, i)))] }));
|
|
328
|
+
case 'module':
|
|
329
|
+
return (_jsxs(_Fragment, { children: [detail.exports.length > 0 &&
|
|
330
|
+
row('exports', detail.exports.map((e, i) => chip(e, undefined, i))), detail.imports.length > 0 &&
|
|
331
|
+
row('imports', detail.imports.map((i, idx) => chip(i.name, undefined, idx))), detail.symbols.length > 0 &&
|
|
332
|
+
row('symbols', detail.symbols.map((s, i) => chip(s, undefined, i)))] }));
|
|
333
|
+
case 'external':
|
|
334
|
+
return row('source', _jsx("span", { children: detail.label }));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
export function SubsystemComponentGraph(props) {
|
|
338
|
+
const wrapRef = useRef(null);
|
|
339
|
+
const [size, setSize] = useState(null);
|
|
340
|
+
// Measure the container so React Flow always has a real, non-zero pixel size
|
|
341
|
+
// (responsive to the parent; avoids the %→0 blank canvas).
|
|
342
|
+
useEffect(() => {
|
|
343
|
+
const el = wrapRef.current;
|
|
344
|
+
if (!el)
|
|
345
|
+
return;
|
|
346
|
+
const update = () => {
|
|
347
|
+
const rect = el.getBoundingClientRect();
|
|
348
|
+
if (rect.width > 0 && rect.height > 0)
|
|
349
|
+
setSize({ w: rect.width, h: rect.height });
|
|
350
|
+
};
|
|
351
|
+
update();
|
|
352
|
+
const ro = new ResizeObserver(update);
|
|
353
|
+
ro.observe(el);
|
|
354
|
+
return () => ro.disconnect();
|
|
355
|
+
}, []);
|
|
356
|
+
return (_jsx("div", { ref: wrapRef, style: {
|
|
357
|
+
position: 'relative',
|
|
358
|
+
width: '100%',
|
|
359
|
+
height: '100%',
|
|
360
|
+
minHeight: 0,
|
|
361
|
+
display: 'flex',
|
|
362
|
+
flexDirection: 'column',
|
|
363
|
+
}, children: _jsx("div", { style: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }, children: _jsx(ReactFlowProvider, { children: _jsx(Inner, { ...props, measured: size }) }) }) }));
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=SubsystemComponentGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubsystemComponentGraph.js","sourceRoot":"","sources":["../../src/subsystem/SubsystemComponentGraph.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subsystem component-graph data model + converters.
|
|
3
|
+
*
|
|
4
|
+
* A subsystem snapshot (see the "Subsystem artifact: facets" topic) is captured
|
|
5
|
+
* as component nodes (kind-tagged source units), file refs, integration edges,
|
|
6
|
+
* and entry points. This module defines the minimal document shape for the
|
|
7
|
+
* *graph* facet and converts it to React Flow nodes/edges — packages render as
|
|
8
|
+
* subgraphs, only cross-package edges leave the box, and shared seams
|
|
9
|
+
* (registries/barrels/facades) are edge targets, never member nodes.
|
|
10
|
+
*
|
|
11
|
+
* Self-contained in this package (not yet promoted to `@principal-ai/core`), so
|
|
12
|
+
* we can iterate on the UI + story without publishing a dependency.
|
|
13
|
+
*/
|
|
14
|
+
import { type Edge, type Node } from '@xyflow/react';
|
|
15
|
+
import type { GraphifyComponentDetail } from '../graphify';
|
|
16
|
+
export type SubsystemComponentKind = 'class' | 'module' | 'script' | 'registry' | 'service' | 'consumer' | 'function' | 'method' | 'type' | 'package';
|
|
17
|
+
export type SubsystemEdgeMechanism = 'imports' | 'imports_from' | 're_exports' | 'defines' | 'calls' | 'extends' | 'inherits' | 'implements' | 'mixes_in' | 'uses' | 'method' | 'references' | 'contains' | 'feeds' | 'produces' | 'registers-into';
|
|
18
|
+
/** A component node — the named unit, kind-tagged; `file` is its location. */
|
|
19
|
+
export interface SubsystemComponent {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
kind: SubsystemComponentKind;
|
|
23
|
+
/** Source location the component lives in (repo-root-relative path). */
|
|
24
|
+
file: string;
|
|
25
|
+
/** PURL identifying the repo or package this component lives in (for subgraph grouping). */
|
|
26
|
+
purl: string;
|
|
27
|
+
/** One-line purpose shown on the node. */
|
|
28
|
+
purpose?: string;
|
|
29
|
+
/** A symbol this component exposes / is (the node's identity). */
|
|
30
|
+
symbol?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Semantic layer/phase for the layout (e.g. `1` = input, `2` = processing,
|
|
33
|
+
* `3` = output). When set, ELK places the component in this layer so the
|
|
34
|
+
* graph reads as a left-to-right pipeline and *conveys the idea* rather than
|
|
35
|
+
* letting ELK guess the order.
|
|
36
|
+
*/
|
|
37
|
+
layer?: number;
|
|
38
|
+
/**
|
|
39
|
+
* How this session *occupied* the component — `edited` (modified it) vs
|
|
40
|
+
* `analyzed` (read deeply / built an understanding) vs `referenced`
|
|
41
|
+
* (touched in passing). Drives clustering: edits strengthen a subsystem,
|
|
42
|
+
* but a read-only investigation can still form one around an analyzed seam.
|
|
43
|
+
*/
|
|
44
|
+
capture?: 'edited' | 'analyzed' | 'referenced';
|
|
45
|
+
/**
|
|
46
|
+
* Graphify drill-down detail for this component, when the facet is anchored
|
|
47
|
+
* to a graphify node. Discriminated by kind (class/function/type/module/
|
|
48
|
+
* external); rendered in the detail panel on click.
|
|
49
|
+
*/
|
|
50
|
+
detail?: GraphifyComponentDetail;
|
|
51
|
+
}
|
|
52
|
+
/** A cross-component edge in the subsystem graph. */
|
|
53
|
+
export interface SubsystemComponentEdge {
|
|
54
|
+
id: string;
|
|
55
|
+
from: string;
|
|
56
|
+
to: string;
|
|
57
|
+
mechanism: SubsystemEdgeMechanism;
|
|
58
|
+
/** Concrete file/symbol refs backing the edge (the seam). */
|
|
59
|
+
refs?: string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Derive a consistent display `name` from a code `symbol` + kind.
|
|
63
|
+
*
|
|
64
|
+
* `symbol` is the source of truth (fully-qualified code identity). For most
|
|
65
|
+
* kinds the name is the symbol itself or its last dotted segment:
|
|
66
|
+
* - class/type/module/function/script/... symbol → symbol (e.g. `SessionReader`)
|
|
67
|
+
* - method `Owner.method` → last segment (e.g. `SessionReader.normalize` → `normalize`)
|
|
68
|
+
* - module, no symbol → basename of `file` (e.g. `transcript.ts` → `transcript`) —
|
|
69
|
+
* a common-sense convention for whole-file modules, not a real TS name
|
|
70
|
+
* - otherwise no symbol → fall back to an existing name
|
|
71
|
+
*/
|
|
72
|
+
export declare function deriveNameFromSymbol(symbol: string | undefined, kind: SubsystemComponentKind, existingName?: string, file?: string): string;
|
|
73
|
+
export interface SubsystemGraphDocument {
|
|
74
|
+
components: SubsystemComponent[];
|
|
75
|
+
edges: SubsystemComponentEdge[];
|
|
76
|
+
}
|
|
77
|
+
export type SubsystemGraphNodeType = 'subsystem-component' | 'subsystem-group';
|
|
78
|
+
export interface SubsystemGraphNodeData extends Record<string, unknown> {
|
|
79
|
+
component: SubsystemComponent;
|
|
80
|
+
}
|
|
81
|
+
export type SubsystemGraphNode = Node<SubsystemGraphNodeData, SubsystemGraphNodeType>;
|
|
82
|
+
export interface SubsystemGraphEdgeData extends Record<string, unknown> {
|
|
83
|
+
mechanism: SubsystemEdgeMechanism;
|
|
84
|
+
refs?: string[];
|
|
85
|
+
/** True while another edge is selected — render this edge (and its label)
|
|
86
|
+
* dimmed to focus the selected relationship. */
|
|
87
|
+
dimmed?: boolean;
|
|
88
|
+
/** ELK-computed label midpoint (from the actual edge path, not node centers). */
|
|
89
|
+
labelX?: number;
|
|
90
|
+
labelY?: number;
|
|
91
|
+
/** ELK-computed SVG edge path (overrides React Flow's default path). */
|
|
92
|
+
elkPath?: string;
|
|
93
|
+
}
|
|
94
|
+
export type SubsystemGraphEdge = Edge<SubsystemGraphEdgeData>;
|
|
95
|
+
export declare const MECHANISM_COLOR: Record<SubsystemEdgeMechanism, string>;
|
|
96
|
+
/** Package color palette (derived deterministically from the package name). */
|
|
97
|
+
export declare function packageColor(name: string): string;
|
|
98
|
+
/** Color per component kind — the informative signal (rather than package). */
|
|
99
|
+
export declare const KIND_COLOR: Record<SubsystemComponentKind, string>;
|
|
100
|
+
/**
|
|
101
|
+
* Convert a subsystem graph document into React Flow nodes. We render **flat**
|
|
102
|
+
* (no React Flow parent/group nodes) for robustness: package regions are laid
|
|
103
|
+
* out in a grid and each component carries its package + a `pkgBounds`
|
|
104
|
+
* rectangle on its node data so the group wrapper (drawn by the graph
|
|
105
|
+
* component) can frame it. Only components' real positions matter to React
|
|
106
|
+
* Flow; the package boundary is a visual region, not a sub-flow node.
|
|
107
|
+
*/
|
|
108
|
+
export declare function convertSubsystemToNodes(doc: SubsystemGraphDocument, opts?: {
|
|
109
|
+
maxNodeWidth?: number;
|
|
110
|
+
}): SubsystemGraphNode[];
|
|
111
|
+
/**
|
|
112
|
+
* Convert a subsystem graph document into React Flow edges. Edges whose target
|
|
113
|
+
* is an external label (not a component id) point at a synthetic stub so the
|
|
114
|
+
* relationship is visible without a member node.
|
|
115
|
+
*/
|
|
116
|
+
export declare function convertSubsystemToEdges(doc: SubsystemGraphDocument): SubsystemGraphEdge[];
|
|
117
|
+
/**
|
|
118
|
+
* Build the full React Flow graph (nodes + edges) using **ELK auto-layout** to
|
|
119
|
+
* position every node (including external stub targets), so the graph is
|
|
120
|
+
* layered with minimized crossings.
|
|
121
|
+
*/
|
|
122
|
+
export declare function buildSubsystemGraph(doc: SubsystemGraphDocument, opts?: {
|
|
123
|
+
maxNodeWidth?: number;
|
|
124
|
+
showEdgeLabels?: boolean;
|
|
125
|
+
measuredWidths?: Map<string, number>;
|
|
126
|
+
measuredHeights?: Map<string, number>;
|
|
127
|
+
}): Promise<{
|
|
128
|
+
nodes: SubsystemGraphNode[];
|
|
129
|
+
edges: SubsystemGraphEdge[];
|
|
130
|
+
}>;
|
|
131
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/subsystem/model.ts"],"names":[],"mappings":"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"}
|