@principal-ai/subsystems-react 0.44.0 → 0.44.2

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;AAcrG,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;AA4gBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,+BAM5E"}
@@ -12,10 +12,10 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
12
12
  * the graph's real (ELK-routed, mechanism-colored) edges appear once it settles.
13
13
  */
14
14
  import { useEffect, useMemo, useRef, useState } from 'react';
15
- import { Background, EdgeLabelRenderer, ReactFlow, ReactFlowProvider, useReactFlow, } from '@xyflow/react';
15
+ import { Background, EdgeLabelRenderer, ReactFlow, ReactFlowProvider, useReactFlow, useStore, } 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,36 @@ 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();
103
+ // React Flow only owns a size once its pane has mounted + measured; fitting
104
+ // before that clamps the view. Gate the fit on RF's own dimensions.
105
+ const rfSized = useStore((s) => (s.width ?? 0) > 0 && (s.height ?? 0) > 0);
99
106
  const [layouts, setLayouts] = useState(null);
100
107
  const [display, setDisplay] = useState(new Map());
101
108
  const [settled, setSettled] = useState(false);
109
+ // React Flow can't fit until its pane has a real size; the first mount often
110
+ // reports 0, which clamped the initial fit (right-hand nodes cut off).
111
+ const [sized, setSized] = useState(false);
112
+ const wrapRef = useRef(null);
102
113
  const displayRef = useRef(display);
103
114
  displayRef.current = display;
104
115
  const rafRef = useRef(null);
116
+ useEffect(() => {
117
+ const el = wrapRef.current;
118
+ if (!el)
119
+ return;
120
+ const measure = () => {
121
+ const r = el.getBoundingClientRect();
122
+ if (r.width > 0 && r.height > 0)
123
+ setSized(true);
124
+ };
125
+ measure();
126
+ const ro = new ResizeObserver(measure);
127
+ ro.observe(el);
128
+ return () => ro.disconnect();
129
+ }, []);
105
130
  // Lay out every step whenever the steps prop changes (identity-keyed).
106
131
  useEffect(() => {
107
132
  let alive = true;
@@ -130,14 +155,6 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
130
155
  if (!step)
131
156
  return;
132
157
  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
158
  const start = new Map(displayRef.current);
142
159
  const ids = new Set([...start.keys(), ...step.rects.keys()]);
143
160
  const t0 = performance.now();
@@ -175,7 +192,24 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
175
192
  if (rafRef.current != null)
176
193
  cancelAnimationFrame(rafRef.current);
177
194
  };
178
- }, [layouts, activeIndex, durationMs, fitPadding, fitBounds]);
195
+ }, [layouts, activeIndex, durationMs]);
196
+ // Refit the viewport to the active step — once the pane is sized, and on every
197
+ // step change. Kept separate so the initial fit waits for a real pane size.
198
+ useEffect(() => {
199
+ if (!sized || !rfSized || !layouts)
200
+ return;
201
+ const step = layouts[activeIndex];
202
+ if (!step)
203
+ return;
204
+ const rects = [...step.rects.values()];
205
+ if (rects.length === 0)
206
+ return;
207
+ const minX = Math.min(...rects.map((r) => r.x));
208
+ const minY = Math.min(...rects.map((r) => r.y));
209
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
210
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
211
+ fitBounds({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, { padding: fitPadding, duration: durationMs });
212
+ }, [sized, rfSized, layouts, activeIndex, fitPadding, durationMs, fitBounds]);
179
213
  const unionMeta = useMemo(() => {
180
214
  const m = new Map();
181
215
  for (const s of layouts ?? [])
@@ -185,6 +219,52 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
185
219
  return m;
186
220
  }, [layouts]);
187
221
  const activeLayout = layouts?.[activeIndex];
222
+ // Walkthrough step focus: cycle the active step's hops, dim non-participants,
223
+ // number the labels, and (in `focus` mode) frame the step.
224
+ const activeStepDef = steps[activeIndex];
225
+ const activeWalkthroughs = activeStepDef?.model.walkthroughs;
226
+ const autoPlaySteps = activeStepDef?.autoPlayWalkthroughs === true && (activeWalkthroughs?.length ?? 0) > 0;
227
+ const hopList = useMemo(() => {
228
+ const out = [];
229
+ for (const wt of (activeWalkthroughs ?? [])) {
230
+ wt.steps.forEach((s, i) => {
231
+ out.push({
232
+ edgeId: walkthroughStepGraphEdgeId(s),
233
+ from: s.from,
234
+ to: s.to,
235
+ stepNo: i + 1,
236
+ total: wt.steps.length,
237
+ walkthroughId: wt.id,
238
+ walkthroughTitle: wt.title,
239
+ });
240
+ });
241
+ }
242
+ return out;
243
+ }, [activeWalkthroughs]);
244
+ const [stepPointer, setStepPointer] = useState(0);
245
+ useEffect(() => {
246
+ setStepPointer(0);
247
+ }, [activeIndex, hopList.length]);
248
+ useEffect(() => {
249
+ if (!autoPlaySteps || hopList.length === 0)
250
+ return;
251
+ // Pointer 0 = whole flow (no step focus); 1..N = each hop, then wraps.
252
+ const t = window.setInterval(() => setStepPointer((p) => (p + 1) % (hopList.length + 1)), Math.max(600, walkthroughAutoPlayIntervalMs));
253
+ return () => window.clearInterval(t);
254
+ }, [autoPlaySteps, hopList.length, walkthroughAutoPlayIntervalMs]);
255
+ const focusedHop = autoPlaySteps && hopList.length > 0 && stepPointer > 0
256
+ ? hopList[(stepPointer - 1) % hopList.length]
257
+ : undefined;
258
+ const stepNoByEdge = useMemo(() => {
259
+ const m = new Map();
260
+ for (const h of hopList) {
261
+ const arr = m.get(h.edgeId) ?? [];
262
+ arr.push(h.stepNo);
263
+ m.set(h.edgeId, arr);
264
+ }
265
+ return m;
266
+ }, [hopList]);
267
+ const focusParticipants = useMemo(() => (focusedHop ? new Set([focusedHop.from, focusedHop.to]) : null), [focusedHop]);
188
268
  const nodes = useMemo(() => {
189
269
  const activeOrder = new Set(activeLayout?.order ?? []);
190
270
  const ids = [...display.entries()]
@@ -210,21 +290,117 @@ function TransitionInner({ steps, activeIndex, durationMs = 750, fitPadding = 0.
210
290
  data: meta.data,
211
291
  draggable: false,
212
292
  selectable: false,
213
- style: { opacity: rect.o },
293
+ style: {
294
+ opacity: rect.o * (focusParticipants && !focusParticipants.has(id) ? 0.18 : 1),
295
+ },
214
296
  });
215
297
  }
216
298
  return out;
217
- }, [display, activeLayout, unionMeta]);
218
- const edges = useMemo(() => (settled ? activeLayout?.edges ?? [] : []), [settled, activeLayout]);
299
+ }, [display, activeLayout, unionMeta, focusParticipants]);
300
+ // Real graph edges once settled; step focus adds hop numbers and dims the
301
+ // non-focused hops.
302
+ const edges = useMemo(() => {
303
+ if (!settled)
304
+ return [];
305
+ const list = activeLayout?.edges ?? [];
306
+ const numbering = autoPlaySteps && hopList.length > 0;
307
+ if (!numbering && !focusedHop)
308
+ return list;
309
+ return list.map((e) => {
310
+ // Number every hop while autoplaying (whole view included); dim only the
311
+ // hops other than the focused one.
312
+ const stepNos = numbering ? stepNoByEdge.get(e.id) : undefined;
313
+ const dimmed = focusedHop ? e.id !== focusedHop.edgeId : false;
314
+ if (!stepNos && !dimmed)
315
+ return e;
316
+ return {
317
+ ...e,
318
+ data: { ...e.data, stepNos, dimmed },
319
+ };
320
+ });
321
+ }, [settled, activeLayout, focusedHop, stepNoByEdge, autoPlaySteps, hopList.length]);
322
+ // Camera: frame a focused hop's endpoints, or the whole graph during the
323
+ // "whole flow" phase.
324
+ useEffect(() => {
325
+ if (walkthroughStepMode !== 'focus' || !settled || !sized || !rfSized || !autoPlaySteps)
326
+ return;
327
+ if (!activeLayout)
328
+ return;
329
+ const rects = focusedHop
330
+ ? [focusedHop.from, focusedHop.to]
331
+ .map((id) => activeLayout.rects.get(id))
332
+ .filter((r) => !!r)
333
+ : [...activeLayout.rects.values()];
334
+ if (rects.length === 0)
335
+ return;
336
+ const minX = Math.min(...rects.map((r) => r.x));
337
+ const minY = Math.min(...rects.map((r) => r.y));
338
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
339
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
340
+ fitBounds({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, { padding: focusedHop ? 0.3 : fitPadding, duration: durationMs });
341
+ }, [
342
+ walkthroughStepMode,
343
+ focusedHop,
344
+ settled,
345
+ sized,
346
+ rfSized,
347
+ activeLayout,
348
+ durationMs,
349
+ fitBounds,
350
+ autoPlaySteps,
351
+ fitPadding,
352
+ ]);
219
353
  const callbacks = useMemo(() => (onSelect ? { onSelect } : {}), [onSelect]);
220
- return (_jsx("div", { className: className, style: {
354
+ return (_jsxs("div", { ref: wrapRef, className: className, style: {
221
355
  position: 'relative',
222
356
  width: '100%',
223
357
  height: '100%',
224
358
  minHeight: 0,
225
359
  background: theme.colors.background,
226
360
  ...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, {})] }) })) }));
361
+ }, 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: {
362
+ position: 'absolute',
363
+ top: 12,
364
+ left: '50%',
365
+ transform: 'translateX(-50%)',
366
+ minWidth: 160,
367
+ maxWidth: '60%',
368
+ display: 'flex',
369
+ flexDirection: 'column',
370
+ background: theme.colors.backgroundSecondary ?? theme.colors.background,
371
+ border: `1px solid ${theme.colors.border}`,
372
+ borderRadius: 6,
373
+ boxShadow: '0 1px 4px rgba(0,0,0,0.25)',
374
+ overflow: 'hidden',
375
+ opacity: 0.95,
376
+ pointerEvents: 'none',
377
+ zIndex: 10,
378
+ }, children: [_jsx("div", { style: {
379
+ padding: '5px 14px',
380
+ fontSize: theme.fontSizes[2] ?? theme.fontSizes[1],
381
+ fontWeight: 600,
382
+ fontFamily: theme.fonts.monospace,
383
+ color: theme.colors.text,
384
+ overflow: 'hidden',
385
+ textOverflow: 'ellipsis',
386
+ whiteSpace: 'nowrap',
387
+ textAlign: 'center',
388
+ }, 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) => {
389
+ const n = i + 1;
390
+ const active = n === focusedHop.stepNo;
391
+ const done = n < focusedHop.stepNo;
392
+ return (_jsx("span", { style: {
393
+ flex: 1,
394
+ height: 2,
395
+ borderRadius: 1,
396
+ background: active
397
+ ? (theme.colors.accent ?? theme.colors.primary ?? theme.colors.text)
398
+ : done
399
+ ? (theme.colors.textSecondary ?? theme.colors.text)
400
+ : (theme.colors.border ?? 'rgba(127,127,127,0.45)'),
401
+ opacity: active ? 1 : done ? 0.75 : 0.4,
402
+ } }, n));
403
+ }) }))] }))] }));
228
404
  }
229
405
  export function SubsystemModelTransition(props) {
230
406
  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.2",
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
@@ -18,6 +18,7 @@ import {
18
18
  ReactFlow,
19
19
  ReactFlowProvider,
20
20
  useReactFlow,
21
+ useStore,
21
22
  type Edge,
22
23
  type EdgeProps,
23
24
  type EdgeTypes,
@@ -30,9 +31,11 @@ import {
30
31
  buildSubsystemGraph,
31
32
  edgeColor,
32
33
  MECHANISM_DESCRIPTIONS,
34
+ walkthroughStepGraphEdgeId,
33
35
  type SubsystemEdgeProvenance,
34
36
  type SubsystemGraphNode,
35
37
  type SubsystemModelDocument,
38
+ type SubsystemWalkthrough,
36
39
  } from './model';
37
40
  import {
38
41
  hexWithAlpha,
@@ -59,18 +62,29 @@ export interface SubsystemTransitionStep {
59
62
  showEdgeLabels?: boolean;
60
63
  /** Explicit boundary frame colors (region key → hex); host override. */
61
64
  boundaryColors?: Record<string, string>;
65
+ /**
66
+ * Cycle this step's walkthrough hops: focus each step (dim non-participants,
67
+ * number the labels, frame the step). Typically only the walkthrough layer.
68
+ */
69
+ autoPlayWalkthroughs?: boolean;
70
+ /** Show the focused walkthrough's title chip (with step ticks). */
71
+ showWalkthroughTitle?: boolean;
62
72
  }
63
73
 
64
74
  export interface SubsystemModelTransitionProps {
65
75
  steps: SubsystemTransitionStep[];
66
76
  /** Which step is shown. Controlled by the host (its nav / timer). */
67
77
  activeIndex: number;
68
- /** Tween duration, ms. @default 750 */
78
+ /** Tween duration, ms. @default 950 */
69
79
  durationMs?: number;
70
80
  /** fitView padding for the viewport refit. @default 0.18 */
71
81
  fitPadding?: number;
72
82
  /** Called when a node is clicked. */
73
83
  onSelect?: (componentAlias: string) => void;
84
+ /** How an autoplayed walkthrough step reads. @default 'focus' */
85
+ walkthroughStepMode?: 'focus' | 'dim';
86
+ /** Dwell per walkthrough step while autoplaying, ms. @default 4000 */
87
+ walkthroughAutoPlayIntervalMs?: number;
74
88
  className?: string;
75
89
  style?: CSSProperties;
76
90
  }
@@ -79,10 +93,20 @@ export interface SubsystemModelTransitionProps {
79
93
  function TransitionEdge(props: EdgeProps) {
80
94
  const { theme } = useTheme();
81
95
  const data = props.data as
82
- | { mechanism?: string; provenance?: SubsystemEdgeProvenance; labelX?: number; labelY?: number }
96
+ | {
97
+ mechanism?: string;
98
+ provenance?: SubsystemEdgeProvenance;
99
+ labelX?: number;
100
+ labelY?: number;
101
+ stepNos?: number[];
102
+ dimmed?: boolean;
103
+ }
83
104
  | undefined;
84
105
  const mechanism = data?.mechanism ?? 'uses';
85
106
  const color = edgeColor({ mechanism, provenance: data?.provenance });
107
+ const text = data?.stepNos?.length
108
+ ? `${data.stepNos.map((n) => `${n}:`).join(' ')} ${mechanism}`
109
+ : mechanism;
86
110
  const verifiable =
87
111
  data?.provenance === 'graphify' ||
88
112
  MECHANISM_DESCRIPTIONS.find(([m]) => m === mechanism)?.[2] !== false;
@@ -105,6 +129,7 @@ function TransitionEdge(props: EdgeProps) {
105
129
  boxSizing: 'border-box',
106
130
  padding: '7px 8px',
107
131
  pointerEvents: 'none',
132
+ opacity: data?.dimmed ? 0.15 : 1,
108
133
  }}
109
134
  >
110
135
  {verifiable ? (
@@ -150,7 +175,7 @@ function TransitionEdge(props: EdgeProps) {
150
175
  color,
151
176
  }}
152
177
  >
153
- {mechanism}
178
+ {text}
154
179
  </span>
155
180
  </div>
156
181
  </EdgeLabelRenderer>
@@ -210,21 +235,43 @@ function flatten(
210
235
  function TransitionInner({
211
236
  steps,
212
237
  activeIndex,
213
- durationMs = 750,
238
+ durationMs = 950,
214
239
  fitPadding = 0.18,
215
240
  onSelect,
241
+ walkthroughStepMode = 'focus',
242
+ walkthroughAutoPlayIntervalMs = 4000,
216
243
  className,
217
244
  style,
218
245
  }: SubsystemModelTransitionProps) {
219
246
  const { theme } = useTheme();
220
247
  const { fitBounds } = useReactFlow();
248
+ // React Flow only owns a size once its pane has mounted + measured; fitting
249
+ // before that clamps the view. Gate the fit on RF's own dimensions.
250
+ const rfSized = useStore((s) => (s.width ?? 0) > 0 && (s.height ?? 0) > 0);
221
251
  const [layouts, setLayouts] = useState<StepLayout[] | null>(null);
222
252
  const [display, setDisplay] = useState<Map<string, Live>>(new Map());
223
253
  const [settled, setSettled] = useState(false);
254
+ // React Flow can't fit until its pane has a real size; the first mount often
255
+ // reports 0, which clamped the initial fit (right-hand nodes cut off).
256
+ const [sized, setSized] = useState(false);
257
+ const wrapRef = useRef<HTMLDivElement>(null);
224
258
  const displayRef = useRef(display);
225
259
  displayRef.current = display;
226
260
  const rafRef = useRef<number | null>(null);
227
261
 
262
+ useEffect(() => {
263
+ const el = wrapRef.current;
264
+ if (!el) return;
265
+ const measure = () => {
266
+ const r = el.getBoundingClientRect();
267
+ if (r.width > 0 && r.height > 0) setSized(true);
268
+ };
269
+ measure();
270
+ const ro = new ResizeObserver(measure);
271
+ ro.observe(el);
272
+ return () => ro.disconnect();
273
+ }, []);
274
+
228
275
  // Lay out every step whenever the steps prop changes (identity-keyed).
229
276
  useEffect(() => {
230
277
  let alive = true;
@@ -252,18 +299,6 @@ function TransitionInner({
252
299
  if (!step) return;
253
300
  setSettled(false);
254
301
 
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
302
  const start = new Map(displayRef.current);
268
303
  const ids = new Set<string>([...start.keys(), ...step.rects.keys()]);
269
304
  const t0 = performance.now();
@@ -298,7 +333,25 @@ function TransitionInner({
298
333
  return () => {
299
334
  if (rafRef.current != null) cancelAnimationFrame(rafRef.current);
300
335
  };
301
- }, [layouts, activeIndex, durationMs, fitPadding, fitBounds]);
336
+ }, [layouts, activeIndex, durationMs]);
337
+
338
+ // Refit the viewport to the active step — once the pane is sized, and on every
339
+ // step change. Kept separate so the initial fit waits for a real pane size.
340
+ useEffect(() => {
341
+ if (!sized || !rfSized || !layouts) return;
342
+ const step = layouts[activeIndex];
343
+ if (!step) return;
344
+ const rects = [...step.rects.values()];
345
+ if (rects.length === 0) return;
346
+ const minX = Math.min(...rects.map((r) => r.x));
347
+ const minY = Math.min(...rects.map((r) => r.y));
348
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
349
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
350
+ fitBounds(
351
+ { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
352
+ { padding: fitPadding, duration: durationMs },
353
+ );
354
+ }, [sized, rfSized, layouts, activeIndex, fitPadding, durationMs, fitBounds]);
302
355
 
303
356
  const unionMeta = useMemo(() => {
304
357
  const m = new Map<string, StepMeta>();
@@ -308,6 +361,68 @@ function TransitionInner({
308
361
 
309
362
  const activeLayout = layouts?.[activeIndex];
310
363
 
364
+ // Walkthrough step focus: cycle the active step's hops, dim non-participants,
365
+ // number the labels, and (in `focus` mode) frame the step.
366
+ const activeStepDef = steps[activeIndex];
367
+ const activeWalkthroughs = activeStepDef?.model.walkthroughs;
368
+ const autoPlaySteps =
369
+ activeStepDef?.autoPlayWalkthroughs === true && (activeWalkthroughs?.length ?? 0) > 0;
370
+ const hopList = useMemo(() => {
371
+ const out: Array<{
372
+ edgeId: string;
373
+ from: string;
374
+ to: string;
375
+ stepNo: number;
376
+ total: number;
377
+ walkthroughId: string;
378
+ walkthroughTitle: string;
379
+ }> = [];
380
+ for (const wt of (activeWalkthroughs ?? []) as SubsystemWalkthrough[]) {
381
+ wt.steps.forEach((s, i) => {
382
+ out.push({
383
+ edgeId: walkthroughStepGraphEdgeId(s),
384
+ from: s.from,
385
+ to: s.to,
386
+ stepNo: i + 1,
387
+ total: wt.steps.length,
388
+ walkthroughId: wt.id,
389
+ walkthroughTitle: wt.title,
390
+ });
391
+ });
392
+ }
393
+ return out;
394
+ }, [activeWalkthroughs]);
395
+ const [stepPointer, setStepPointer] = useState(0);
396
+ useEffect(() => {
397
+ setStepPointer(0);
398
+ }, [activeIndex, hopList.length]);
399
+ useEffect(() => {
400
+ if (!autoPlaySteps || hopList.length === 0) return;
401
+ // Pointer 0 = whole flow (no step focus); 1..N = each hop, then wraps.
402
+ const t = window.setInterval(
403
+ () => setStepPointer((p) => (p + 1) % (hopList.length + 1)),
404
+ Math.max(600, walkthroughAutoPlayIntervalMs),
405
+ );
406
+ return () => window.clearInterval(t);
407
+ }, [autoPlaySteps, hopList.length, walkthroughAutoPlayIntervalMs]);
408
+ const focusedHop =
409
+ autoPlaySteps && hopList.length > 0 && stepPointer > 0
410
+ ? hopList[(stepPointer - 1) % hopList.length]
411
+ : undefined;
412
+ const stepNoByEdge = useMemo(() => {
413
+ const m = new Map<string, number[]>();
414
+ for (const h of hopList) {
415
+ const arr = m.get(h.edgeId) ?? [];
416
+ arr.push(h.stepNo);
417
+ m.set(h.edgeId, arr);
418
+ }
419
+ return m;
420
+ }, [hopList]);
421
+ const focusParticipants = useMemo(
422
+ () => (focusedHop ? new Set([focusedHop.from, focusedHop.to]) : null),
423
+ [focusedHop],
424
+ );
425
+
311
426
  const nodes: Node[] = useMemo(() => {
312
427
  const activeOrder = new Set(activeLayout?.order ?? []);
313
428
  const ids = [...display.entries()]
@@ -332,21 +447,73 @@ function TransitionInner({
332
447
  data: meta.data,
333
448
  draggable: false,
334
449
  selectable: false,
335
- style: { opacity: rect.o },
450
+ style: {
451
+ opacity:
452
+ rect.o * (focusParticipants && !focusParticipants.has(id) ? 0.18 : 1),
453
+ },
336
454
  } as Node);
337
455
  }
338
456
  return out;
339
- }, [display, activeLayout, unionMeta]);
457
+ }, [display, activeLayout, unionMeta, focusParticipants]);
340
458
 
341
- const edges: Edge[] = useMemo(
342
- () => (settled ? activeLayout?.edges ?? [] : []),
343
- [settled, activeLayout],
344
- );
459
+ // Real graph edges once settled; step focus adds hop numbers and dims the
460
+ // non-focused hops.
461
+ const edges: Edge[] = useMemo(() => {
462
+ if (!settled) return [];
463
+ const list = activeLayout?.edges ?? [];
464
+ const numbering = autoPlaySteps && hopList.length > 0;
465
+ if (!numbering && !focusedHop) return list;
466
+ return list.map((e) => {
467
+ // Number every hop while autoplaying (whole view included); dim only the
468
+ // hops other than the focused one.
469
+ const stepNos = numbering ? stepNoByEdge.get(e.id) : undefined;
470
+ const dimmed = focusedHop ? e.id !== focusedHop.edgeId : false;
471
+ if (!stepNos && !dimmed) return e;
472
+ return {
473
+ ...e,
474
+ data: { ...(e.data as object), stepNos, dimmed },
475
+ } as Edge;
476
+ });
477
+ }, [settled, activeLayout, focusedHop, stepNoByEdge, autoPlaySteps, hopList.length]);
478
+
479
+ // Camera: frame a focused hop's endpoints, or the whole graph during the
480
+ // "whole flow" phase.
481
+ useEffect(() => {
482
+ if (walkthroughStepMode !== 'focus' || !settled || !sized || !rfSized || !autoPlaySteps)
483
+ return;
484
+ if (!activeLayout) return;
485
+ const rects = focusedHop
486
+ ? [focusedHop.from, focusedHop.to]
487
+ .map((id) => activeLayout.rects.get(id))
488
+ .filter((r): r is Rect => !!r)
489
+ : [...activeLayout.rects.values()];
490
+ if (rects.length === 0) return;
491
+ const minX = Math.min(...rects.map((r) => r.x));
492
+ const minY = Math.min(...rects.map((r) => r.y));
493
+ const maxX = Math.max(...rects.map((r) => r.x + r.w));
494
+ const maxY = Math.max(...rects.map((r) => r.y + r.h));
495
+ fitBounds(
496
+ { x: minX, y: minY, width: maxX - minX, height: maxY - minY },
497
+ { padding: focusedHop ? 0.3 : fitPadding, duration: durationMs },
498
+ );
499
+ }, [
500
+ walkthroughStepMode,
501
+ focusedHop,
502
+ settled,
503
+ sized,
504
+ rfSized,
505
+ activeLayout,
506
+ durationMs,
507
+ fitBounds,
508
+ autoPlaySteps,
509
+ fitPadding,
510
+ ]);
345
511
 
346
512
  const callbacks = useMemo(() => (onSelect ? { onSelect } : {}), [onSelect]);
347
513
 
348
514
  return (
349
515
  <div
516
+ ref={wrapRef}
350
517
  className={className}
351
518
  style={{
352
519
  position: 'relative',
@@ -376,6 +543,70 @@ function TransitionInner({
376
543
  </ReactFlow>
377
544
  </SubsystemCallbacksProvider>
378
545
  )}
546
+ {activeStepDef?.showWalkthroughTitle && focusedHop && (
547
+ <div
548
+ aria-label={`${focusedHop.walkthroughTitle}, step ${focusedHop.stepNo} of ${focusedHop.total}`}
549
+ style={{
550
+ position: 'absolute',
551
+ top: 12,
552
+ left: '50%',
553
+ transform: 'translateX(-50%)',
554
+ minWidth: 160,
555
+ maxWidth: '60%',
556
+ display: 'flex',
557
+ flexDirection: 'column',
558
+ background: theme.colors.backgroundSecondary ?? theme.colors.background,
559
+ border: `1px solid ${theme.colors.border}`,
560
+ borderRadius: 6,
561
+ boxShadow: '0 1px 4px rgba(0,0,0,0.25)',
562
+ overflow: 'hidden',
563
+ opacity: 0.95,
564
+ pointerEvents: 'none',
565
+ zIndex: 10,
566
+ }}
567
+ >
568
+ <div
569
+ style={{
570
+ padding: '5px 14px',
571
+ fontSize: theme.fontSizes[2] ?? theme.fontSizes[1],
572
+ fontWeight: 600,
573
+ fontFamily: theme.fonts.monospace,
574
+ color: theme.colors.text,
575
+ overflow: 'hidden',
576
+ textOverflow: 'ellipsis',
577
+ whiteSpace: 'nowrap',
578
+ textAlign: 'center',
579
+ }}
580
+ >
581
+ {focusedHop.walkthroughTitle}
582
+ </div>
583
+ {focusedHop.total > 0 && (
584
+ <div style={{ display: 'flex', gap: 3, padding: '0 6px 5px' }} aria-hidden="true">
585
+ {Array.from({ length: focusedHop.total }, (_, i) => {
586
+ const n = i + 1;
587
+ const active = n === focusedHop.stepNo;
588
+ const done = n < focusedHop.stepNo;
589
+ return (
590
+ <span
591
+ key={n}
592
+ style={{
593
+ flex: 1,
594
+ height: 2,
595
+ borderRadius: 1,
596
+ background: active
597
+ ? (theme.colors.accent ?? theme.colors.primary ?? theme.colors.text)
598
+ : done
599
+ ? (theme.colors.textSecondary ?? theme.colors.text)
600
+ : (theme.colors.border ?? 'rgba(127,127,127,0.45)'),
601
+ opacity: active ? 1 : done ? 0.75 : 0.4,
602
+ }}
603
+ />
604
+ );
605
+ })}
606
+ </div>
607
+ )}
608
+ </div>
609
+ )}
379
610
  </div>
380
611
  );
381
612
  }