@flyingrobots/bijou-tui 0.10.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +25 -0
  2. package/dist/accordion.d.ts +46 -5
  3. package/dist/accordion.d.ts.map +1 -1
  4. package/dist/accordion.js +41 -5
  5. package/dist/accordion.js.map +1 -1
  6. package/dist/animate.d.ts +30 -0
  7. package/dist/animate.d.ts.map +1 -1
  8. package/dist/animate.js +33 -0
  9. package/dist/animate.js.map +1 -1
  10. package/dist/browsable-list.d.ts +67 -4
  11. package/dist/browsable-list.d.ts.map +1 -1
  12. package/dist/browsable-list.js +49 -4
  13. package/dist/browsable-list.js.map +1 -1
  14. package/dist/canvas.d.ts +13 -4
  15. package/dist/canvas.d.ts.map +1 -1
  16. package/dist/canvas.js +9 -3
  17. package/dist/canvas.js.map +1 -1
  18. package/dist/command-palette.d.ts +67 -6
  19. package/dist/command-palette.d.ts.map +1 -1
  20. package/dist/command-palette.js +67 -6
  21. package/dist/command-palette.js.map +1 -1
  22. package/dist/commands.d.ts +32 -3
  23. package/dist/commands.d.ts.map +1 -1
  24. package/dist/commands.js +32 -3
  25. package/dist/commands.js.map +1 -1
  26. package/dist/dag-pane.d.ts +225 -0
  27. package/dist/dag-pane.d.ts.map +1 -0
  28. package/dist/dag-pane.js +510 -0
  29. package/dist/dag-pane.js.map +1 -0
  30. package/dist/driver.d.ts +14 -0
  31. package/dist/driver.d.ts.map +1 -1
  32. package/dist/driver.js +7 -0
  33. package/dist/driver.js.map +1 -1
  34. package/dist/eventbus.d.ts +43 -6
  35. package/dist/eventbus.d.ts.map +1 -1
  36. package/dist/eventbus.js +9 -0
  37. package/dist/eventbus.js.map +1 -1
  38. package/dist/file-picker.d.ts +56 -4
  39. package/dist/file-picker.d.ts.map +1 -1
  40. package/dist/file-picker.js +52 -4
  41. package/dist/file-picker.js.map +1 -1
  42. package/dist/flex.d.ts +17 -0
  43. package/dist/flex.d.ts.map +1 -1
  44. package/dist/flex.js +106 -12
  45. package/dist/flex.js.map +1 -1
  46. package/dist/focus-area.d.ts +179 -0
  47. package/dist/focus-area.d.ts.map +1 -0
  48. package/dist/focus-area.js +261 -0
  49. package/dist/focus-area.js.map +1 -0
  50. package/dist/help.d.ts +16 -1
  51. package/dist/help.d.ts.map +1 -1
  52. package/dist/help.js +13 -0
  53. package/dist/help.js.map +1 -1
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +12 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/inputstack.d.ts +32 -4
  59. package/dist/inputstack.d.ts.map +1 -1
  60. package/dist/inputstack.js +11 -0
  61. package/dist/inputstack.js.map +1 -1
  62. package/dist/keybindings.d.ts +106 -14
  63. package/dist/keybindings.d.ts.map +1 -1
  64. package/dist/keybindings.js +28 -2
  65. package/dist/keybindings.js.map +1 -1
  66. package/dist/keys.d.ts +24 -8
  67. package/dist/keys.d.ts.map +1 -1
  68. package/dist/keys.js +34 -9
  69. package/dist/keys.js.map +1 -1
  70. package/dist/layout.d.ts +26 -0
  71. package/dist/layout.d.ts.map +1 -1
  72. package/dist/layout.js +25 -1
  73. package/dist/layout.js.map +1 -1
  74. package/dist/navigable-table.d.ts +48 -4
  75. package/dist/navigable-table.d.ts.map +1 -1
  76. package/dist/navigable-table.js +44 -4
  77. package/dist/navigable-table.js.map +1 -1
  78. package/dist/overlay.d.ts +110 -3
  79. package/dist/overlay.d.ts.map +1 -1
  80. package/dist/overlay.js +87 -7
  81. package/dist/overlay.js.map +1 -1
  82. package/dist/pager.d.ts +66 -7
  83. package/dist/pager.d.ts.map +1 -1
  84. package/dist/pager.js +56 -7
  85. package/dist/pager.js.map +1 -1
  86. package/dist/panels.d.ts +55 -0
  87. package/dist/panels.d.ts.map +1 -1
  88. package/dist/panels.js +11 -0
  89. package/dist/panels.js.map +1 -1
  90. package/dist/runtime.d.ts +6 -0
  91. package/dist/runtime.d.ts.map +1 -1
  92. package/dist/runtime.js +6 -0
  93. package/dist/runtime.js.map +1 -1
  94. package/dist/screen.d.ts +37 -3
  95. package/dist/screen.d.ts.map +1 -1
  96. package/dist/screen.js +37 -3
  97. package/dist/screen.js.map +1 -1
  98. package/dist/spring.d.ts +56 -7
  99. package/dist/spring.d.ts.map +1 -1
  100. package/dist/spring.js +44 -7
  101. package/dist/spring.js.map +1 -1
  102. package/dist/status-bar.d.ts +15 -2
  103. package/dist/status-bar.d.ts.map +1 -1
  104. package/dist/status-bar.js +9 -0
  105. package/dist/status-bar.js.map +1 -1
  106. package/dist/timeline.d.ts +68 -5
  107. package/dist/timeline.d.ts.map +1 -1
  108. package/dist/timeline.js +33 -0
  109. package/dist/timeline.js.map +1 -1
  110. package/dist/types.d.ts +86 -5
  111. package/dist/types.d.ts.map +1 -1
  112. package/dist/types.js +27 -3
  113. package/dist/types.js.map +1 -1
  114. package/dist/viewport.d.ts +71 -11
  115. package/dist/viewport.d.ts.map +1 -1
  116. package/dist/viewport.js +79 -11
  117. package/dist/viewport.js.map +1 -1
  118. package/package.json +2 -2
@@ -0,0 +1,510 @@
1
+ /**
2
+ * Interactive DAG pane building block.
3
+ *
4
+ * Composes `dagLayout()` with `focusArea()` to provide a scrollable,
5
+ * keyboard-navigable DAG viewer with arrow-key node selection,
6
+ * auto-scroll-to-selection, and auto-highlight-path.
7
+ *
8
+ * Follows the building block pattern: immutable state + pure transformers +
9
+ * pure render + convenience keymap factory.
10
+ *
11
+ * ```ts
12
+ * // In TEA init:
13
+ * const pane = createDagPaneState({ source: nodes, width: 80, height: 24, ctx });
14
+ *
15
+ * // In TEA view:
16
+ * const output = dagPane(pane, { focused: true, ctx });
17
+ *
18
+ * // In TEA update:
19
+ * case 'select-child':
20
+ * return [{ ...model, pane: dagPaneSelectChild(model.pane, ctx) }, []];
21
+ * ```
22
+ */
23
+ import { dagLayout, isSlicedDagSource } from '@flyingrobots/bijou';
24
+ import { createFocusAreaState, focusArea, focusAreaScrollBy, focusAreaScrollToTop, focusAreaScrollToBottom, focusAreaPageDown, focusAreaPageUp, focusAreaScrollByX, focusAreaSetContent, } from './focus-area.js';
25
+ import { scrollTo, scrollToX } from './viewport.js';
26
+ import { createKeyMap } from './keybindings.js';
27
+ function buildAdjacency(source) {
28
+ const childMap = new Map();
29
+ const parentMap = new Map();
30
+ if (isSlicedDagSource(source)) {
31
+ const ids = source.ids();
32
+ const idSet = new Set(ids);
33
+ for (const id of ids) {
34
+ const children = source.children(id).filter((c) => idSet.has(c));
35
+ childMap.set(id, [...children]);
36
+ if (!parentMap.has(id))
37
+ parentMap.set(id, []);
38
+ for (const child of children) {
39
+ let parents = parentMap.get(child);
40
+ if (!parents) {
41
+ parents = [];
42
+ parentMap.set(child, parents);
43
+ }
44
+ parents.push(id);
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ const idSet = new Set(source.map((n) => n.id));
50
+ for (const node of source) {
51
+ const children = (node.edges ?? []).filter((e) => idSet.has(e));
52
+ childMap.set(node.id, children);
53
+ if (!parentMap.has(node.id))
54
+ parentMap.set(node.id, []);
55
+ for (const child of children) {
56
+ let parents = parentMap.get(child);
57
+ if (!parents) {
58
+ parents = [];
59
+ parentMap.set(child, parents);
60
+ }
61
+ parents.push(node.id);
62
+ }
63
+ }
64
+ }
65
+ const roots = [];
66
+ for (const [id, parents] of parentMap) {
67
+ if (parents.length === 0)
68
+ roots.push(id);
69
+ }
70
+ // Also add any nodes that are in childMap but not parentMap (shouldn't happen, but safe)
71
+ for (const id of childMap.keys()) {
72
+ if (!parentMap.has(id))
73
+ roots.push(id);
74
+ }
75
+ return {
76
+ children: childMap,
77
+ parents: parentMap,
78
+ roots,
79
+ };
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Internal: Highlight path computation
83
+ // ---------------------------------------------------------------------------
84
+ function computeHighlightPath(selectedId, adjacency) {
85
+ if (!selectedId)
86
+ return [];
87
+ // BFS upward from selected to find a root, then reverse
88
+ const visited = new Set();
89
+ const cameFrom = new Map();
90
+ const queue = [selectedId];
91
+ visited.add(selectedId);
92
+ let rootFound;
93
+ while (queue.length > 0) {
94
+ const current = queue.shift();
95
+ const parents = adjacency.parents.get(current) ?? [];
96
+ if (parents.length === 0) {
97
+ rootFound = current;
98
+ break;
99
+ }
100
+ for (const parent of parents) {
101
+ if (!visited.has(parent)) {
102
+ visited.add(parent);
103
+ cameFrom.set(parent, current);
104
+ queue.push(parent);
105
+ }
106
+ }
107
+ }
108
+ if (rootFound === undefined) {
109
+ // Selected node is itself a root (or disconnected)
110
+ return [selectedId];
111
+ }
112
+ // Reconstruct path from root to selected
113
+ const path = [];
114
+ let cursor = rootFound;
115
+ while (cursor !== undefined) {
116
+ path.push(cursor);
117
+ if (cursor === selectedId)
118
+ break;
119
+ cursor = cameFrom.get(cursor);
120
+ }
121
+ // If we couldn't reach selectedId from the root, just return selected
122
+ if (path[path.length - 1] !== selectedId) {
123
+ return [selectedId];
124
+ }
125
+ return path;
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Internal: Spatial navigation helpers
129
+ // ---------------------------------------------------------------------------
130
+ function closestByCol(candidates, currentCenter, positions) {
131
+ let best;
132
+ let bestDist = Infinity;
133
+ for (const id of candidates) {
134
+ const pos = positions.get(id);
135
+ if (!pos)
136
+ continue;
137
+ const center = pos.col + pos.width / 2;
138
+ const dist = Math.abs(center - currentCenter);
139
+ if (dist < bestDist) {
140
+ bestDist = dist;
141
+ best = id;
142
+ }
143
+ }
144
+ return best;
145
+ }
146
+ function nodesOnSameRow(row, positions) {
147
+ const result = [];
148
+ for (const [id, pos] of positions) {
149
+ if (pos.row === row)
150
+ result.push(id);
151
+ }
152
+ return result.sort((a, b) => {
153
+ const pa = positions.get(a);
154
+ const pb = positions.get(b);
155
+ return pa.col - pb.col;
156
+ });
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // Internal: Auto-scroll to node
160
+ // ---------------------------------------------------------------------------
161
+ function scrollToNode(faState, nodePos) {
162
+ let scroll = faState.scroll;
163
+ // Vertical: ensure node box (row .. row+height) is within viewport
164
+ const nodeTop = nodePos.row;
165
+ const nodeBottom = nodePos.row + nodePos.height - 1;
166
+ const viewTop = scroll.y;
167
+ const viewBottom = scroll.y + faState.height - 1;
168
+ if (nodeTop < viewTop) {
169
+ scroll = scrollTo(scroll, nodeTop);
170
+ }
171
+ else if (nodeBottom > viewBottom) {
172
+ scroll = scrollTo(scroll, nodeBottom - faState.height + 1);
173
+ }
174
+ // Horizontal: ensure node box (col .. col+width) is within viewport
175
+ if (faState.overflowX === 'scroll') {
176
+ const contentWidth = Math.max(1, faState.width - 1); // minus gutter
177
+ const nodeLeft = nodePos.col;
178
+ const nodeRight = nodePos.col + nodePos.width - 1;
179
+ const viewLeft = scroll.x;
180
+ const viewRight = scroll.x + contentWidth - 1;
181
+ if (nodeLeft < viewLeft) {
182
+ scroll = scrollToX(scroll, nodeLeft);
183
+ }
184
+ else if (nodeRight > viewRight) {
185
+ scroll = scrollToX(scroll, nodeRight - contentWidth + 1);
186
+ }
187
+ }
188
+ return { ...faState, scroll };
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // Internal: Selection update
192
+ // ---------------------------------------------------------------------------
193
+ function renderLayout(source, selectedId, highlightPath, dagOptions, ctx) {
194
+ const opts = {
195
+ ...dagOptions,
196
+ selectedId,
197
+ highlightPath: highlightPath.length > 0 ? [...highlightPath] : undefined,
198
+ ctx,
199
+ };
200
+ // Type narrowing required — dagLayout has separate overloads for
201
+ // DagNode[] and SlicedDagSource; a union won't resolve either overload.
202
+ return isSlicedDagSource(source)
203
+ ? dagLayout(source, opts)
204
+ : dagLayout(source, opts);
205
+ }
206
+ function updateSelection(state, newId, adjacency, ctx) {
207
+ const highlightPath = computeHighlightPath(newId, adjacency);
208
+ const layout = renderLayout(state.source, newId, highlightPath, state.dagOptions, ctx);
209
+ let fa = focusAreaSetContent(state.focusArea, layout.output);
210
+ // Auto-scroll to selected node
211
+ if (newId) {
212
+ const nodePos = layout.nodes.get(newId);
213
+ if (nodePos) {
214
+ fa = scrollToNode(fa, nodePos);
215
+ }
216
+ }
217
+ return {
218
+ ...state,
219
+ selectedId: newId,
220
+ highlightPath,
221
+ layout,
222
+ focusArea: fa,
223
+ };
224
+ }
225
+ // ---------------------------------------------------------------------------
226
+ // State creation
227
+ // ---------------------------------------------------------------------------
228
+ /**
229
+ * Create initial DAG pane state for the given source and dimensions.
230
+ *
231
+ * @param options - Source, dimensions, and rendering options.
232
+ * @returns Fresh DAG pane state.
233
+ */
234
+ export function createDagPaneState(options) {
235
+ const { source, width, height, selectedId, overflowX = 'scroll', dagOptions = {}, ctx, } = options;
236
+ const adjacency = buildAdjacency(source);
237
+ // Validate selectedId — fall back to no selection if not in the source
238
+ const validatedId = selectedId !== undefined && adjacency.children.has(selectedId) ? selectedId : undefined;
239
+ const highlightPath = computeHighlightPath(validatedId, adjacency);
240
+ const layout = renderLayout(source, validatedId, highlightPath, dagOptions, ctx);
241
+ const fa = createFocusAreaState({
242
+ content: layout.output,
243
+ width,
244
+ height,
245
+ overflowX,
246
+ });
247
+ // Auto-scroll to initial selection
248
+ let finalFa = fa;
249
+ if (validatedId) {
250
+ const nodePos = layout.nodes.get(validatedId);
251
+ if (nodePos) {
252
+ finalFa = scrollToNode(fa, nodePos);
253
+ }
254
+ }
255
+ return {
256
+ source,
257
+ selectedId: validatedId,
258
+ layout,
259
+ highlightPath,
260
+ focusArea: finalFa,
261
+ dagOptions,
262
+ };
263
+ }
264
+ // ---------------------------------------------------------------------------
265
+ // Navigation transformers
266
+ // ---------------------------------------------------------------------------
267
+ /**
268
+ * Select a child node (arrow down).
269
+ * If nothing is selected, auto-selects the first root node.
270
+ *
271
+ * @param state - Current DAG pane state.
272
+ * @param ctx - Bijou context for re-rendering.
273
+ * @returns Updated state with new selection.
274
+ */
275
+ export function dagPaneSelectChild(state, ctx) {
276
+ const adjacency = buildAdjacency(state.source);
277
+ if (!state.selectedId) {
278
+ const firstRoot = adjacency.roots[0];
279
+ return firstRoot ? updateSelection(state, firstRoot, adjacency, ctx) : state;
280
+ }
281
+ const children = adjacency.children.get(state.selectedId) ?? [];
282
+ if (children.length === 0)
283
+ return state;
284
+ const currentPos = state.layout.nodes.get(state.selectedId);
285
+ const currentCenter = currentPos ? currentPos.col + currentPos.width / 2 : 0;
286
+ const target = closestByCol(children, currentCenter, state.layout.nodes);
287
+ return target ? updateSelection(state, target, adjacency, ctx) : state;
288
+ }
289
+ /**
290
+ * Select a parent node (arrow up).
291
+ * If nothing is selected, auto-selects the first root node.
292
+ *
293
+ * @param state - Current DAG pane state.
294
+ * @param ctx - Bijou context for re-rendering.
295
+ * @returns Updated state with new selection.
296
+ */
297
+ export function dagPaneSelectParent(state, ctx) {
298
+ const adjacency = buildAdjacency(state.source);
299
+ if (!state.selectedId) {
300
+ const firstRoot = adjacency.roots[0];
301
+ return firstRoot ? updateSelection(state, firstRoot, adjacency, ctx) : state;
302
+ }
303
+ const parents = adjacency.parents.get(state.selectedId) ?? [];
304
+ if (parents.length === 0)
305
+ return state;
306
+ const currentPos = state.layout.nodes.get(state.selectedId);
307
+ const currentCenter = currentPos ? currentPos.col + currentPos.width / 2 : 0;
308
+ const target = closestByCol(parents, currentCenter, state.layout.nodes);
309
+ return target ? updateSelection(state, target, adjacency, ctx) : state;
310
+ }
311
+ /**
312
+ * Select the sibling node to the left in the same layer.
313
+ * If nothing is selected, auto-selects the first root node.
314
+ *
315
+ * @param state - Current DAG pane state.
316
+ * @param ctx - Bijou context for re-rendering.
317
+ * @returns Updated state with new selection.
318
+ */
319
+ export function dagPaneSelectLeft(state, ctx) {
320
+ const adjacency = buildAdjacency(state.source);
321
+ if (!state.selectedId) {
322
+ const firstRoot = adjacency.roots[0];
323
+ return firstRoot ? updateSelection(state, firstRoot, adjacency, ctx) : state;
324
+ }
325
+ const currentPos = state.layout.nodes.get(state.selectedId);
326
+ if (!currentPos)
327
+ return state;
328
+ const siblings = nodesOnSameRow(currentPos.row, state.layout.nodes);
329
+ const idx = siblings.indexOf(state.selectedId);
330
+ if (idx <= 0)
331
+ return state; // already leftmost
332
+ return updateSelection(state, siblings[idx - 1], adjacency, ctx);
333
+ }
334
+ /**
335
+ * Select the sibling node to the right in the same layer.
336
+ * If nothing is selected, auto-selects the first root node.
337
+ *
338
+ * @param state - Current DAG pane state.
339
+ * @param ctx - Bijou context for re-rendering.
340
+ * @returns Updated state with new selection.
341
+ */
342
+ export function dagPaneSelectRight(state, ctx) {
343
+ const adjacency = buildAdjacency(state.source);
344
+ if (!state.selectedId) {
345
+ const firstRoot = adjacency.roots[0];
346
+ return firstRoot ? updateSelection(state, firstRoot, adjacency, ctx) : state;
347
+ }
348
+ const currentPos = state.layout.nodes.get(state.selectedId);
349
+ if (!currentPos)
350
+ return state;
351
+ const siblings = nodesOnSameRow(currentPos.row, state.layout.nodes);
352
+ const idx = siblings.indexOf(state.selectedId);
353
+ if (idx < 0 || idx >= siblings.length - 1)
354
+ return state; // already rightmost
355
+ return updateSelection(state, siblings[idx + 1], adjacency, ctx);
356
+ }
357
+ /**
358
+ * Select a specific node by ID.
359
+ * If the ID is not found in the layout, returns state unchanged (no selection).
360
+ *
361
+ * @param state - Current DAG pane state.
362
+ * @param nodeId - ID of the node to select.
363
+ * @param ctx - Bijou context for re-rendering.
364
+ * @returns Updated state with new selection.
365
+ */
366
+ export function dagPaneSelectNode(state, nodeId, ctx) {
367
+ if (!state.layout.nodes.has(nodeId)) {
368
+ return state;
369
+ }
370
+ const adjacency = buildAdjacency(state.source);
371
+ return updateSelection(state, nodeId, adjacency, ctx);
372
+ }
373
+ /**
374
+ * Clear the current selection.
375
+ *
376
+ * @param state - Current DAG pane state.
377
+ * @param ctx - Bijou context for re-rendering.
378
+ * @returns Updated state with no selection.
379
+ */
380
+ export function dagPaneClearSelection(state, ctx) {
381
+ const adjacency = buildAdjacency(state.source);
382
+ return updateSelection(state, undefined, adjacency, ctx);
383
+ }
384
+ // ---------------------------------------------------------------------------
385
+ // Scroll transformers
386
+ // ---------------------------------------------------------------------------
387
+ /**
388
+ * Scroll vertically by a relative amount.
389
+ *
390
+ * @param state - Current DAG pane state.
391
+ * @param dy - Relative vertical offset (positive = down).
392
+ * @returns Updated state.
393
+ */
394
+ export function dagPaneScrollBy(state, dy) {
395
+ return { ...state, focusArea: focusAreaScrollBy(state.focusArea, dy) };
396
+ }
397
+ /**
398
+ * Scroll to the top.
399
+ *
400
+ * @param state - Current DAG pane state.
401
+ * @returns Updated state.
402
+ */
403
+ export function dagPaneScrollToTop(state) {
404
+ return { ...state, focusArea: focusAreaScrollToTop(state.focusArea) };
405
+ }
406
+ /**
407
+ * Scroll to the bottom.
408
+ *
409
+ * @param state - Current DAG pane state.
410
+ * @returns Updated state.
411
+ */
412
+ export function dagPaneScrollToBottom(state) {
413
+ return { ...state, focusArea: focusAreaScrollToBottom(state.focusArea) };
414
+ }
415
+ /**
416
+ * Page down.
417
+ *
418
+ * @param state - Current DAG pane state.
419
+ * @returns Updated state.
420
+ */
421
+ export function dagPanePageDown(state) {
422
+ return { ...state, focusArea: focusAreaPageDown(state.focusArea) };
423
+ }
424
+ /**
425
+ * Page up.
426
+ *
427
+ * @param state - Current DAG pane state.
428
+ * @returns Updated state.
429
+ */
430
+ export function dagPanePageUp(state) {
431
+ return { ...state, focusArea: focusAreaPageUp(state.focusArea) };
432
+ }
433
+ /**
434
+ * Scroll horizontally by a relative amount.
435
+ *
436
+ * @param state - Current DAG pane state.
437
+ * @param dx - Relative horizontal offset (positive = right).
438
+ * @returns Updated state.
439
+ */
440
+ export function dagPaneScrollByX(state, dx) {
441
+ return { ...state, focusArea: focusAreaScrollByX(state.focusArea, dx) };
442
+ }
443
+ /**
444
+ * Replace the graph source and re-render. Clears selection.
445
+ *
446
+ * @param state - Current DAG pane state.
447
+ * @param source - New graph data source.
448
+ * @param ctx - Bijou context for re-rendering.
449
+ * @returns Updated state with new source and cleared selection.
450
+ */
451
+ export function dagPaneSetSource(state, source, ctx) {
452
+ const highlightPath = [];
453
+ const layout = renderLayout(source, undefined, highlightPath, state.dagOptions, ctx);
454
+ const fa = focusAreaSetContent(state.focusArea, layout.output);
455
+ return {
456
+ ...state,
457
+ source,
458
+ selectedId: undefined,
459
+ highlightPath,
460
+ layout,
461
+ focusArea: fa,
462
+ };
463
+ }
464
+ // ---------------------------------------------------------------------------
465
+ // Render
466
+ // ---------------------------------------------------------------------------
467
+ /**
468
+ * Render the DAG pane — focus area wrapping the DAG layout output.
469
+ *
470
+ * @param state - Current DAG pane state.
471
+ * @param options - Rendering options (focus, tokens, scrollbar, ctx).
472
+ * @returns Rendered DAG pane string.
473
+ */
474
+ export function dagPane(state, options) {
475
+ return focusArea(state.focusArea, options);
476
+ }
477
+ // ---------------------------------------------------------------------------
478
+ // Convenience keymap
479
+ // ---------------------------------------------------------------------------
480
+ /**
481
+ * Create a preconfigured KeyMap for DAG pane interaction.
482
+ *
483
+ * Arrow keys are bound to node selection. Vim keys (j/k/h/l) are bound
484
+ * to scroll. `Enter` confirms, `q`/`Ctrl+C` quits.
485
+ *
486
+ * @template Msg - Application message type dispatched by key bindings.
487
+ * @param actions - Map of actions to message values.
488
+ * @returns Preconfigured key map with DAG pane bindings.
489
+ */
490
+ export function dagPaneKeyMap(actions) {
491
+ return createKeyMap()
492
+ .group('Selection', (g) => g
493
+ .bind('up', 'Select parent', actions.selectParent)
494
+ .bind('down', 'Select child', actions.selectChild)
495
+ .bind('left', 'Select left', actions.selectLeft)
496
+ .bind('right', 'Select right', actions.selectRight))
497
+ .group('Scroll', (g) => g
498
+ .bind('j', 'Down', actions.scrollDown)
499
+ .bind('k', 'Up', actions.scrollUp)
500
+ .bind('h', 'Scroll left', actions.scrollLeft)
501
+ .bind('l', 'Scroll right', actions.scrollRight)
502
+ .bind('d', 'Page down', actions.pageDown)
503
+ .bind('u', 'Page up', actions.pageUp)
504
+ .bind('g', 'Top', actions.top)
505
+ .bind('shift+g', 'Bottom', actions.bottom))
506
+ .bind('enter', 'Confirm', actions.confirm)
507
+ .bind('q', 'Quit', actions.quit)
508
+ .bind('ctrl+c', 'Quit', actions.quit);
509
+ }
510
+ //# sourceMappingURL=dag-pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-pane.js","sourceRoot":"","sources":["../src/dag-pane.ts"],"names":[],"mappings":"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"}
package/dist/driver.d.ts CHANGED
@@ -16,16 +16,23 @@
16
16
  * ```
17
17
  */
18
18
  import type { App, RunOptions } from './types.js';
19
+ /** A single step in a scripted key sequence. */
19
20
  export interface ScriptStep {
20
21
  /** Key to send (raw terminal key string, e.g., 'a', '\x1b[A', '\x03'). */
21
22
  key: string;
22
23
  /** Milliseconds to wait before sending this key. Default: 0. */
23
24
  delay?: number;
24
25
  }
26
+ /** Options for {@link runScript}, extending the base {@link RunOptions}. */
25
27
  export interface RunScriptOptions extends RunOptions {
26
28
  /** Capture each rendered frame. */
27
29
  onFrame?: (frame: string, index: number) => void;
28
30
  }
31
+ /**
32
+ * Result returned by {@link runScript} after all steps have been processed.
33
+ *
34
+ * @template Model - The application model type.
35
+ */
29
36
  export interface RunScriptResult<Model> {
30
37
  /** Final model state after all steps. */
31
38
  model: Model;
@@ -50,6 +57,13 @@ export interface RunScriptResult<Model> {
50
57
  * Commands that use `setTimeout`, real I/O, or other macrotask-based async
51
58
  * may not have completed before the next key is dispatched. Use `delay`
52
59
  * on subsequent steps to allow time for macrotask-based commands.
60
+ *
61
+ * @template Model - The application model type.
62
+ * @template M - The message (action) type for the TEA update cycle.
63
+ * @param app - The TEA application definition (init, update, view).
64
+ * @param steps - Ordered key events to feed into the app.
65
+ * @param options - Optional callbacks and runtime configuration.
66
+ * @returns The final model, all rendered frames, and elapsed time.
53
67
  */
54
68
  export declare function runScript<Model, M>(app: App<Model, M>, steps: ScriptStep[], options?: RunScriptOptions): Promise<RunScriptResult<Model>>;
55
69
  //# sourceMappingURL=driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQlD,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,yCAAyC;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,CAAC,EACtC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAClB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAqEjC"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQlD,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,yCAAyC;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,CAAC,EACtC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAClB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAqEjC"}
package/dist/driver.js CHANGED
@@ -36,6 +36,13 @@ import { parseKey } from './keys.js';
36
36
  * Commands that use `setTimeout`, real I/O, or other macrotask-based async
37
37
  * may not have completed before the next key is dispatched. Use `delay`
38
38
  * on subsequent steps to allow time for macrotask-based commands.
39
+ *
40
+ * @template Model - The application model type.
41
+ * @template M - The message (action) type for the TEA update cycle.
42
+ * @param app - The TEA application definition (init, update, view).
43
+ * @param steps - Ordered key events to feed into the app.
44
+ * @param options - Optional callbacks and runtime configuration.
45
+ * @returns The final model, all rendered frames, and elapsed time.
39
46
  */
40
47
  export async function runScript(app, steps, options) {
41
48
  const start = Date.now();
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}