@principal-ai/subsystems-react 0.44.0 → 0.44.1

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.
@@ -22,17 +22,28 @@ export interface SubsystemTransitionStep {
22
22
  showEdgeLabels?: boolean;
23
23
  /** Explicit boundary frame colors (region key → hex); host override. */
24
24
  boundaryColors?: Record<string, string>;
25
+ /**
26
+ * Cycle this step's walkthrough hops: focus each step (dim non-participants,
27
+ * number the labels, frame the step). Typically only the walkthrough layer.
28
+ */
29
+ autoPlayWalkthroughs?: boolean;
30
+ /** Show the focused walkthrough's title chip (with step ticks). */
31
+ showWalkthroughTitle?: boolean;
25
32
  }
26
33
  export interface SubsystemModelTransitionProps {
27
34
  steps: SubsystemTransitionStep[];
28
35
  /** Which step is shown. Controlled by the host (its nav / timer). */
29
36
  activeIndex: number;
30
- /** Tween duration, ms. @default 750 */
37
+ /** Tween duration, ms. @default 950 */
31
38
  durationMs?: number;
32
39
  /** fitView padding for the viewport refit. @default 0.18 */
33
40
  fitPadding?: number;
34
41
  /** Called when a node is clicked. */
35
42
  onSelect?: (componentAlias: string) => void;
43
+ /** How an autoplayed walkthrough step reads. @default 'focus' */
44
+ walkthroughStepMode?: 'focus' | 'dim';
45
+ /** Dwell per walkthrough step while autoplaying, ms. @default 4000 */
46
+ walkthroughAutoPlayIntervalMs?: number;
36
47
  className?: string;
37
48
  style?: CSSProperties;
38
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SubsystemModelTransition.d.ts","sourceRoot":"","sources":["../../src/subsystem/SubsystemModelTransition.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA4D,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAarG,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EAML,KAAK,sBAAsB,EAC5B,MAAM,SAAS,CAAC;AAiBjB,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,oDAAoD;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAmTD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,+BAM5E"}
1
+ {"version":3,"file":"SubsystemModelTransition.d.ts","sourceRoot":"","sources":["../../src/subsystem/SubsystemModelTransition.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA4D,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAarG,OAAO,8BAA8B,CAAC;AAEtC,OAAO,EAOL,KAAK,sBAAsB,EAE5B,MAAM,SAAS,CAAC;AAiBjB,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,oDAAoD;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACtC,sEAAsE;IACtE,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAugBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,+BAM5E"}
@@ -15,7 +15,7 @@ import { useEffect, useMemo, useRef, useState } from 'react';
15
15
  import { Background, EdgeLabelRenderer, ReactFlow, ReactFlowProvider, useReactFlow, } from '@xyflow/react';
16
16
  import '@xyflow/react/dist/style.css';
17
17
  import { useTheme } from '@principal-ade/industry-theme';
18
- import { buildSubsystemGraph, edgeColor, MECHANISM_DESCRIPTIONS, } from './model';
18
+ import { buildSubsystemGraph, edgeColor, MECHANISM_DESCRIPTIONS, walkthroughStepGraphEdgeId, } from './model';
19
19
  import { hexWithAlpha, SubsystemCallbacksProvider, SubsystemComponentNode, SubsystemEdge, SubsystemGroupNode, } from './nodes';
20
20
  import { GRAPH_CANVAS_CLASS, GRAPH_NAV_PROPS, GraphChrome } from './graphChrome';
21
21
  import { EDGE_LABEL_CLOUD_EXTRA_TOP, EDGE_LABEL_CLOUD_PATH, EDGE_LABEL_FONT_SIZE, EDGE_LABEL_HEIGHT, EDGE_LABEL_WIDTH, } from '../utils/edgeLabel';
@@ -25,6 +25,9 @@ function TransitionEdge(props) {
25
25
  const data = props.data;
26
26
  const mechanism = data?.mechanism ?? 'uses';
27
27
  const color = edgeColor({ mechanism, provenance: data?.provenance });
28
+ const text = data?.stepNos?.length
29
+ ? `${data.stepNos.map((n) => `${n}:`).join(' ')} ${mechanism}`
30
+ : mechanism;
28
31
  const verifiable = data?.provenance === 'graphify' ||
29
32
  MECHANISM_DESCRIPTIONS.find(([m]) => m === mechanism)?.[2] !== false;
30
33
  const labelBg = theme.colors.backgroundSecondary ?? theme.colors.background;
@@ -40,6 +43,7 @@ function TransitionEdge(props) {
40
43
  boxSizing: 'border-box',
41
44
  padding: '7px 8px',
42
45
  pointerEvents: 'none',
46
+ opacity: data?.dimmed ? 0.15 : 1,
43
47
  }, children: [verifiable ? (_jsx("span", { "aria-hidden": true, style: {
44
48
  position: 'absolute',
45
49
  inset: 0,
@@ -58,7 +62,7 @@ function TransitionEdge(props) {
58
62
  fontFamily: theme.fonts.monospace,
59
63
  fontWeight: 500,
60
64
  color,
61
- }, children: mechanism })] }) }))] }));
65
+ }, children: text })] }) }))] }));
62
66
  }
63
67
  const nodeTypes = {
64
68
  'subsystem-component': SubsystemComponentNode,
@@ -93,15 +97,33 @@ function flatten(result, boundaryColors) {
93
97
  }
94
98
  return { rects, meta, order, edges: result.edges };
95
99
  }
96
- function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.18, onSelect, className, style, }) {
100
+ function TransitionInner({ steps, activeIndex, durationMs = 950, fitPadding = 0.18, onSelect, walkthroughStepMode = 'focus', walkthroughAutoPlayIntervalMs = 4000, className, style, }) {
97
101
  const { theme } = useTheme();
98
102
  const { fitBounds } = useReactFlow();
99
103
  const [layouts, setLayouts] = useState(null);
100
104
  const [display, setDisplay] = useState(new Map());
101
105
  const [settled, setSettled] = useState(false);
106
+ // React Flow can't fit until its pane has a real size; the first mount often
107
+ // reports 0, which clamped the initial fit (right-hand nodes cut off).
108
+ const [sized, setSized] = useState(false);
109
+ const wrapRef = useRef(null);
102
110
  const displayRef = useRef(display);
103
111
  displayRef.current = display;
104
112
  const rafRef = useRef(null);
113
+ useEffect(() => {
114
+ const el = wrapRef.current;
115
+ if (!el)
116
+ return;
117
+ const measure = () => {
118
+ const r = el.getBoundingClientRect();
119
+ if (r.width > 0 && r.height > 0)
120
+ setSized(true);
121
+ };
122
+ measure();
123
+ const ro = new ResizeObserver(measure);
124
+ ro.observe(el);
125
+ return () => ro.disconnect();
126
+ }, []);
105
127
  // Lay out every step whenever the steps prop changes (identity-keyed).
106
128
  useEffect(() => {
107
129
  let alive = true;
@@ -130,14 +152,6 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
130
152
  if (!step)
131
153
  return;
132
154
  setSettled(false);
133
- const rects = [...step.rects.values()];
134
- if (rects.length > 0) {
135
- const minX = Math.min(...rects.map((r) => r.x));
136
- const minY = Math.min(...rects.map((r) => r.y));
137
- const maxX = Math.max(...rects.map((r) => r.x + r.w));
138
- const maxY = Math.max(...rects.map((r) => r.y + r.h));
139
- fitBounds({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, { padding: fitPadding, duration: durationMs });
140
- }
141
155
  const start = new Map(displayRef.current);
142
156
  const ids = new Set([...start.keys(), ...step.rects.keys()]);
143
157
  const t0 = performance.now();
@@ -175,7 +189,24 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
175
189
  if (rafRef.current != null)
176
190
  cancelAnimationFrame(rafRef.current);
177
191
  };
178
- }, [layouts, activeIndex, durationMs, fitPadding, fitBounds]);
192
+ }, [layouts, activeIndex, durationMs]);
193
+ // Refit the viewport to the active step — once the pane is sized, and on every
194
+ // step change. Kept separate so the initial fit waits for a real pane size.
195
+ useEffect(() => {
196
+ if (!sized || !layouts)
197
+ return;
198
+ const step = layouts[activeIndex];
199
+ if (!step)
200
+ return;
201
+ const rects = [...step.rects.values()];
202
+ if (rects.length === 0)
203
+ return;
204
+ const minX = Math.min(...rects.map((r) => r.x));
205
+ const minY = Math.min(...rects.map((r) => r.y));
206
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
207
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
208
+ fitBounds({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, { padding: fitPadding, duration: durationMs });
209
+ }, [sized, layouts, activeIndex, fitPadding, durationMs, fitBounds]);
179
210
  const unionMeta = useMemo(() => {
180
211
  const m = new Map();
181
212
  for (const s of layouts ?? [])
@@ -185,6 +216,52 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
185
216
  return m;
186
217
  }, [layouts]);
187
218
  const activeLayout = layouts?.[activeIndex];
219
+ // Walkthrough step focus: cycle the active step's hops, dim non-participants,
220
+ // number the labels, and (in `focus` mode) frame the step.
221
+ const activeStepDef = steps[activeIndex];
222
+ const activeWalkthroughs = activeStepDef?.model.walkthroughs;
223
+ const autoPlaySteps = activeStepDef?.autoPlayWalkthroughs === true && (activeWalkthroughs?.length ?? 0) > 0;
224
+ const hopList = useMemo(() => {
225
+ const out = [];
226
+ for (const wt of (activeWalkthroughs ?? [])) {
227
+ wt.steps.forEach((s, i) => {
228
+ out.push({
229
+ edgeId: walkthroughStepGraphEdgeId(s),
230
+ from: s.from,
231
+ to: s.to,
232
+ stepNo: i + 1,
233
+ total: wt.steps.length,
234
+ walkthroughId: wt.id,
235
+ walkthroughTitle: wt.title,
236
+ });
237
+ });
238
+ }
239
+ return out;
240
+ }, [activeWalkthroughs]);
241
+ const [stepPointer, setStepPointer] = useState(0);
242
+ useEffect(() => {
243
+ setStepPointer(0);
244
+ }, [activeIndex, hopList.length]);
245
+ useEffect(() => {
246
+ if (!autoPlaySteps || hopList.length === 0)
247
+ return;
248
+ // Pointer 0 = whole flow (no step focus); 1..N = each hop, then wraps.
249
+ const t = window.setInterval(() => setStepPointer((p) => (p + 1) % (hopList.length + 1)), Math.max(600, walkthroughAutoPlayIntervalMs));
250
+ return () => window.clearInterval(t);
251
+ }, [autoPlaySteps, hopList.length, walkthroughAutoPlayIntervalMs]);
252
+ const focusedHop = autoPlaySteps && hopList.length > 0 && stepPointer > 0
253
+ ? hopList[(stepPointer - 1) % hopList.length]
254
+ : undefined;
255
+ const stepNoByEdge = useMemo(() => {
256
+ const m = new Map();
257
+ for (const h of hopList) {
258
+ const arr = m.get(h.edgeId) ?? [];
259
+ arr.push(h.stepNo);
260
+ m.set(h.edgeId, arr);
261
+ }
262
+ return m;
263
+ }, [hopList]);
264
+ const focusParticipants = useMemo(() => (focusedHop ? new Set([focusedHop.from, focusedHop.to]) : null), [focusedHop]);
188
265
  const nodes = useMemo(() => {
189
266
  const activeOrder = new Set(activeLayout?.order ?? []);
190
267
  const ids = [...display.entries()]
@@ -210,21 +287,116 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
210
287
  data: meta.data,
211
288
  draggable: false,
212
289
  selectable: false,
213
- style: { opacity: rect.o },
290
+ style: {
291
+ opacity: rect.o * (focusParticipants && !focusParticipants.has(id) ? 0.18 : 1),
292
+ },
214
293
  });
215
294
  }
216
295
  return out;
217
- }, [display, activeLayout, unionMeta]);
218
- const edges = useMemo(() => (settled ? activeLayout?.edges ?? [] : []), [settled, activeLayout]);
296
+ }, [display, activeLayout, unionMeta, focusParticipants]);
297
+ // Real graph edges once settled; step focus adds hop numbers and dims the
298
+ // non-focused hops.
299
+ const edges = useMemo(() => {
300
+ if (!settled)
301
+ return [];
302
+ const list = activeLayout?.edges ?? [];
303
+ const numbering = autoPlaySteps && hopList.length > 0;
304
+ if (!numbering && !focusedHop)
305
+ return list;
306
+ return list.map((e) => {
307
+ // Number every hop while autoplaying (whole view included); dim only the
308
+ // hops other than the focused one.
309
+ const stepNos = numbering ? stepNoByEdge.get(e.id) : undefined;
310
+ const dimmed = focusedHop ? e.id !== focusedHop.edgeId : false;
311
+ if (!stepNos && !dimmed)
312
+ return e;
313
+ return {
314
+ ...e,
315
+ data: { ...e.data, stepNos, dimmed },
316
+ };
317
+ });
318
+ }, [settled, activeLayout, focusedHop, stepNoByEdge, autoPlaySteps, hopList.length]);
319
+ // Camera: frame a focused hop's endpoints, or the whole graph during the
320
+ // "whole flow" phase.
321
+ useEffect(() => {
322
+ if (walkthroughStepMode !== 'focus' || !settled || !sized || !autoPlaySteps)
323
+ return;
324
+ if (!activeLayout)
325
+ return;
326
+ const rects = focusedHop
327
+ ? [focusedHop.from, focusedHop.to]
328
+ .map((id) => activeLayout.rects.get(id))
329
+ .filter((r) => !!r)
330
+ : [...activeLayout.rects.values()];
331
+ if (rects.length === 0)
332
+ return;
333
+ const minX = Math.min(...rects.map((r) => r.x));
334
+ const minY = Math.min(...rects.map((r) => r.y));
335
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
336
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
337
+ fitBounds({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, { padding: focusedHop ? 0.3 : fitPadding, duration: durationMs });
338
+ }, [
339
+ walkthroughStepMode,
340
+ focusedHop,
341
+ settled,
342
+ sized,
343
+ activeLayout,
344
+ durationMs,
345
+ fitBounds,
346
+ autoPlaySteps,
347
+ fitPadding,
348
+ ]);
219
349
  const callbacks = useMemo(() => (onSelect ? { onSelect } : {}), [onSelect]);
220
- return (_jsx("div", { className: className, style: {
350
+ return (_jsxs("div", { ref: wrapRef, className: className, style: {
221
351
  position: 'relative',
222
352
  width: '100%',
223
353
  height: '100%',
224
354
  minHeight: 0,
225
355
  background: theme.colors.background,
226
356
  ...style,
227
- }, children: !layouts ? null : (_jsx(SubsystemCallbacksProvider, { value: callbacks, children: _jsxs(ReactFlow, { nodes: nodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, className: GRAPH_CANVAS_CLASS, ...GRAPH_NAV_PROPS, proOptions: { hideAttribution: true }, nodesDraggable: false, nodesConnectable: false, style: { width: '100%', height: '100%', background: theme.colors.background }, children: [_jsx(Background, {}), _jsx(GraphChrome, {})] }) })) }));
357
+ }, children: [!layouts ? null : (_jsx(SubsystemCallbacksProvider, { value: callbacks, children: _jsxs(ReactFlow, { nodes: nodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, className: GRAPH_CANVAS_CLASS, ...GRAPH_NAV_PROPS, proOptions: { hideAttribution: true }, nodesDraggable: false, nodesConnectable: false, style: { width: '100%', height: '100%', background: theme.colors.background }, children: [_jsx(Background, {}), _jsx(GraphChrome, {})] }) })), activeStepDef?.showWalkthroughTitle && focusedHop && (_jsxs("div", { "aria-label": `${focusedHop.walkthroughTitle}, step ${focusedHop.stepNo} of ${focusedHop.total}`, style: {
358
+ position: 'absolute',
359
+ top: 12,
360
+ left: '50%',
361
+ transform: 'translateX(-50%)',
362
+ minWidth: 160,
363
+ maxWidth: '60%',
364
+ display: 'flex',
365
+ flexDirection: 'column',
366
+ background: theme.colors.backgroundSecondary ?? theme.colors.background,
367
+ border: `1px solid ${theme.colors.border}`,
368
+ borderRadius: 6,
369
+ boxShadow: '0 1px 4px rgba(0,0,0,0.25)',
370
+ overflow: 'hidden',
371
+ opacity: 0.95,
372
+ pointerEvents: 'none',
373
+ zIndex: 10,
374
+ }, children: [_jsx("div", { style: {
375
+ padding: '5px 14px',
376
+ fontSize: theme.fontSizes[2] ?? theme.fontSizes[1],
377
+ fontWeight: 600,
378
+ fontFamily: theme.fonts.monospace,
379
+ color: theme.colors.text,
380
+ overflow: 'hidden',
381
+ textOverflow: 'ellipsis',
382
+ whiteSpace: 'nowrap',
383
+ textAlign: 'center',
384
+ }, children: focusedHop.walkthroughTitle }), focusedHop.total > 0 && (_jsx("div", { style: { display: 'flex', gap: 3, padding: '0 6px 5px' }, "aria-hidden": "true", children: Array.from({ length: focusedHop.total }, (_, i) => {
385
+ const n = i + 1;
386
+ const active = n === focusedHop.stepNo;
387
+ const done = n < focusedHop.stepNo;
388
+ return (_jsx("span", { style: {
389
+ flex: 1,
390
+ height: 2,
391
+ borderRadius: 1,
392
+ background: active
393
+ ? (theme.colors.accent ?? theme.colors.primary ?? theme.colors.text)
394
+ : done
395
+ ? (theme.colors.textSecondary ?? theme.colors.text)
396
+ : (theme.colors.border ?? 'rgba(127,127,127,0.45)'),
397
+ opacity: active ? 1 : done ? 0.75 : 0.4,
398
+ } }, n));
399
+ }) }))] }))] }));
228
400
  }
229
401
  export function SubsystemModelTransition(props) {
230
402
  return (_jsx(ReactFlowProvider, { children: _jsx(TransitionInner, { ...props }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"SubsystemModelTransition.js","sourceRoot":"","sources":["../../src/subsystem/SubsystemModelTransition.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubsystemModelTransition.js","sourceRoot":"","sources":["../../src/subsystem/SubsystemModelTransition.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ai/subsystems-react",
3
- "version": "0.44.0",
3
+ "version": "0.44.1",
4
4
  "description": "React UI for Subsystem Models — graph, Pierre code views, and session-event feeds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -67,27 +67,50 @@ const STEPS: SubsystemTransitionStep[] = [
67
67
  moduleNesting: 'path',
68
68
  },
69
69
  {
70
- model: { title: 'Booking', components, walkthroughs },
70
+ // Dynamic topology = process framing only (no runtime edges).
71
+ model: { title: 'Booking', components },
71
72
  moduleNesting: 'path',
72
73
  },
73
74
  {
74
75
  model: { title: 'Booking', components, walkthroughs },
75
76
  moduleNesting: 'path',
77
+ autoPlayWalkthroughs: true,
78
+ showWalkthroughTitle: true,
76
79
  },
77
80
  ];
78
81
 
82
+ const STEP_MS = 4000;
83
+
84
+ /** Dwell long enough for an autoplaying step to cycle all its hops. */
85
+ function dwellFor(index: number): number {
86
+ const step = STEPS[index];
87
+ if (step?.autoPlayWalkthroughs) {
88
+ const hops = step.model.walkthroughs?.reduce((n, w) => n + w.steps.length, 0) ?? 0;
89
+ // Whole-flow phase + one tick per hop.
90
+ if (hops > 0) return (hops + 1) * STEP_MS;
91
+ }
92
+ return 3200;
93
+ }
94
+
79
95
  function Harness() {
80
96
  const [active, setActive] = useState(0);
81
97
  const steps = useMemo(() => STEPS, []);
82
98
 
83
99
  useEffect(() => {
84
- const t = window.setInterval(() => setActive((i) => (i + 1) % STEPS.length), 3600);
85
- return () => window.clearInterval(t);
86
- }, []);
100
+ const t = window.setTimeout(
101
+ () => setActive((i) => (i + 1) % STEPS.length),
102
+ dwellFor(active),
103
+ );
104
+ return () => window.clearTimeout(t);
105
+ }, [active]);
87
106
 
88
107
  return (
89
108
  <div style={{ position: 'relative', width: '100%', height: '100vh', background: defaultEditorTheme.colors.background }}>
90
- <SubsystemModelTransition steps={steps} activeIndex={active} />
109
+ <SubsystemModelTransition
110
+ steps={steps}
111
+ activeIndex={active}
112
+ walkthroughAutoPlayIntervalMs={STEP_MS}
113
+ />
91
114
  <div style={{ position: 'absolute', top: 12, left: 12, display: 'flex', gap: 8, zIndex: 10 }}>
92
115
  {LABELS.map((label, i) => (
93
116
  <button
@@ -30,9 +30,11 @@ import {
30
30
  buildSubsystemGraph,
31
31
  edgeColor,
32
32
  MECHANISM_DESCRIPTIONS,
33
+ walkthroughStepGraphEdgeId,
33
34
  type SubsystemEdgeProvenance,
34
35
  type SubsystemGraphNode,
35
36
  type SubsystemModelDocument,
37
+ type SubsystemWalkthrough,
36
38
  } from './model';
37
39
  import {
38
40
  hexWithAlpha,
@@ -59,18 +61,29 @@ export interface SubsystemTransitionStep {
59
61
  showEdgeLabels?: boolean;
60
62
  /** Explicit boundary frame colors (region key → hex); host override. */
61
63
  boundaryColors?: Record<string, string>;
64
+ /**
65
+ * Cycle this step's walkthrough hops: focus each step (dim non-participants,
66
+ * number the labels, frame the step). Typically only the walkthrough layer.
67
+ */
68
+ autoPlayWalkthroughs?: boolean;
69
+ /** Show the focused walkthrough's title chip (with step ticks). */
70
+ showWalkthroughTitle?: boolean;
62
71
  }
63
72
 
64
73
  export interface SubsystemModelTransitionProps {
65
74
  steps: SubsystemTransitionStep[];
66
75
  /** Which step is shown. Controlled by the host (its nav / timer). */
67
76
  activeIndex: number;
68
- /** Tween duration, ms. @default 750 */
77
+ /** Tween duration, ms. @default 950 */
69
78
  durationMs?: number;
70
79
  /** fitView padding for the viewport refit. @default 0.18 */
71
80
  fitPadding?: number;
72
81
  /** Called when a node is clicked. */
73
82
  onSelect?: (componentAlias: string) => void;
83
+ /** How an autoplayed walkthrough step reads. @default 'focus' */
84
+ walkthroughStepMode?: 'focus' | 'dim';
85
+ /** Dwell per walkthrough step while autoplaying, ms. @default 4000 */
86
+ walkthroughAutoPlayIntervalMs?: number;
74
87
  className?: string;
75
88
  style?: CSSProperties;
76
89
  }
@@ -79,10 +92,20 @@ export interface SubsystemModelTransitionProps {
79
92
  function TransitionEdge(props: EdgeProps) {
80
93
  const { theme } = useTheme();
81
94
  const data = props.data as
82
- | { mechanism?: string; provenance?: SubsystemEdgeProvenance; labelX?: number; labelY?: number }
95
+ | {
96
+ mechanism?: string;
97
+ provenance?: SubsystemEdgeProvenance;
98
+ labelX?: number;
99
+ labelY?: number;
100
+ stepNos?: number[];
101
+ dimmed?: boolean;
102
+ }
83
103
  | undefined;
84
104
  const mechanism = data?.mechanism ?? 'uses';
85
105
  const color = edgeColor({ mechanism, provenance: data?.provenance });
106
+ const text = data?.stepNos?.length
107
+ ? `${data.stepNos.map((n) => `${n}:`).join(' ')} ${mechanism}`
108
+ : mechanism;
86
109
  const verifiable =
87
110
  data?.provenance === 'graphify' ||
88
111
  MECHANISM_DESCRIPTIONS.find(([m]) => m === mechanism)?.[2] !== false;
@@ -105,6 +128,7 @@ function TransitionEdge(props: EdgeProps) {
105
128
  boxSizing: 'border-box',
106
129
  padding: '7px 8px',
107
130
  pointerEvents: 'none',
131
+ opacity: data?.dimmed ? 0.15 : 1,
108
132
  }}
109
133
  >
110
134
  {verifiable ? (
@@ -150,7 +174,7 @@ function TransitionEdge(props: EdgeProps) {
150
174
  color,
151
175
  }}
152
176
  >
153
- {mechanism}
177
+ {text}
154
178
  </span>
155
179
  </div>
156
180
  </EdgeLabelRenderer>
@@ -210,9 +234,11 @@ function flatten(
210
234
  function TransitionInner({
211
235
  steps,
212
236
  activeIndex,
213
- durationMs = 750,
237
+ durationMs = 950,
214
238
  fitPadding = 0.18,
215
239
  onSelect,
240
+ walkthroughStepMode = 'focus',
241
+ walkthroughAutoPlayIntervalMs = 4000,
216
242
  className,
217
243
  style,
218
244
  }: SubsystemModelTransitionProps) {
@@ -221,10 +247,27 @@ function TransitionInner({
221
247
  const [layouts, setLayouts] = useState<StepLayout[] | null>(null);
222
248
  const [display, setDisplay] = useState<Map<string, Live>>(new Map());
223
249
  const [settled, setSettled] = useState(false);
250
+ // React Flow can't fit until its pane has a real size; the first mount often
251
+ // reports 0, which clamped the initial fit (right-hand nodes cut off).
252
+ const [sized, setSized] = useState(false);
253
+ const wrapRef = useRef<HTMLDivElement>(null);
224
254
  const displayRef = useRef(display);
225
255
  displayRef.current = display;
226
256
  const rafRef = useRef<number | null>(null);
227
257
 
258
+ useEffect(() => {
259
+ const el = wrapRef.current;
260
+ if (!el) return;
261
+ const measure = () => {
262
+ const r = el.getBoundingClientRect();
263
+ if (r.width > 0 && r.height > 0) setSized(true);
264
+ };
265
+ measure();
266
+ const ro = new ResizeObserver(measure);
267
+ ro.observe(el);
268
+ return () => ro.disconnect();
269
+ }, []);
270
+
228
271
  // Lay out every step whenever the steps prop changes (identity-keyed).
229
272
  useEffect(() => {
230
273
  let alive = true;
@@ -252,18 +295,6 @@ function TransitionInner({
252
295
  if (!step) return;
253
296
  setSettled(false);
254
297
 
255
- const rects = [...step.rects.values()];
256
- if (rects.length > 0) {
257
- const minX = Math.min(...rects.map((r) => r.x));
258
- const minY = Math.min(...rects.map((r) => r.y));
259
- const maxX = Math.max(...rects.map((r) => r.x + r.w));
260
- const maxY = Math.max(...rects.map((r) => r.y + r.h));
261
- fitBounds(
262
- { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
263
- { padding: fitPadding, duration: durationMs },
264
- );
265
- }
266
-
267
298
  const start = new Map(displayRef.current);
268
299
  const ids = new Set<string>([...start.keys(), ...step.rects.keys()]);
269
300
  const t0 = performance.now();
@@ -298,7 +329,25 @@ function TransitionInner({
298
329
  return () => {
299
330
  if (rafRef.current != null) cancelAnimationFrame(rafRef.current);
300
331
  };
301
- }, [layouts, activeIndex, durationMs, fitPadding, fitBounds]);
332
+ }, [layouts, activeIndex, durationMs]);
333
+
334
+ // Refit the viewport to the active step — once the pane is sized, and on every
335
+ // step change. Kept separate so the initial fit waits for a real pane size.
336
+ useEffect(() => {
337
+ if (!sized || !layouts) return;
338
+ const step = layouts[activeIndex];
339
+ if (!step) return;
340
+ const rects = [...step.rects.values()];
341
+ if (rects.length === 0) return;
342
+ const minX = Math.min(...rects.map((r) => r.x));
343
+ const minY = Math.min(...rects.map((r) => r.y));
344
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
345
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
346
+ fitBounds(
347
+ { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
348
+ { padding: fitPadding, duration: durationMs },
349
+ );
350
+ }, [sized, layouts, activeIndex, fitPadding, durationMs, fitBounds]);
302
351
 
303
352
  const unionMeta = useMemo(() => {
304
353
  const m = new Map<string, StepMeta>();
@@ -308,6 +357,68 @@ function TransitionInner({
308
357
 
309
358
  const activeLayout = layouts?.[activeIndex];
310
359
 
360
+ // Walkthrough step focus: cycle the active step's hops, dim non-participants,
361
+ // number the labels, and (in `focus` mode) frame the step.
362
+ const activeStepDef = steps[activeIndex];
363
+ const activeWalkthroughs = activeStepDef?.model.walkthroughs;
364
+ const autoPlaySteps =
365
+ activeStepDef?.autoPlayWalkthroughs === true && (activeWalkthroughs?.length ?? 0) > 0;
366
+ const hopList = useMemo(() => {
367
+ const out: Array<{
368
+ edgeId: string;
369
+ from: string;
370
+ to: string;
371
+ stepNo: number;
372
+ total: number;
373
+ walkthroughId: string;
374
+ walkthroughTitle: string;
375
+ }> = [];
376
+ for (const wt of (activeWalkthroughs ?? []) as SubsystemWalkthrough[]) {
377
+ wt.steps.forEach((s, i) => {
378
+ out.push({
379
+ edgeId: walkthroughStepGraphEdgeId(s),
380
+ from: s.from,
381
+ to: s.to,
382
+ stepNo: i + 1,
383
+ total: wt.steps.length,
384
+ walkthroughId: wt.id,
385
+ walkthroughTitle: wt.title,
386
+ });
387
+ });
388
+ }
389
+ return out;
390
+ }, [activeWalkthroughs]);
391
+ const [stepPointer, setStepPointer] = useState(0);
392
+ useEffect(() => {
393
+ setStepPointer(0);
394
+ }, [activeIndex, hopList.length]);
395
+ useEffect(() => {
396
+ if (!autoPlaySteps || hopList.length === 0) return;
397
+ // Pointer 0 = whole flow (no step focus); 1..N = each hop, then wraps.
398
+ const t = window.setInterval(
399
+ () => setStepPointer((p) => (p + 1) % (hopList.length + 1)),
400
+ Math.max(600, walkthroughAutoPlayIntervalMs),
401
+ );
402
+ return () => window.clearInterval(t);
403
+ }, [autoPlaySteps, hopList.length, walkthroughAutoPlayIntervalMs]);
404
+ const focusedHop =
405
+ autoPlaySteps && hopList.length > 0 && stepPointer > 0
406
+ ? hopList[(stepPointer - 1) % hopList.length]
407
+ : undefined;
408
+ const stepNoByEdge = useMemo(() => {
409
+ const m = new Map<string, number[]>();
410
+ for (const h of hopList) {
411
+ const arr = m.get(h.edgeId) ?? [];
412
+ arr.push(h.stepNo);
413
+ m.set(h.edgeId, arr);
414
+ }
415
+ return m;
416
+ }, [hopList]);
417
+ const focusParticipants = useMemo(
418
+ () => (focusedHop ? new Set([focusedHop.from, focusedHop.to]) : null),
419
+ [focusedHop],
420
+ );
421
+
311
422
  const nodes: Node[] = useMemo(() => {
312
423
  const activeOrder = new Set(activeLayout?.order ?? []);
313
424
  const ids = [...display.entries()]
@@ -332,21 +443,71 @@ function TransitionInner({
332
443
  data: meta.data,
333
444
  draggable: false,
334
445
  selectable: false,
335
- style: { opacity: rect.o },
446
+ style: {
447
+ opacity:
448
+ rect.o * (focusParticipants && !focusParticipants.has(id) ? 0.18 : 1),
449
+ },
336
450
  } as Node);
337
451
  }
338
452
  return out;
339
- }, [display, activeLayout, unionMeta]);
453
+ }, [display, activeLayout, unionMeta, focusParticipants]);
340
454
 
341
- const edges: Edge[] = useMemo(
342
- () => (settled ? activeLayout?.edges ?? [] : []),
343
- [settled, activeLayout],
344
- );
455
+ // Real graph edges once settled; step focus adds hop numbers and dims the
456
+ // non-focused hops.
457
+ const edges: Edge[] = useMemo(() => {
458
+ if (!settled) return [];
459
+ const list = activeLayout?.edges ?? [];
460
+ const numbering = autoPlaySteps && hopList.length > 0;
461
+ if (!numbering && !focusedHop) return list;
462
+ return list.map((e) => {
463
+ // Number every hop while autoplaying (whole view included); dim only the
464
+ // hops other than the focused one.
465
+ const stepNos = numbering ? stepNoByEdge.get(e.id) : undefined;
466
+ const dimmed = focusedHop ? e.id !== focusedHop.edgeId : false;
467
+ if (!stepNos && !dimmed) return e;
468
+ return {
469
+ ...e,
470
+ data: { ...(e.data as object), stepNos, dimmed },
471
+ } as Edge;
472
+ });
473
+ }, [settled, activeLayout, focusedHop, stepNoByEdge, autoPlaySteps, hopList.length]);
474
+
475
+ // Camera: frame a focused hop's endpoints, or the whole graph during the
476
+ // "whole flow" phase.
477
+ useEffect(() => {
478
+ if (walkthroughStepMode !== 'focus' || !settled || !sized || !autoPlaySteps) return;
479
+ if (!activeLayout) return;
480
+ const rects = focusedHop
481
+ ? [focusedHop.from, focusedHop.to]
482
+ .map((id) => activeLayout.rects.get(id))
483
+ .filter((r): r is Rect => !!r)
484
+ : [...activeLayout.rects.values()];
485
+ if (rects.length === 0) return;
486
+ const minX = Math.min(...rects.map((r) => r.x));
487
+ const minY = Math.min(...rects.map((r) => r.y));
488
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
489
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
490
+ fitBounds(
491
+ { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
492
+ { padding: focusedHop ? 0.3 : fitPadding, duration: durationMs },
493
+ );
494
+ }, [
495
+ walkthroughStepMode,
496
+ focusedHop,
497
+ settled,
498
+ sized,
499
+ activeLayout,
500
+ durationMs,
501
+ fitBounds,
502
+ autoPlaySteps,
503
+ fitPadding,
504
+ ]);
345
505
 
346
506
  const callbacks = useMemo(() => (onSelect ? { onSelect } : {}), [onSelect]);
347
507
 
348
508
  return (
349
509
  <div
510
+ ref={wrapRef}
350
511
  className={className}
351
512
  style={{
352
513
  position: 'relative',
@@ -376,6 +537,70 @@ function TransitionInner({
376
537
  </ReactFlow>
377
538
  </SubsystemCallbacksProvider>
378
539
  )}
540
+ {activeStepDef?.showWalkthroughTitle && focusedHop && (
541
+ <div
542
+ aria-label={`${focusedHop.walkthroughTitle}, step ${focusedHop.stepNo} of ${focusedHop.total}`}
543
+ style={{
544
+ position: 'absolute',
545
+ top: 12,
546
+ left: '50%',
547
+ transform: 'translateX(-50%)',
548
+ minWidth: 160,
549
+ maxWidth: '60%',
550
+ display: 'flex',
551
+ flexDirection: 'column',
552
+ background: theme.colors.backgroundSecondary ?? theme.colors.background,
553
+ border: `1px solid ${theme.colors.border}`,
554
+ borderRadius: 6,
555
+ boxShadow: '0 1px 4px rgba(0,0,0,0.25)',
556
+ overflow: 'hidden',
557
+ opacity: 0.95,
558
+ pointerEvents: 'none',
559
+ zIndex: 10,
560
+ }}
561
+ >
562
+ <div
563
+ style={{
564
+ padding: '5px 14px',
565
+ fontSize: theme.fontSizes[2] ?? theme.fontSizes[1],
566
+ fontWeight: 600,
567
+ fontFamily: theme.fonts.monospace,
568
+ color: theme.colors.text,
569
+ overflow: 'hidden',
570
+ textOverflow: 'ellipsis',
571
+ whiteSpace: 'nowrap',
572
+ textAlign: 'center',
573
+ }}
574
+ >
575
+ {focusedHop.walkthroughTitle}
576
+ </div>
577
+ {focusedHop.total > 0 && (
578
+ <div style={{ display: 'flex', gap: 3, padding: '0 6px 5px' }} aria-hidden="true">
579
+ {Array.from({ length: focusedHop.total }, (_, i) => {
580
+ const n = i + 1;
581
+ const active = n === focusedHop.stepNo;
582
+ const done = n < focusedHop.stepNo;
583
+ return (
584
+ <span
585
+ key={n}
586
+ style={{
587
+ flex: 1,
588
+ height: 2,
589
+ borderRadius: 1,
590
+ background: active
591
+ ? (theme.colors.accent ?? theme.colors.primary ?? theme.colors.text)
592
+ : done
593
+ ? (theme.colors.textSecondary ?? theme.colors.text)
594
+ : (theme.colors.border ?? 'rgba(127,127,127,0.45)'),
595
+ opacity: active ? 1 : done ? 0.75 : 0.4,
596
+ }}
597
+ />
598
+ );
599
+ })}
600
+ </div>
601
+ )}
602
+ </div>
603
+ )}
379
604
  </div>
380
605
  );
381
606
  }