@flyingrobots/bijou-tui 1.8.0 → 3.0.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 (132) hide show
  1. package/README.md +64 -21
  2. package/dist/animate.d.ts +0 -2
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +17 -26
  5. package/dist/animate.js.map +1 -1
  6. package/dist/app-frame-actions.d.ts +37 -0
  7. package/dist/app-frame-actions.d.ts.map +1 -0
  8. package/dist/app-frame-actions.js +313 -0
  9. package/dist/app-frame-actions.js.map +1 -0
  10. package/dist/app-frame-palette.d.ts +16 -0
  11. package/dist/app-frame-palette.d.ts.map +1 -0
  12. package/dist/app-frame-palette.js +158 -0
  13. package/dist/app-frame-palette.js.map +1 -0
  14. package/dist/app-frame-render.d.ts +39 -0
  15. package/dist/app-frame-render.d.ts.map +1 -0
  16. package/dist/app-frame-render.js +319 -0
  17. package/dist/app-frame-render.js.map +1 -0
  18. package/dist/app-frame-types.d.ts +135 -0
  19. package/dist/app-frame-types.d.ts.map +1 -0
  20. package/dist/app-frame-types.js +72 -0
  21. package/dist/app-frame-types.js.map +1 -0
  22. package/dist/app-frame-utils.d.ts +37 -0
  23. package/dist/app-frame-utils.d.ts.map +1 -0
  24. package/dist/app-frame-utils.js +141 -0
  25. package/dist/app-frame-utils.js.map +1 -0
  26. package/dist/app-frame.d.ts +13 -8
  27. package/dist/app-frame.d.ts.map +1 -1
  28. package/dist/app-frame.js +80 -906
  29. package/dist/app-frame.js.map +1 -1
  30. package/dist/canvas.d.ts +37 -25
  31. package/dist/canvas.d.ts.map +1 -1
  32. package/dist/canvas.js +116 -30
  33. package/dist/canvas.js.map +1 -1
  34. package/dist/commands.js +2 -2
  35. package/dist/commands.js.map +1 -1
  36. package/dist/css/install.d.ts +4 -0
  37. package/dist/css/install.d.ts.map +1 -0
  38. package/dist/css/install.js +24 -0
  39. package/dist/css/install.js.map +1 -0
  40. package/dist/css/parser.d.ts +14 -0
  41. package/dist/css/parser.d.ts.map +1 -0
  42. package/dist/css/parser.js +92 -0
  43. package/dist/css/parser.js.map +1 -0
  44. package/dist/css/resolver.d.ts +36 -0
  45. package/dist/css/resolver.d.ts.map +1 -0
  46. package/dist/css/resolver.js +130 -0
  47. package/dist/css/resolver.js.map +1 -0
  48. package/dist/css/text-style.d.ts +17 -0
  49. package/dist/css/text-style.d.ts.map +1 -0
  50. package/dist/css/text-style.js +59 -0
  51. package/dist/css/text-style.js.map +1 -0
  52. package/dist/css/types.d.ts +27 -0
  53. package/dist/css/types.d.ts.map +1 -0
  54. package/dist/css/types.js +5 -0
  55. package/dist/css/types.js.map +1 -0
  56. package/dist/driver.d.ts +10 -2
  57. package/dist/driver.d.ts.map +1 -1
  58. package/dist/driver.js +25 -2
  59. package/dist/driver.js.map +1 -1
  60. package/dist/eventbus.d.ts +42 -3
  61. package/dist/eventbus.d.ts.map +1 -1
  62. package/dist/eventbus.js +108 -7
  63. package/dist/eventbus.js.map +1 -1
  64. package/dist/focus-area.d.ts +4 -0
  65. package/dist/focus-area.d.ts.map +1 -1
  66. package/dist/focus-area.js +11 -1
  67. package/dist/focus-area.js.map +1 -1
  68. package/dist/index.d.ts +11 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +18 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/layout-v3.d.ts +10 -0
  73. package/dist/layout-v3.d.ts.map +1 -0
  74. package/dist/layout-v3.js +35 -0
  75. package/dist/layout-v3.js.map +1 -0
  76. package/dist/motion/motion.d.ts +14 -0
  77. package/dist/motion/motion.d.ts.map +1 -0
  78. package/dist/motion/motion.js +31 -0
  79. package/dist/motion/motion.js.map +1 -0
  80. package/dist/motion/reconciler.d.ts +15 -0
  81. package/dist/motion/reconciler.d.ts.map +1 -0
  82. package/dist/motion/reconciler.js +109 -0
  83. package/dist/motion/reconciler.js.map +1 -0
  84. package/dist/motion/types.d.ts +52 -0
  85. package/dist/motion/types.d.ts.map +1 -0
  86. package/dist/motion/types.js +2 -0
  87. package/dist/motion/types.js.map +1 -0
  88. package/dist/pipeline/middleware/css.d.ts +20 -0
  89. package/dist/pipeline/middleware/css.d.ts.map +1 -0
  90. package/dist/pipeline/middleware/css.js +41 -0
  91. package/dist/pipeline/middleware/css.js.map +1 -0
  92. package/dist/pipeline/middleware/grayscale.d.ts +9 -0
  93. package/dist/pipeline/middleware/grayscale.d.ts.map +1 -0
  94. package/dist/pipeline/middleware/grayscale.js +39 -0
  95. package/dist/pipeline/middleware/grayscale.js.map +1 -0
  96. package/dist/pipeline/middleware/motion.d.ts +6 -0
  97. package/dist/pipeline/middleware/motion.d.ts.map +1 -0
  98. package/dist/pipeline/middleware/motion.js +19 -0
  99. package/dist/pipeline/middleware/motion.js.map +1 -0
  100. package/dist/pipeline/middleware/paint.d.ts +6 -0
  101. package/dist/pipeline/middleware/paint.d.ts.map +1 -0
  102. package/dist/pipeline/middleware/paint.js +21 -0
  103. package/dist/pipeline/middleware/paint.js.map +1 -0
  104. package/dist/pipeline/pipeline.d.ts +56 -0
  105. package/dist/pipeline/pipeline.d.ts.map +1 -0
  106. package/dist/pipeline/pipeline.js +45 -0
  107. package/dist/pipeline/pipeline.js.map +1 -0
  108. package/dist/runtime.d.ts +1 -1
  109. package/dist/runtime.d.ts.map +1 -1
  110. package/dist/runtime.js +153 -8
  111. package/dist/runtime.js.map +1 -1
  112. package/dist/screen.d.ts +12 -1
  113. package/dist/screen.d.ts.map +1 -1
  114. package/dist/screen.js +14 -1
  115. package/dist/screen.js.map +1 -1
  116. package/dist/subapp/mount.d.ts +67 -0
  117. package/dist/subapp/mount.d.ts.map +1 -0
  118. package/dist/subapp/mount.js +60 -0
  119. package/dist/subapp/mount.js.map +1 -0
  120. package/dist/transition-shaders.d.ts +101 -3
  121. package/dist/transition-shaders.d.ts.map +1 -1
  122. package/dist/transition-shaders.js +281 -6
  123. package/dist/transition-shaders.js.map +1 -1
  124. package/dist/types.d.ts +45 -8
  125. package/dist/types.d.ts.map +1 -1
  126. package/dist/types.js +9 -0
  127. package/dist/types.js.map +1 -1
  128. package/dist/view-output.d.ts +15 -0
  129. package/dist/view-output.d.ts.map +1 -0
  130. package/dist/view-output.js +53 -0
  131. package/dist/view-output.js.map +1 -0
  132. package/package.json +3 -3
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Command palette integration for `app-frame.ts`.
3
+ *
4
+ * Handles palette key routing, entry building, and palette state management.
5
+ */
6
+ import type { FramePage, CreateFramedAppOptions } from './app-frame.js';
7
+ import type { InternalFrameModel, FrameAction, PaletteAction, PaletteEntry } from './app-frame-types.js';
8
+ import type { Cmd, KeyMsg } from './types.js';
9
+ import type { KeyMap } from './keybindings.js';
10
+ /** Route a key press through the command palette, returning updated model and commands. */
11
+ export declare function handlePaletteKey<PageModel, Msg>(msg: KeyMsg, model: InternalFrameModel<PageModel, Msg>, paletteKeys: KeyMap<PaletteAction>, options: CreateFramedAppOptions<PageModel, Msg>, pagesById: Map<string, FramePage<PageModel, Msg>>): [InternalFrameModel<PageModel, Msg>, Cmd<Msg>[]];
12
+ /** Initialize the command palette with entries from frame, global, page key maps, and custom page command items. */
13
+ export declare function openCommandPalette<PageModel, Msg>(model: InternalFrameModel<PageModel, Msg>, frameKeys: KeyMap<FrameAction>, options: CreateFramedAppOptions<PageModel, Msg>, pagesById: Map<string, FramePage<PageModel, Msg>>): InternalFrameModel<PageModel, Msg>;
14
+ /** Collect all available commands from frame, global, page, and custom sources. */
15
+ export declare function buildPaletteEntries<PageModel, Msg>(model: InternalFrameModel<PageModel, Msg>, frameKeys: KeyMap<FrameAction>, options: CreateFramedAppOptions<PageModel, Msg>, pagesById: Map<string, FramePage<PageModel, Msg>>): readonly PaletteEntry<Msg>[];
16
+ //# sourceMappingURL=app-frame-palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-frame-palette.d.ts","sourceRoot":"","sources":["../src/app-frame-palette.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAY/C,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAC7C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,EACzC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,EAClC,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,EAC/C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAChD,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CA4DlD;AAED,oHAAoH;AACpH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAC/C,KAAK,EAAE,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,EACzC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EAC9B,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,EAC/C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAChD,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAQpC;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,EAChD,KAAK,EAAE,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,EACzC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EAC9B,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,EAC/C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAChD,SAAS,YAAY,CAAC,GAAG,CAAC,EAAE,CA+E9B"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Command palette integration for `app-frame.ts`.
3
+ *
4
+ * Handles palette key routing, entry building, and palette state management.
5
+ */
6
+ import { comboToMsg, emitMsg, emitMsgForPage } from './app-frame-types.js';
7
+ import { applyFrameAction } from './app-frame-actions.js';
8
+ import { formatKeyCombo } from './keybindings.js';
9
+ import { createCommandPaletteState, cpFilter, cpFocusNext, cpFocusPrev, cpPageDown, cpPageUp, cpSelectedItem, } from './command-palette.js';
10
+ /** Route a key press through the command palette, returning updated model and commands. */
11
+ export function handlePaletteKey(msg, model, paletteKeys, options, pagesById) {
12
+ const cp = model.commandPalette;
13
+ const action = paletteKeys.handle(msg);
14
+ if (action != null) {
15
+ switch (action.type) {
16
+ case 'cp-next':
17
+ return [{ ...model, commandPalette: cpFocusNext(cp) }, []];
18
+ case 'cp-prev':
19
+ return [{ ...model, commandPalette: cpFocusPrev(cp) }, []];
20
+ case 'cp-page-down':
21
+ return [{ ...model, commandPalette: cpPageDown(cp) }, []];
22
+ case 'cp-page-up':
23
+ return [{ ...model, commandPalette: cpPageUp(cp) }, []];
24
+ case 'cp-close':
25
+ return [{ ...model, commandPalette: undefined, commandPaletteEntries: undefined }, []];
26
+ case 'cp-select': {
27
+ const selected = cpSelectedItem(cp);
28
+ if (selected == null) {
29
+ return [{ ...model, commandPalette: undefined, commandPaletteEntries: undefined }, []];
30
+ }
31
+ const entry = model.commandPaletteEntries?.find((x) => x.id === selected.id);
32
+ if (entry?.frameAction != null) {
33
+ const closed = { ...model, commandPalette: undefined, commandPaletteEntries: undefined };
34
+ return applyFrameAction(entry.frameAction, closed, options, pagesById);
35
+ }
36
+ if (entry?.msgAction !== undefined) {
37
+ const cmd = entry.targetPageId != null
38
+ ? emitMsgForPage(entry.targetPageId, entry.msgAction)
39
+ : emitMsg(entry.msgAction);
40
+ return [{
41
+ ...model,
42
+ commandPalette: undefined,
43
+ commandPaletteEntries: undefined,
44
+ }, [cmd]];
45
+ }
46
+ return [{ ...model, commandPalette: undefined, commandPaletteEntries: undefined }, []];
47
+ }
48
+ }
49
+ }
50
+ if (msg.key === 'backspace') {
51
+ const next = cpFilter(cp, cp.query.slice(0, -1));
52
+ return [{ ...model, commandPalette: next }, []];
53
+ }
54
+ if (msg.ctrl && msg.key === 'c') {
55
+ return [{ ...model, commandPalette: undefined, commandPaletteEntries: undefined }, []];
56
+ }
57
+ if (!msg.ctrl && !msg.alt && !msg.shift && msg.key === 'q' && cp.query.length === 0) {
58
+ return [{ ...model, commandPalette: undefined, commandPaletteEntries: undefined }, []];
59
+ }
60
+ if (!msg.ctrl && !msg.alt && msg.key.length === 1) {
61
+ const next = cpFilter(cp, cp.query + msg.key);
62
+ return [{ ...model, commandPalette: next }, []];
63
+ }
64
+ return [model, []];
65
+ }
66
+ /** Initialize the command palette with entries from frame, global, page key maps, and custom page command items. */
67
+ export function openCommandPalette(model, frameKeys, options, pagesById) {
68
+ const entries = buildPaletteEntries(model, frameKeys, options, pagesById);
69
+ const items = entries.map((x) => x.item);
70
+ return {
71
+ ...model,
72
+ commandPalette: createCommandPaletteState(items, Math.max(5, Math.min(10, model.rows - 8))),
73
+ commandPaletteEntries: entries,
74
+ };
75
+ }
76
+ /** Collect all available commands from frame, global, page, and custom sources. */
77
+ export function buildPaletteEntries(model, frameKeys, options, pagesById) {
78
+ const entries = [];
79
+ let seq = 0;
80
+ for (const b of frameKeys.bindings()) {
81
+ if (!b.enabled)
82
+ continue;
83
+ const action = frameKeys.handle(comboToMsg(b));
84
+ if (action === undefined)
85
+ continue;
86
+ const id = `frame:${seq++}`;
87
+ entries.push({
88
+ id,
89
+ item: {
90
+ id,
91
+ label: b.description,
92
+ category: 'Frame',
93
+ shortcut: formatKeyCombo(b.combo),
94
+ },
95
+ frameAction: action,
96
+ });
97
+ }
98
+ const global = options.globalKeys;
99
+ if (global != null) {
100
+ for (const b of global.bindings()) {
101
+ if (!b.enabled)
102
+ continue;
103
+ const action = global.handle(comboToMsg(b));
104
+ if (action === undefined)
105
+ continue;
106
+ const id = `global:${seq++}`;
107
+ entries.push({
108
+ id,
109
+ item: {
110
+ id,
111
+ label: b.description,
112
+ category: 'Global',
113
+ shortcut: formatKeyCombo(b.combo),
114
+ },
115
+ msgAction: action,
116
+ });
117
+ }
118
+ }
119
+ const page = pagesById.get(model.activePageId);
120
+ if (page.keyMap != null) {
121
+ for (const b of page.keyMap.bindings()) {
122
+ if (!b.enabled)
123
+ continue;
124
+ const action = page.keyMap.handle(comboToMsg(b));
125
+ if (action === undefined)
126
+ continue;
127
+ const id = `page:${seq++}`;
128
+ entries.push({
129
+ id,
130
+ item: {
131
+ id,
132
+ label: b.description,
133
+ category: page.title,
134
+ shortcut: formatKeyCombo(b.combo),
135
+ },
136
+ msgAction: action,
137
+ targetPageId: model.activePageId,
138
+ });
139
+ }
140
+ }
141
+ if (page.commandItems != null) {
142
+ for (const item of page.commandItems(model.pageModels[model.activePageId])) {
143
+ const id = `custom:${seq++}`;
144
+ entries.push({
145
+ id,
146
+ item: {
147
+ ...item,
148
+ id,
149
+ category: item.category ?? page.title,
150
+ },
151
+ msgAction: item.action,
152
+ targetPageId: model.activePageId,
153
+ });
154
+ }
155
+ }
156
+ return entries;
157
+ }
158
+ //# sourceMappingURL=app-frame-palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-frame-palette.js","sourceRoot":"","sources":["../src/app-frame-palette.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Layout rendering for `app-frame.ts`.
3
+ *
4
+ * Recursive tree renderer, page content, maximized pane, header/help lines,
5
+ * transition shader, and string-to-grid tokenization.
6
+ */
7
+ import { type BijouContext } from '@flyingrobots/bijou';
8
+ import type { FrameLayoutNode, FramePage, CreateFramedAppOptions } from './app-frame.js';
9
+ import type { InternalFrameModel, RenderContext, RenderResult, FrameAction } from './app-frame-types.js';
10
+ import type { LayoutRect } from './layout-rect.js';
11
+ import type { PageTransition } from './app-frame.js';
12
+ import type { KeyMap } from './keybindings.js';
13
+ import { type ViewOutput } from './view-output.js';
14
+ /** Recursively render a layout tree node (pane, split, or grid) into a rect. */
15
+ export declare function renderFrameNode<PageModel, Msg>(node: FrameLayoutNode, rect: LayoutRect, ctx: RenderContext<PageModel, Msg>): RenderResult;
16
+ /** Render a placeholder for a grid area that has no matching cell definition. */
17
+ export declare function renderMissingGridCell(areaName: string, rect: LayoutRect): RenderResult;
18
+ /** Render a page's layout tree within the frame body rect. */
19
+ export declare function renderPageContent<PageModel, Msg>(pageId: string, model: InternalFrameModel<PageModel, Msg>, bodyRect: LayoutRect, pagesById: Map<string, FramePage<PageModel, Msg>>): RenderResult;
20
+ /** Render only the maximized pane at the full body rect. */
21
+ export declare function renderMaximizedPane<PageModel, Msg>(pageId: string, model: InternalFrameModel<PageModel, Msg>, bodyRect: LayoutRect, pagesById: Map<string, FramePage<PageModel, Msg>>, maximizedPaneId: string): RenderResult;
22
+ /** Render the top header line showing the app title and tab bar. */
23
+ export declare function renderHeaderLine<PageModel, Msg>(model: InternalFrameModel<PageModel, Msg>, options: CreateFramedAppOptions<PageModel, Msg>, pagesById: Map<string, FramePage<PageModel, Msg>>): string;
24
+ /** Render the bottom status line showing mode, focused pane, and key hints. */
25
+ export declare function renderHelpLine<PageModel, Msg>(model: InternalFrameModel<PageModel, Msg>, frameKeys: KeyMap<FrameAction>, options: CreateFramedAppOptions<PageModel, Msg>, activePage: FramePage<PageModel, Msg>): string;
26
+ /**
27
+ * Split a styled multiline string into a 2D grid of single-column characters.
28
+ * Each cell is a fully-styled string (including resets).
29
+ */
30
+ export declare function stringToGrid(str: string, width: number, height: number): string[][];
31
+ /**
32
+ * Apply a transition shader to blend between the previous and next page views.
33
+ *
34
+ * @param frame - Monotonic frame counter passed to shaders for temporal effects
35
+ * (glitch flickering, static noise). Defaults to 0 for stateless shaders.
36
+ */
37
+ export declare function renderTransition(prev: string, next: string, style: PageTransition, progress: number, width: number, height: number, ctx: BijouContext, frame?: number): string;
38
+ export declare function framePaneOutputToString(output: ViewOutput, width: number, height: number): string;
39
+ //# sourceMappingURL=app-frame-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-frame-render.d.ts","sourceRoot":"","sources":["../src/app-frame-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Layout rendering for `app-frame.ts`.
3
+ *
4
+ * Recursive tree renderer, page content, maximized pane, header/help lines,
5
+ * transition shader, and string-to-grid tokenization.
6
+ */
7
+ import { resolveSafeCtx, surfaceToString } from '@flyingrobots/bijou';
8
+ import { TRANSITION_SHADERS } from './transition-shaders.js';
9
+ import { fitBlock } from './layout-utils.js';
10
+ import { splitPane, splitPaneLayout } from './split-pane.js';
11
+ import { grid, gridLayout } from './grid.js';
12
+ import { createFocusAreaState, focusArea, focusAreaScrollTo, focusAreaScrollToX, } from './focus-area.js';
13
+ import { isMinimized, createPanelVisibilityState } from './panel-state.js';
14
+ import { createPanelDockState, resolveChildOrder, getNodeId } from './panel-dock.js';
15
+ import { tokenizeAnsi } from './viewport.js';
16
+ import { helpShort } from './help.js';
17
+ import { findPaneNode, isPaneMinimized, mergeMaps, offsetRect, fitLine, mergeBindingSources, } from './app-frame-utils.js';
18
+ import { normalizeViewOutput } from './view-output.js';
19
+ import { styleTextWithBCSS } from './css/text-style.js';
20
+ /** Recursively render a layout tree node (pane, split, or grid) into a rect. */
21
+ export function renderFrameNode(node, rect, ctx) {
22
+ if (rect.width <= 0 || rect.height <= 0) {
23
+ return { output: '', paneRects: new Map(), paneOrder: [] };
24
+ }
25
+ if (node.kind === 'pane') {
26
+ // Minimized pane: render as collapsed title bar
27
+ if (isMinimized(ctx.visibility, node.paneId)) {
28
+ const titleBar = `[${node.paneId}] \u25b8`; // ▸
29
+ const output = fitBlock(titleBar, rect.width, rect.height).join('\n');
30
+ return {
31
+ output,
32
+ paneRects: new Map([[node.paneId, rect]]),
33
+ paneOrder: [node.paneId],
34
+ };
35
+ }
36
+ const prior = ctx.scrollByPane[node.paneId] ?? { x: 0, y: 0 };
37
+ const content = framePaneOutputToString(node.render(rect.width, rect.height), rect.width, rect.height);
38
+ let state = createFocusAreaState({
39
+ content,
40
+ width: rect.width,
41
+ height: rect.height,
42
+ overflowX: node.overflowX ?? 'hidden',
43
+ });
44
+ state = focusAreaScrollTo(state, prior.y);
45
+ state = focusAreaScrollToX(state, prior.x);
46
+ const output = focusArea(state, {
47
+ focused: node.paneId === ctx.focusedPaneId,
48
+ ctx: resolveSafeCtx(),
49
+ id: node.paneId,
50
+ classes: [node.paneId === ctx.focusedPaneId ? 'focused' : 'unfocused'],
51
+ });
52
+ return {
53
+ output,
54
+ paneRects: new Map([[node.paneId, rect]]),
55
+ paneOrder: [node.paneId],
56
+ };
57
+ }
58
+ if (node.kind === 'split') {
59
+ const direction = node.direction ?? 'row';
60
+ // Consult dock state for child order
61
+ const defaultChildIds = [getNodeId(node.paneA), getNodeId(node.paneB)];
62
+ const resolvedOrder = resolveChildOrder(ctx.dockState, node.splitId, defaultChildIds);
63
+ const swapped = resolvedOrder[0] !== defaultChildIds[0];
64
+ const effectiveA = swapped ? node.paneB : node.paneA;
65
+ const effectiveB = swapped ? node.paneA : node.paneB;
66
+ // Check for minimized panes — give minimized pane 1 row, sibling gets rest
67
+ const aMinimized = isPaneMinimized(effectiveA, ctx.visibility);
68
+ const bMinimized = isPaneMinimized(effectiveB, ctx.visibility);
69
+ let splitState = node.state;
70
+ // Apply split ratio overrides from layout presets
71
+ const ratioOverride = ctx.model.splitRatioOverrides[ctx.pageId]?.[node.splitId];
72
+ if (ratioOverride !== undefined) {
73
+ splitState = { ...splitState, ratio: ratioOverride };
74
+ }
75
+ if (aMinimized && !bMinimized) {
76
+ // A is minimized: give it minimal space
77
+ const mainAxisTotal = direction === 'row' ? rect.width : rect.height;
78
+ const minimizedSize = Math.min(1, mainAxisTotal);
79
+ splitState = { ...splitState, ratio: minimizedSize / Math.max(1, mainAxisTotal) };
80
+ }
81
+ else if (bMinimized && !aMinimized) {
82
+ // B is minimized: give A most of the space
83
+ const mainAxisTotal = direction === 'row' ? rect.width : rect.height;
84
+ const minimizedSize = Math.min(1, mainAxisTotal);
85
+ splitState = { ...splitState, ratio: 1 - minimizedSize / Math.max(1, mainAxisTotal) };
86
+ }
87
+ const layout = splitPaneLayout(splitState, {
88
+ direction,
89
+ width: rect.width,
90
+ height: rect.height,
91
+ minA: node.minA,
92
+ minB: node.minB,
93
+ });
94
+ const aRect = offsetRect(layout.paneA, rect.row, rect.col);
95
+ const bRect = offsetRect(layout.paneB, rect.row, rect.col);
96
+ const a = renderFrameNode(effectiveA, aRect, ctx);
97
+ const b = renderFrameNode(effectiveB, bRect, ctx);
98
+ const output = splitPane(splitState, {
99
+ direction,
100
+ width: rect.width,
101
+ height: rect.height,
102
+ minA: node.minA,
103
+ minB: node.minB,
104
+ dividerChar: node.dividerChar,
105
+ paneA: () => a.output,
106
+ paneB: () => b.output,
107
+ });
108
+ return {
109
+ output,
110
+ paneRects: mergeMaps(a.paneRects, b.paneRects),
111
+ paneOrder: [...a.paneOrder, ...b.paneOrder],
112
+ };
113
+ }
114
+ const relRects = gridLayout({
115
+ width: rect.width,
116
+ height: rect.height,
117
+ columns: node.columns,
118
+ rows: node.rows,
119
+ areas: node.areas,
120
+ gap: node.gap,
121
+ });
122
+ const renderedByArea = new Map();
123
+ for (const [areaName, areaRect] of relRects) {
124
+ const absoluteAreaRect = offsetRect(areaRect, rect.row, rect.col);
125
+ const child = node.cells[areaName];
126
+ if (child == null) {
127
+ resolveSafeCtx()?.io.writeError(`createFramedApp: grid cell "${areaName}" missing in page "${ctx.pageId}" — rendering placeholder\n`);
128
+ renderedByArea.set(areaName, renderMissingGridCell(areaName, absoluteAreaRect));
129
+ continue;
130
+ }
131
+ renderedByArea.set(areaName, renderFrameNode(child, absoluteAreaRect, ctx));
132
+ }
133
+ const output = grid({
134
+ width: rect.width,
135
+ height: rect.height,
136
+ columns: node.columns,
137
+ rows: node.rows,
138
+ areas: node.areas,
139
+ gap: node.gap,
140
+ cells: Object.fromEntries([...renderedByArea.entries()].map(([name, rendered]) => [name, () => rendered.output])),
141
+ });
142
+ let paneRects = new Map();
143
+ const seenPaneIds = new Set();
144
+ const paneOrder = [];
145
+ for (const rendered of renderedByArea.values()) {
146
+ for (const [paneId, paneRect] of rendered.paneRects.entries()) {
147
+ if (paneRects.has(paneId)) {
148
+ throw new Error(`createFramedApp: duplicate paneId "${paneId}" in rendered layout`);
149
+ }
150
+ paneRects.set(paneId, paneRect);
151
+ }
152
+ for (const paneId of rendered.paneOrder) {
153
+ if (seenPaneIds.has(paneId)) {
154
+ throw new Error(`createFramedApp: duplicate paneId "${paneId}" in rendered pane order`);
155
+ }
156
+ seenPaneIds.add(paneId);
157
+ paneOrder.push(paneId);
158
+ }
159
+ }
160
+ return { output, paneRects, paneOrder };
161
+ }
162
+ /** Render a placeholder for a grid area that has no matching cell definition. */
163
+ export function renderMissingGridCell(areaName, rect) {
164
+ return {
165
+ output: fitBlock(`[missing grid cell: ${areaName}]`, rect.width, rect.height).join('\n'),
166
+ paneRects: new Map(),
167
+ paneOrder: [],
168
+ };
169
+ }
170
+ /** Render a page's layout tree within the frame body rect. */
171
+ export function renderPageContent(pageId, model, bodyRect, pagesById) {
172
+ const page = pagesById.get(pageId);
173
+ const pageModel = model.pageModels[pageId];
174
+ const renderCtx = {
175
+ model,
176
+ pageId,
177
+ focusedPaneId: model.focusedPaneByPage[pageId],
178
+ scrollByPane: model.scrollByPage[pageId] ?? {},
179
+ visibility: model.minimizedByPage[pageId] ?? createPanelVisibilityState(),
180
+ dockState: model.dockStateByPage[pageId] ?? createPanelDockState(),
181
+ };
182
+ return renderFrameNode(page.layout(pageModel), bodyRect, renderCtx);
183
+ }
184
+ /** Render only the maximized pane at the full body rect. */
185
+ export function renderMaximizedPane(pageId, model, bodyRect, pagesById, maximizedPaneId) {
186
+ const page = pagesById.get(pageId);
187
+ const pageModel = model.pageModels[pageId];
188
+ const layoutTree = page.layout(pageModel);
189
+ const paneNode = findPaneNode(layoutTree, maximizedPaneId);
190
+ if (paneNode == null) {
191
+ // Pane not found, fall back to normal rendering
192
+ return renderPageContent(pageId, model, bodyRect, pagesById);
193
+ }
194
+ const prior = model.scrollByPage[pageId]?.[maximizedPaneId] ?? { x: 0, y: 0 };
195
+ const content = framePaneOutputToString(paneNode.render(bodyRect.width, bodyRect.height), bodyRect.width, bodyRect.height);
196
+ let state = createFocusAreaState({
197
+ content,
198
+ width: bodyRect.width,
199
+ height: bodyRect.height,
200
+ overflowX: paneNode.overflowX ?? 'hidden',
201
+ });
202
+ state = focusAreaScrollTo(state, prior.y);
203
+ state = focusAreaScrollToX(state, prior.x);
204
+ const output = focusArea(state, {
205
+ focused: true,
206
+ ctx: resolveSafeCtx(),
207
+ id: maximizedPaneId,
208
+ classes: ['focused', 'maximized'],
209
+ });
210
+ return {
211
+ output,
212
+ paneRects: new Map([[maximizedPaneId, bodyRect]]),
213
+ paneOrder: [maximizedPaneId],
214
+ };
215
+ }
216
+ /** Render the top header line showing the app title and tab bar. */
217
+ export function renderHeaderLine(model, options, pagesById) {
218
+ const title = options.title ?? 'App';
219
+ const tabs = model.pageOrder.map((id) => {
220
+ const page = pagesById.get(id);
221
+ return id === model.activePageId ? `[${page.title}]` : ` ${page.title} `;
222
+ }).join(' ');
223
+ const line = fitLine(`${title} ${tabs}`, model.columns);
224
+ return styleTextWithBCSS(line, resolveSafeCtx(), {
225
+ type: 'FrameHeader',
226
+ id: 'frame-header',
227
+ classes: [`page-${model.activePageId}`],
228
+ });
229
+ }
230
+ /** Render the bottom status line showing mode, focused pane, and key hints. */
231
+ export function renderHelpLine(model, frameKeys, options, activePage) {
232
+ const mode = model.commandPalette != null
233
+ ? 'PALETTE'
234
+ : model.helpOpen
235
+ ? 'HELP'
236
+ : 'NORMAL';
237
+ const focusedPane = model.focusedPaneByPage[model.activePageId] ?? '-';
238
+ const status = `[${mode}] page:${model.activePageId} pane:${focusedPane}`;
239
+ const source = mergeBindingSources(frameKeys, options.globalKeys, activePage.helpSource ?? activePage.keyMap);
240
+ const hint = helpShort(source);
241
+ const line = hint.length > 0
242
+ ? ` ${status} ${hint}`
243
+ : ` ${status}`;
244
+ return styleTextWithBCSS(fitLine(line, model.columns), resolveSafeCtx(), {
245
+ type: 'FrameHelp',
246
+ id: 'frame-help',
247
+ classes: [`mode-${mode.toLowerCase()}`, `page-${model.activePageId}`],
248
+ });
249
+ }
250
+ /**
251
+ * Split a styled multiline string into a 2D grid of single-column characters.
252
+ * Each cell is a fully-styled string (including resets).
253
+ */
254
+ export function stringToGrid(str, width, height) {
255
+ const lines = str.split('\n');
256
+ const grid = [];
257
+ for (let y = 0; y < height; y++) {
258
+ const line = lines[y] ?? '';
259
+ grid.push(tokenizeAnsi(line, width));
260
+ }
261
+ return grid;
262
+ }
263
+ /**
264
+ * Apply a transition shader to blend between the previous and next page views.
265
+ *
266
+ * @param frame - Monotonic frame counter passed to shaders for temporal effects
267
+ * (glitch flickering, static noise). Defaults to 0 for stateless shaders.
268
+ */
269
+ export function renderTransition(prev, next, style, progress, width, height, ctx, frame = 0) {
270
+ const shader = typeof style === 'function' ? style : TRANSITION_SHADERS[style];
271
+ if (!shader)
272
+ return next;
273
+ if (width <= 0 || height <= 0)
274
+ return next;
275
+ const prevGrid = stringToGrid(prev, width, height);
276
+ const nextGrid = stringToGrid(next, width, height);
277
+ const lines = [];
278
+ for (let y = 0; y < height; y++) {
279
+ let line = '';
280
+ for (let x = 0; x < width; x++) {
281
+ // Shared stable-ish pseudo-random seed based on coordinates
282
+ const seed = Math.sin(x * 12.9898 + y * 78.233) * 43758.5453;
283
+ const rand = seed - Math.floor(seed);
284
+ const result = shader({ x, y, width, height, progress, rand, frame, ctx });
285
+ const showNext = result.showNext;
286
+ const charOverride = result.char;
287
+ if (charOverride !== undefined) {
288
+ line += charOverride;
289
+ }
290
+ else {
291
+ line += (showNext ? nextGrid[y]?.[x] : prevGrid[y]?.[x]) ?? ' ';
292
+ }
293
+ }
294
+ lines.push(line);
295
+ }
296
+ return lines.join('\n');
297
+ }
298
+ export function framePaneOutputToString(output, width, height) {
299
+ if (typeof output === 'string')
300
+ return output;
301
+ const surface = normalizeViewOutput(output, { width, height }).surface;
302
+ const ctx = resolveSafeCtx();
303
+ if (ctx?.style) {
304
+ return surfaceToString(surface, ctx.style);
305
+ }
306
+ return surfaceToPlainText(surface);
307
+ }
308
+ function surfaceToPlainText(surface) {
309
+ const lines = [];
310
+ for (let y = 0; y < surface.height; y++) {
311
+ let line = '';
312
+ for (let x = 0; x < surface.width; x++) {
313
+ line += surface.get(x, y).char;
314
+ }
315
+ lines.push(line);
316
+ }
317
+ return lines.join('\n');
318
+ }
319
+ //# sourceMappingURL=app-frame-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-frame-render.js","sourceRoot":"","sources":["../src/app-frame-render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAmC,MAAM,qBAAqB,CAAC;AAKvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,OAAO,EACP,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAmB,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAC7B,IAAqB,EACrB,IAAgB,EAChB,GAAkC;IAElC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,gDAAgD;QAChD,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,IAAI;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,OAAO;gBACL,MAAM;gBACN,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;gBACzC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;aACzB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvG,IAAI,KAAK,GAAG,oBAAoB,CAAC;YAC/B,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ;SACtC,CAAC,CAAC;QACH,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE;YAC9B,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,aAAa;YAC1C,GAAG,EAAE,cAAc,EAAE;YACrB,EAAE,EAAE,IAAI,CAAC,MAAM;YACf,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;SACvE,CAAC,CAAC;QACH,OAAO;YACL,MAAM;YACN,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACzC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QAE1C,qCAAqC;QACrC,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAErD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QAE/D,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,kDAAkD;QAClD,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QACvD,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,wCAAwC;YACxC,MAAM,aAAa,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACrE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACjD,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;QACpF,CAAC;aAAM,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,2CAA2C;YAC3C,MAAM,aAAa,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACrE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACjD,UAAU,GAAG,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;QACxF,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE;YACzC,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3D,MAAM,CAAC,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE;YACnC,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM;YACrB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM;YACN,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;YAC9C,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IACvD,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,cAAc,EAAE,EAAE,EAAE,CAAC,UAAU,CAC7B,+BAA+B,QAAQ,sBAAsB,GAAG,CAAC,MAAM,6BAA6B,CACrG,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;KAClH,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,sBAAsB,CAAC,CAAC;YACtF,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,0BAA0B,CAAC,CAAC;YAC1F,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC1C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAgB;IACtE,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,uBAAuB,QAAQ,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxF,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,KAAyC,EACzC,QAAoB,EACpB,SAAiD;IAEjD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAE,CAAC;IAC5C,MAAM,SAAS,GAAkC;QAC/C,KAAK;QACL,MAAM;QACN,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC9C,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE;QAC9C,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,0BAA0B,EAAE;QACzE,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,oBAAoB,EAAE;KACnE,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAAyC,EACzC,QAAoB,EACpB,SAAiD,EACjD,eAAuB;IAEvB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC3D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,gDAAgD;QAChD,OAAO,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3H,IAAI,KAAK,GAAG,oBAAoB,CAAC;QAC/B,OAAO;QACP,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,QAAQ;KAC1C,CAAC,CAAC;IACH,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9B,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,cAAc,EAAE;QACrB,EAAE,EAAE,eAAe;QACnB,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;KAClC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjD,SAAS,EAAE,CAAC,eAAe,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAC9B,KAAyC,EACzC,OAA+C,EAC/C,SAAiD;IAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAChC,OAAO,EAAE,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;IAC3E,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE;QAC/C,IAAI,EAAE,aAAa;QACnB,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,CAAC,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC;KACxC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAC5B,KAAyC,EACzC,SAA8B,EAC9B,OAA+C,EAC/C,UAAqC;IAErC,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI;QACvC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,QAAQ;YACd,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ,CAAC;IACf,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,IAAI,UAAU,KAAK,CAAC,YAAY,SAAS,WAAW,EAAE,CAAC;IAE1E,MAAM,MAAM,GAAG,mBAAmB,CAChC,SAAS,EACT,OAAO,CAAC,UAAU,EAClB,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAC3C,CAAC;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE;QACvB,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;IACjB,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,EAAE;QACvE,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IACrE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,IAAY,EACZ,KAAqB,EACrB,QAAgB,EAChB,KAAa,EACb,MAAc,EACd,GAAiB,EACjB,KAAK,GAAG,CAAC;IAET,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,4DAA4D;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC;YAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAErC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;YAEjC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,IAAI,YAAY,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClE,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAkB,EAAE,KAAa,EAAE,MAAc;IACvF,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAE9C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IACvE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}