@xyne/workflow-ui 1.3.9 → 1.3.11

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 (217) hide show
  1. package/dist/components/builder/AddStepButton.d.ts +6 -0
  2. package/dist/components/builder/AddStepButton.d.ts.map +1 -0
  3. package/dist/components/builder/AddStepButton.js +7 -0
  4. package/dist/components/builder/AddStepButton.js.map +1 -0
  5. package/dist/components/builder/BranchEdge.d.ts +3 -0
  6. package/dist/components/builder/BranchEdge.d.ts.map +1 -0
  7. package/dist/components/builder/BranchEdge.js +19 -0
  8. package/dist/components/builder/BranchEdge.js.map +1 -0
  9. package/dist/components/builder/BuilderToolbar.d.ts +10 -0
  10. package/dist/components/builder/BuilderToolbar.d.ts.map +1 -0
  11. package/dist/components/builder/BuilderToolbar.js +16 -0
  12. package/dist/components/builder/BuilderToolbar.js.map +1 -0
  13. package/dist/components/builder/StepConfigDrawer.d.ts +11 -0
  14. package/dist/components/builder/StepConfigDrawer.d.ts.map +1 -0
  15. package/dist/components/builder/StepConfigDrawer.js +21 -0
  16. package/dist/components/builder/StepConfigDrawer.js.map +1 -0
  17. package/dist/components/builder/StepNode.d.ts +15 -0
  18. package/dist/components/builder/StepNode.d.ts.map +1 -0
  19. package/dist/components/builder/StepNode.js +56 -0
  20. package/dist/components/builder/StepNode.js.map +1 -0
  21. package/dist/components/builder/StepPalette.d.ts +7 -0
  22. package/dist/components/builder/StepPalette.d.ts.map +1 -0
  23. package/dist/components/builder/StepPalette.js +83 -0
  24. package/dist/components/builder/StepPalette.js.map +1 -0
  25. package/dist/components/builder/StepPicker.d.ts +9 -0
  26. package/dist/components/builder/StepPicker.d.ts.map +1 -0
  27. package/dist/components/builder/StepPicker.js +95 -0
  28. package/dist/components/builder/StepPicker.js.map +1 -0
  29. package/dist/components/builder/TriggerConfigPanel.d.ts +10 -0
  30. package/dist/components/builder/TriggerConfigPanel.d.ts.map +1 -0
  31. package/dist/components/builder/TriggerConfigPanel.js +49 -0
  32. package/dist/components/builder/TriggerConfigPanel.js.map +1 -0
  33. package/dist/components/builder/TriggerNode.d.ts +9 -0
  34. package/dist/components/builder/TriggerNode.d.ts.map +1 -0
  35. package/dist/components/builder/TriggerNode.js +30 -0
  36. package/dist/components/builder/TriggerNode.js.map +1 -0
  37. package/dist/components/builder/TriggerPicker.d.ts +8 -0
  38. package/dist/components/builder/TriggerPicker.d.ts.map +1 -0
  39. package/dist/components/builder/TriggerPicker.js +61 -0
  40. package/dist/components/builder/TriggerPicker.js.map +1 -0
  41. package/dist/components/builder/WorkflowBuilder.d.ts +20 -0
  42. package/dist/components/builder/WorkflowBuilder.d.ts.map +1 -0
  43. package/dist/components/builder/WorkflowBuilder.js +157 -0
  44. package/dist/components/builder/WorkflowBuilder.js.map +1 -0
  45. package/dist/components/builder/edge-types.d.ts +3 -0
  46. package/dist/components/builder/edge-types.d.ts.map +1 -0
  47. package/dist/components/builder/edge-types.js +5 -0
  48. package/dist/components/builder/edge-types.js.map +1 -0
  49. package/dist/components/builder/node-types.d.ts +3 -0
  50. package/dist/components/builder/node-types.d.ts.map +1 -0
  51. package/dist/components/builder/node-types.js +11 -0
  52. package/dist/components/builder/node-types.js.map +1 -0
  53. package/dist/components/builder/v2/AddStepButton.d.ts +6 -0
  54. package/dist/components/builder/v2/AddStepButton.d.ts.map +1 -0
  55. package/dist/components/builder/v2/AddStepButton.js +6 -0
  56. package/dist/components/builder/v2/AddStepButton.js.map +1 -0
  57. package/dist/components/builder/v2/BranchEdge.d.ts +3 -0
  58. package/dist/components/builder/v2/BranchEdge.d.ts.map +1 -0
  59. package/dist/components/builder/v2/BranchEdge.js +46 -0
  60. package/dist/components/builder/v2/BranchEdge.js.map +1 -0
  61. package/dist/components/builder/v2/LoopBodyEdge.d.ts +7 -0
  62. package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +1 -0
  63. package/dist/components/builder/v2/LoopBodyEdge.js +19 -0
  64. package/dist/components/builder/v2/LoopBodyEdge.js.map +1 -0
  65. package/dist/components/builder/v2/LoopbackEdge.d.ts +10 -0
  66. package/dist/components/builder/v2/LoopbackEdge.d.ts.map +1 -0
  67. package/dist/components/builder/v2/LoopbackEdge.js +26 -0
  68. package/dist/components/builder/v2/LoopbackEdge.js.map +1 -0
  69. package/dist/components/builder/v2/StepNode.d.ts +21 -0
  70. package/dist/components/builder/v2/StepNode.d.ts.map +1 -0
  71. package/dist/components/builder/v2/StepNode.js +36 -0
  72. package/dist/components/builder/v2/StepNode.js.map +1 -0
  73. package/dist/components/builder/v2/StepPicker.d.ts +8 -0
  74. package/dist/components/builder/v2/StepPicker.d.ts.map +1 -0
  75. package/dist/components/builder/v2/StepPicker.js +73 -0
  76. package/dist/components/builder/v2/StepPicker.js.map +1 -0
  77. package/dist/components/builder/v2/TerminalNode.d.ts +6 -0
  78. package/dist/components/builder/v2/TerminalNode.d.ts.map +1 -0
  79. package/dist/components/builder/v2/TerminalNode.js +7 -0
  80. package/dist/components/builder/v2/TerminalNode.js.map +1 -0
  81. package/dist/components/builder/v2/TriggerNode.d.ts +10 -0
  82. package/dist/components/builder/v2/TriggerNode.d.ts.map +1 -0
  83. package/dist/components/builder/v2/TriggerNode.js +20 -0
  84. package/dist/components/builder/v2/TriggerNode.js.map +1 -0
  85. package/dist/components/builder/v2/TriggerPicker.d.ts +7 -0
  86. package/dist/components/builder/v2/TriggerPicker.d.ts.map +1 -0
  87. package/dist/components/builder/v2/TriggerPicker.js +45 -0
  88. package/dist/components/builder/v2/TriggerPicker.js.map +1 -0
  89. package/dist/components/builder/v2/WorkflowBuilder.d.ts +14 -0
  90. package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +1 -0
  91. package/dist/components/builder/v2/WorkflowBuilder.js +189 -0
  92. package/dist/components/builder/v2/WorkflowBuilder.js.map +1 -0
  93. package/dist/components/builder/v2/edge-types.d.ts +3 -0
  94. package/dist/components/builder/v2/edge-types.d.ts.map +1 -0
  95. package/dist/components/builder/v2/edge-types.js +9 -0
  96. package/dist/components/builder/v2/edge-types.js.map +1 -0
  97. package/dist/components/builder/v2/icons.d.ts +25 -0
  98. package/dist/components/builder/v2/icons.d.ts.map +1 -0
  99. package/dist/components/builder/v2/icons.js +43 -0
  100. package/dist/components/builder/v2/icons.js.map +1 -0
  101. package/dist/components/builder/v2/layout-engine.d.ts +76 -0
  102. package/dist/components/builder/v2/layout-engine.d.ts.map +1 -0
  103. package/dist/components/builder/v2/layout-engine.js +465 -0
  104. package/dist/components/builder/v2/layout-engine.js.map +1 -0
  105. package/dist/components/builder/v2/node-types.d.ts +3 -0
  106. package/dist/components/builder/v2/node-types.d.ts.map +1 -0
  107. package/dist/components/builder/v2/node-types.js +11 -0
  108. package/dist/components/builder/v2/node-types.js.map +1 -0
  109. package/dist/components/builder/v2/theme.d.ts +28 -0
  110. package/dist/components/builder/v2/theme.d.ts.map +1 -0
  111. package/dist/components/builder/v2/theme.js +63 -0
  112. package/dist/components/builder/v2/theme.js.map +1 -0
  113. package/dist/components/builder/v3/CitationEditor.d.ts.map +1 -1
  114. package/dist/components/builder/v3/CitationEditor.js +10 -1
  115. package/dist/components/builder/v3/CitationEditor.js.map +1 -1
  116. package/dist/components/builder/v3/VariablePickerPopover.d.ts +1 -1
  117. package/dist/components/builder/v3/VariablePickerPopover.d.ts.map +1 -1
  118. package/dist/components/builder/v3/VariablePickerPopover.js +3 -3
  119. package/dist/components/builder/v3/VariablePickerPopover.js.map +1 -1
  120. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +11 -0
  121. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +1 -0
  122. package/dist/components/dashboard/WorkflowSummaryEditor.js +46 -0
  123. package/dist/components/dashboard/WorkflowSummaryEditor.js.map +1 -0
  124. package/dist/components/execution/ExecutionEdge.d.ts +4 -0
  125. package/dist/components/execution/ExecutionEdge.d.ts.map +1 -0
  126. package/dist/components/execution/ExecutionEdge.js +27 -0
  127. package/dist/components/execution/ExecutionEdge.js.map +1 -0
  128. package/dist/components/execution/ExecutionHeader.d.ts +2 -2
  129. package/dist/components/execution/ExecutionHeader.d.ts.map +1 -1
  130. package/dist/components/execution/ExecutionHeader.js +4 -2
  131. package/dist/components/execution/ExecutionHeader.js.map +1 -1
  132. package/dist/components/execution/ExecutionJourney.d.ts.map +1 -1
  133. package/dist/components/execution/ExecutionJourney.js +1 -248
  134. package/dist/components/execution/ExecutionJourney.js.map +1 -1
  135. package/dist/components/execution/ExecutionStepNode.d.ts +14 -0
  136. package/dist/components/execution/ExecutionStepNode.d.ts.map +1 -0
  137. package/dist/components/execution/ExecutionStepNode.js +47 -0
  138. package/dist/components/execution/ExecutionStepNode.js.map +1 -0
  139. package/dist/components/execution/ExecutionTabs.d.ts +34 -0
  140. package/dist/components/execution/ExecutionTabs.d.ts.map +1 -0
  141. package/dist/components/execution/ExecutionTabs.js +257 -0
  142. package/dist/components/execution/ExecutionTabs.js.map +1 -0
  143. package/dist/components/execution/ExecutionTriggerNode.d.ts +9 -0
  144. package/dist/components/execution/ExecutionTriggerNode.d.ts.map +1 -0
  145. package/dist/components/execution/ExecutionTriggerNode.js +15 -0
  146. package/dist/components/execution/ExecutionTriggerNode.js.map +1 -0
  147. package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
  148. package/dist/components/execution/ExecutionViewer.js +3 -2
  149. package/dist/components/execution/ExecutionViewer.js.map +1 -1
  150. package/dist/components/execution/StepAgentPanels.d.ts +9 -0
  151. package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
  152. package/dist/components/execution/StepAgentPanels.js +133 -0
  153. package/dist/components/execution/StepAgentPanels.js.map +1 -0
  154. package/dist/components/execution/execution-layout.d.ts +31 -0
  155. package/dist/components/execution/execution-layout.d.ts.map +1 -0
  156. package/dist/components/execution/execution-layout.js +90 -0
  157. package/dist/components/execution/execution-layout.js.map +1 -0
  158. package/dist/components/execution/journey-model.d.ts +112 -0
  159. package/dist/components/execution/journey-model.d.ts.map +1 -0
  160. package/dist/components/execution/journey-model.js +277 -0
  161. package/dist/components/execution/journey-model.js.map +1 -0
  162. package/dist/components/execution/origin/OriginTrace.d.ts.map +1 -1
  163. package/dist/components/execution/origin/OriginTrace.js +66 -29
  164. package/dist/components/execution/origin/OriginTrace.js.map +1 -1
  165. package/dist/components/shared/AttachmentCard.d.ts +6 -0
  166. package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
  167. package/dist/components/shared/AttachmentCard.js +99 -5
  168. package/dist/components/shared/AttachmentCard.js.map +1 -1
  169. package/dist/components/shared/DocumentViewer.d.ts +4 -2
  170. package/dist/components/shared/DocumentViewer.d.ts.map +1 -1
  171. package/dist/components/shared/DocumentViewer.js +8 -8
  172. package/dist/components/shared/DocumentViewer.js.map +1 -1
  173. package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
  174. package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
  175. package/dist/components/shared/JsonTreeViewer.js +46 -0
  176. package/dist/components/shared/JsonTreeViewer.js.map +1 -0
  177. package/dist/components/shared/viewers/PdfView.d.ts +38 -0
  178. package/dist/components/shared/viewers/PdfView.d.ts.map +1 -0
  179. package/dist/components/shared/viewers/PdfView.js +439 -0
  180. package/dist/components/shared/viewers/PdfView.js.map +1 -0
  181. package/dist/hooks/use-execution-viewer.d.ts.map +1 -1
  182. package/dist/hooks/use-execution-viewer.js +17 -1
  183. package/dist/hooks/use-execution-viewer.js.map +1 -1
  184. package/dist/layout-engine/components.d.ts +5 -0
  185. package/dist/layout-engine/components.d.ts.map +1 -0
  186. package/dist/layout-engine/components.js +171 -0
  187. package/dist/layout-engine/components.js.map +1 -0
  188. package/dist/layout-engine/evaluate.d.ts +9 -0
  189. package/dist/layout-engine/evaluate.d.ts.map +1 -0
  190. package/dist/layout-engine/evaluate.js +66 -0
  191. package/dist/layout-engine/evaluate.js.map +1 -0
  192. package/dist/layout-engine/index.d.ts +22 -0
  193. package/dist/layout-engine/index.d.ts.map +1 -0
  194. package/dist/layout-engine/index.js +22 -0
  195. package/dist/layout-engine/index.js.map +1 -0
  196. package/dist/layout-engine/parse.d.ts +9 -0
  197. package/dist/layout-engine/parse.d.ts.map +1 -0
  198. package/dist/layout-engine/parse.js +213 -0
  199. package/dist/layout-engine/parse.js.map +1 -0
  200. package/dist/layout-engine/render.d.ts +5 -0
  201. package/dist/layout-engine/render.d.ts.map +1 -0
  202. package/dist/layout-engine/render.js +150 -0
  203. package/dist/layout-engine/render.js.map +1 -0
  204. package/dist/layout-engine/types.d.ts +65 -0
  205. package/dist/layout-engine/types.d.ts.map +1 -0
  206. package/dist/layout-engine/types.js +11 -0
  207. package/dist/layout-engine/types.js.map +1 -0
  208. package/dist/styles.css +8 -2
  209. package/package.json +2 -1
  210. package/dist/components/schema-form/AttachmentField.d.ts +0 -16
  211. package/dist/components/schema-form/AttachmentField.d.ts.map +0 -1
  212. package/dist/components/schema-form/AttachmentField.js +0 -139
  213. package/dist/components/schema-form/AttachmentField.js.map +0 -1
  214. package/dist/utils/map-lanes.d.ts +0 -35
  215. package/dist/utils/map-lanes.d.ts.map +0 -1
  216. package/dist/utils/map-lanes.js +0 -48
  217. package/dist/utils/map-lanes.js.map +0 -1
@@ -0,0 +1,171 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DisplayValue, isAttachment, isAttachmentArray } from '../components/shared/AttachmentCard.js';
3
+ import { MarkdownView } from '../components/shared/MarkdownView.js';
4
+ import { cn } from '../components/shared/cn.js';
5
+ /**
6
+ * The whitelisted layout components a template may use. Structure only — every
7
+ * visual style is baked here (on --wui tokens), so a template never carries CSS.
8
+ */
9
+ const str = (v) => (v == null ? undefined : String(v));
10
+ const num = (v) => {
11
+ if (typeof v === 'number')
12
+ return v;
13
+ if (v == null || v === '')
14
+ return undefined;
15
+ const n = Number(v);
16
+ return Number.isNaN(n) ? undefined : n;
17
+ };
18
+ const isObj = (v) => v !== null && typeof v === 'object' && !Array.isArray(v) && !isAttachment(v) && !isAttachmentArray(v);
19
+ function humanize(key) {
20
+ return key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').replace(/\s+/g, ' ').trim().replace(/\b\w/g, (c) => c.toUpperCase());
21
+ }
22
+ // ─── Value — the smart auto-renderer used everywhere a raw value lands ───
23
+ function ValueView({ value }) {
24
+ if (value === null || value === undefined || value === '')
25
+ return _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "\u2014" });
26
+ if (typeof value === 'boolean')
27
+ return _jsx("span", { className: "font-medium text-[var(--wui-fg)]", children: value ? 'Yes' : 'No' });
28
+ if (typeof value === 'number')
29
+ return _jsx("span", { className: "font-medium tabular-nums text-[var(--wui-fg)]", children: value.toLocaleString() });
30
+ if (isAttachment(value) || isAttachmentArray(value))
31
+ return _jsx(DisplayValue, { value: value });
32
+ if (Array.isArray(value)) {
33
+ if (value.length === 0)
34
+ return _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "None" });
35
+ if (value.every((v) => !isObj(v) && !Array.isArray(v))) {
36
+ const items = value.map((v) => String(v));
37
+ // Short scalars → tag chips; sentence-length strings → a readable bulleted list
38
+ // (a long sentence stuffed into a chip looks wrong).
39
+ if (items.every((s) => s.length <= 24)) {
40
+ return _jsx("div", { className: "flex flex-wrap gap-1.5", children: items.map((s, i) => _jsx("span", { className: "rounded-md bg-[color-mix(in_srgb,var(--wui-fg)_6%,transparent)] px-2 py-0.5 text-[12px] text-[var(--wui-fg)]", children: s }, i)) });
41
+ }
42
+ return _jsx("ul", { className: "flex flex-col gap-1.5", children: items.map((s, i) => _jsxs("li", { className: "flex gap-2 text-[13px] leading-relaxed text-[var(--wui-fg)]", children: [_jsx("span", { className: "mt-[7px] h-1 w-1 shrink-0 rounded-full bg-[var(--wui-fg-muted)]" }), s] }, i)) });
43
+ }
44
+ return _jsx("div", { className: "flex flex-col gap-2", children: value.map((v, i) => _jsx("div", { className: "rounded-lg border border-[var(--wui-border)] p-3", children: isObj(v) ? _jsx(KV, { data: v, dense: true }) : _jsx(ValueView, { value: v }) }, i)) });
45
+ }
46
+ if (isObj(value))
47
+ return _jsx("div", { className: "rounded-lg border border-[var(--wui-border)] p-3", children: _jsx(KV, { data: value, dense: true }) });
48
+ const s = String(value);
49
+ if (s.length > 100 || s.includes('\n'))
50
+ return _jsx(MarkdownView, { className: "text-[13px] text-[var(--wui-fg)]", children: s });
51
+ return _jsx("span", { className: "text-[var(--wui-fg)]", children: s });
52
+ }
53
+ // ─── Grid — label→value from an object ───
54
+ function KV({ data, dense }) {
55
+ const entries = isObj(data) ? Object.entries(data) : [];
56
+ if (entries.length === 0)
57
+ return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "No fields" });
58
+ if (dense) {
59
+ return (_jsx("div", { className: "grid gap-x-6 gap-y-2 sm:grid-cols-2", children: entries.map(([k, v]) => (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "text-[10.5px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: humanize(k) }), _jsx("div", { className: "min-w-0 text-[13px]", children: _jsx(ValueView, { value: v }) })] }, k))) }));
60
+ }
61
+ return (_jsx("div", { className: "grid gap-x-10 gap-y-4 lg:grid-cols-2", children: entries.map(([k, v]) => (_jsxs("div", { className: "flex min-w-0 gap-4", children: [_jsx("span", { className: "w-40 shrink-0 pt-0.5 text-left text-[12px] font-semibold text-[var(--wui-fg-muted)]", children: humanize(k) }), _jsx("div", { className: "min-w-0 flex-1 text-[13.5px] leading-relaxed", children: _jsx(ValueView, { value: v }) })] }, k))) }));
62
+ }
63
+ // ─── Code ───
64
+ function CodeBlock({ lang, children }) {
65
+ return (_jsxs("div", { className: "overflow-hidden rounded-lg border border-[var(--wui-border)]", children: [lang && _jsx("div", { className: "border-b border-[var(--wui-border)] bg-[color-mix(in_srgb,var(--wui-fg)_3%,transparent)] px-3 py-1 text-[11px] font-medium uppercase tracking-wide text-[var(--wui-fg-muted)]", children: lang }), _jsx("pre", { className: "overflow-auto p-3 text-[12.5px] leading-relaxed text-[var(--wui-fg)]", children: _jsx("code", { className: "whitespace-pre font-mono", children: children }) })] }));
66
+ }
67
+ // ─── Json ───
68
+ function JsonView({ data }) {
69
+ let text;
70
+ try {
71
+ text = JSON.stringify(data, null, 2) ?? String(data);
72
+ }
73
+ catch {
74
+ text = String(data);
75
+ }
76
+ return _jsx("pre", { className: "overflow-auto rounded-lg border border-[var(--wui-border)] bg-[color-mix(in_srgb,var(--wui-fg)_2%,transparent)] p-3 text-[12px] leading-relaxed text-[var(--wui-fg)]", children: _jsx("code", { className: "whitespace-pre font-mono", children: text }) });
77
+ }
78
+ // ─── Table ───
79
+ function TableView({ data }) {
80
+ const rows = Array.isArray(data) ? data.filter(isObj) : [];
81
+ if (rows.length === 0)
82
+ return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "No rows" });
83
+ const cols = [...new Set(rows.flatMap((r) => Object.keys(r)))];
84
+ // GitHub-style tables — mirrors MarkdownView: rounded bordered frame, filled header,
85
+ // column gridlines, zebra rows. Kept in sync so config <Table> and markdown tables match.
86
+ return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-[var(--wui-border)]", children: _jsxs("table", { className: "w-full border-collapse text-[12px] [&_tbody_tr:nth-child(2n)]:bg-[color-mix(in_srgb,var(--wui-fg)_4%,transparent)] [&_tbody_tr:last-child_td]:border-b-0", children: [_jsx("thead", { children: _jsx("tr", { children: cols.map((c) => _jsx("th", { className: "border-b border-[var(--wui-border)] bg-[var(--wui-bg-muted)] px-3 py-2 text-left font-semibold text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]", children: humanize(c) }, c)) }) }), _jsx("tbody", { children: rows.map((r, i) => (_jsx("tr", { children: cols.map((c) => _jsx("td", { className: "border-b border-[var(--wui-border)] px-3 py-2 align-top text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]", children: _jsx(ValueView, { value: r[c] }) }, c)) }, i))) })] }) }));
87
+ }
88
+ // ─── Matrix — pivot [{label, values:{col:val}}] into label-rows × value-columns ───
89
+ // For metric/period tables (financials): each row is a metric, columns are the periods
90
+ // (union of the values-object keys). Same GitHub-style frame as Table; numeric cells right-aligned.
91
+ function MatrixView({ data, rowKey, sub, values }) {
92
+ const rows = Array.isArray(data) ? data.filter(isObj) : [];
93
+ if (rows.length === 0)
94
+ return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "No rows" });
95
+ const rk = rowKey ?? 'label';
96
+ const vk = values ?? 'values';
97
+ const cols = [];
98
+ for (const r of rows) {
99
+ const v = r[vk];
100
+ if (isObj(v))
101
+ for (const k of Object.keys(v))
102
+ if (!cols.includes(k))
103
+ cols.push(k);
104
+ }
105
+ const th = 'border-b border-[var(--wui-border)] bg-[var(--wui-bg-muted)] px-3 py-2 font-semibold text-[var(--wui-fg)] [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]';
106
+ const td = 'border-b border-[var(--wui-border)] px-3 py-2 align-top [&:not(:last-child)]:border-r [&:not(:last-child)]:border-[var(--wui-border)]';
107
+ return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-[var(--wui-border)]", children: _jsxs("table", { className: "w-full border-collapse text-[12px] [&_tbody_tr:nth-child(2n)]:bg-[color-mix(in_srgb,var(--wui-fg)_4%,transparent)] [&_tbody_tr:last-child_td]:border-b-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: cn(th, 'text-left'), children: humanize(rk) }), cols.map((c) => _jsx("th", { className: cn(th, 'whitespace-nowrap text-right'), children: c }, c))] }) }), _jsx("tbody", { children: rows.map((r, i) => {
108
+ const v = isObj(r[vk]) ? r[vk] : {};
109
+ const subLabel = sub ? str(r[sub]) : undefined;
110
+ return (_jsxs("tr", { children: [_jsxs("td", { className: cn(td, 'text-left'), children: [_jsx("span", { className: "font-medium text-[var(--wui-fg)]", children: str(r[rk]) ?? '' }), subLabel ? _jsx("span", { className: "ml-1.5 text-[11px] text-[var(--wui-fg-muted)]", children: subLabel }) : null] }), cols.map((c) => _jsx("td", { className: cn(td, 'text-right tabular-nums text-[var(--wui-fg)]'), children: _jsx(ValueView, { value: v[c] }) }, c))] }, i));
111
+ }) })] }) }));
112
+ }
113
+ // ─── Preview — a document / image with sizing ───
114
+ function PreviewView({ src, height, width }) {
115
+ // Attachment(s) → the app's document card (click it to open the full preview).
116
+ if (isAttachment(src) || isAttachmentArray(src))
117
+ return _jsx(DisplayValue, { value: src });
118
+ const url = typeof src === 'string' ? src : undefined;
119
+ if (url && /^(https?:|data:image|blob:)/.test(url)) {
120
+ return _jsx("img", { src: url, alt: "preview", className: "rounded-lg border border-[var(--wui-border)] object-contain", style: { height, width, maxWidth: '100%' } });
121
+ }
122
+ return _jsx("div", { className: "rounded-lg border border-dashed border-[var(--wui-border)] p-4 text-[13px] text-[var(--wui-fg-muted)]", children: "No preview available" });
123
+ }
124
+ // ─── Registry ───
125
+ const section = {
126
+ childMode: 'nodes',
127
+ render: (props, kids, key) => (_jsxs("section", { className: "flex flex-col", children: [props['title'] != null && (_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("h3", { className: "text-[12px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: str(props['title']) }), _jsx("span", { className: "h-px flex-1 bg-[var(--wui-border)]" })] })), _jsx("div", { className: "flex flex-col gap-4", children: kids })] }, key)),
128
+ };
129
+ export const DEFAULT_REGISTRY = {
130
+ Section: section,
131
+ Row: {
132
+ childMode: 'nodes',
133
+ render: (p, kids, key) => {
134
+ const cols = num(p['cols']);
135
+ if (cols && cols > 1)
136
+ return _jsx("div", { className: "grid gap-x-8 gap-y-2.5", style: { gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))` }, children: kids }, key);
137
+ return _jsx("div", { className: "flex flex-wrap items-start gap-x-10 gap-y-4", children: kids }, key);
138
+ },
139
+ },
140
+ Col: { childMode: 'nodes', render: (p, kids, key) => _jsx("div", { className: "flex min-w-0 flex-1 flex-col gap-4", style: { gap: num(p['gap']) }, children: kids }, key) },
141
+ Field: {
142
+ childMode: 'nodes',
143
+ render: (p, kids, key) => {
144
+ const body = 'value' in p ? _jsx(ValueView, { value: p['value'] }) : kids;
145
+ if (p['stacked']) {
146
+ return (_jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: str(p['label']) }), _jsx("div", { className: "min-w-0 text-[13.5px] leading-relaxed text-[var(--wui-fg)]", children: body })] }, key));
147
+ }
148
+ return (_jsxs("div", { className: "flex min-w-0 gap-4", children: [_jsx("span", { className: "w-40 shrink-0 pt-0.5 text-left text-[12px] font-semibold text-[var(--wui-fg-muted)]", children: str(p['label']) }), _jsx("div", { className: "min-w-0 flex-1 text-[13.5px] leading-relaxed", children: body })] }, key));
149
+ },
150
+ },
151
+ Link: {
152
+ childMode: 'text',
153
+ render: (p, kids, key) => {
154
+ const text = str(p['label']) ?? (typeof kids === 'string' ? kids : '') ?? '';
155
+ const href = str(p['href']) ?? text;
156
+ return href
157
+ ? _jsx("a", { href: href, target: "_blank", rel: "noreferrer", className: "text-[var(--wui-primary)] underline underline-offset-2 hover:opacity-80", children: text || href }, key)
158
+ : _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "\u2014" }, key);
159
+ },
160
+ },
161
+ Grid: { childMode: 'none', render: (p, _k, key) => _jsx("div", { children: _jsx(KV, { data: p['data'] }) }, key) },
162
+ Value: { childMode: 'none', render: (p, _k, key) => _jsx("span", { children: _jsx(ValueView, { value: p['value'] }) }, key) },
163
+ Markdown: { childMode: 'text', render: (p, kids, key) => _jsx(MarkdownView, { className: "text-[13.5px] leading-relaxed text-[var(--wui-fg)]", children: str(p['value']) ?? (typeof kids === 'string' ? kids : '') }, key) },
164
+ Code: { childMode: 'text', render: (p, kids, key) => _jsx(CodeBlock, { lang: str(p['lang']), children: str(p['value']) ?? (typeof kids === 'string' ? kids : '') }, key) },
165
+ Json: { childMode: 'none', render: (p, _k, key) => _jsx(JsonView, { data: p['data'] }, key) },
166
+ Table: { childMode: 'none', render: (p, _k, key) => _jsx(TableView, { data: p['data'] }, key) },
167
+ Matrix: { childMode: 'none', render: (p, _k, key) => _jsx(MatrixView, { data: p['data'], rowKey: str(p['rowKey']), sub: str(p['sub']), values: str(p['values']) }, key) },
168
+ Preview: { childMode: 'none', render: (p, _k, key) => _jsx(PreviewView, { src: p['src'], height: num(p['height']), width: num(p['width']) }, key) },
169
+ };
170
+ export { cn };
171
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/layout-engine/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Expr, Scope } from './types.js';
2
+ /**
3
+ * Resolve an expression against the data scope. Identifier lookups, member / index
4
+ * access, and calls to a fixed set of pure helper functions (below) — no arbitrary
5
+ * evaluation, no data method calls, no mutation. A template can transform data it
6
+ * reads but can never run code. Missing paths resolve to `undefined` (never throw).
7
+ */
8
+ export declare function evaluate(expr: Expr, scope: Scope): unknown;
9
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/layout-engine/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAqB1D"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Resolve an expression against the data scope. Identifier lookups, member / index
3
+ * access, and calls to a fixed set of pure helper functions (below) — no arbitrary
4
+ * evaluation, no data method calls, no mutation. A template can transform data it
5
+ * reads but can never run code. Missing paths resolve to `undefined` (never throw).
6
+ */
7
+ export function evaluate(expr, scope) {
8
+ switch (expr.kind) {
9
+ case 'lit':
10
+ return expr.value;
11
+ case 'ident':
12
+ return scope[expr.name];
13
+ case 'member': {
14
+ const obj = evaluate(expr.obj, scope);
15
+ return access(obj, expr.prop);
16
+ }
17
+ case 'index': {
18
+ const obj = evaluate(expr.obj, scope);
19
+ const idx = evaluate(expr.index, scope);
20
+ return access(obj, idx);
21
+ }
22
+ case 'call': {
23
+ const fn = FUNCTIONS[expr.name];
24
+ if (!fn)
25
+ return undefined;
26
+ return fn(expr.args.map((a) => evaluate(a, scope)));
27
+ }
28
+ }
29
+ }
30
+ function access(obj, key) {
31
+ if (obj == null)
32
+ return undefined;
33
+ if (typeof obj !== 'object' && typeof obj !== 'string')
34
+ return undefined;
35
+ const k = typeof key === 'number' ? key : String(key);
36
+ return obj[k];
37
+ }
38
+ // ─── Whitelisted pure helpers a template may call (no I/O, no mutation) ───
39
+ const asArr = (v) => (Array.isArray(v) ? v : []);
40
+ const asStr = (v) => (v == null ? '' : String(v));
41
+ const FUNCTIONS = {
42
+ split: ([s, sep]) => (typeof s === 'string' ? s.split(asStr(sep)) : []),
43
+ first: ([a]) => asArr(a)[0],
44
+ last: ([a]) => { const arr = asArr(a); return arr[arr.length - 1]; },
45
+ at: ([a, i]) => access(a, i),
46
+ join: ([a, sep]) => asArr(a).map(asStr).join(sep == null ? ', ' : asStr(sep)),
47
+ upper: ([s]) => asStr(s).toUpperCase(),
48
+ lower: ([s]) => asStr(s).toLowerCase(),
49
+ trim: ([s]) => asStr(s).trim(),
50
+ len: ([a]) => (Array.isArray(a) || typeof a === 'string' ? a.length : a && typeof a === 'object' ? Object.keys(a).length : 0),
51
+ keys: ([o]) => (o && typeof o === 'object' ? Object.keys(o) : []),
52
+ values: ([o]) => (o && typeof o === 'object' ? Object.values(o) : []),
53
+ pick: ([o, ...ks]) => {
54
+ if (!o || typeof o !== 'object')
55
+ return {};
56
+ const src = o;
57
+ const out = {};
58
+ for (const k of ks) {
59
+ const key = asStr(k);
60
+ if (key in src)
61
+ out[key] = src[key];
62
+ }
63
+ return out;
64
+ },
65
+ };
66
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/layout-engine/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from 'react';
2
+ import { parse } from './parse.js';
3
+ import { DEFAULT_REGISTRY } from './components.js';
4
+ import { type Scope, type Registry, LayoutError } from './types.js';
5
+ export type RenderResult = {
6
+ ok: true;
7
+ node: ReactNode;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ };
12
+ /**
13
+ * Parse + render a node-carried JSX layout template against a data scope.
14
+ * Never throws — a malformed template returns `{ ok: false, error }` so the
15
+ * caller can show it inline and fall back. The default registry is the built-in
16
+ * component library; pass your own to extend it.
17
+ */
18
+ export declare function renderLayout(template: string, scope: Scope, registry?: Registry): RenderResult;
19
+ export { parse, DEFAULT_REGISTRY, LayoutError };
20
+ export type { Scope, Registry };
21
+ export type { Node, Expr, ComponentDef, ChildMode } from './types.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout-engine/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAE,QAA2B,GAAG,YAAY,CAOhH;AAED,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AAChD,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAChC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { parse } from './parse.js';
3
+ import { renderNodes } from './render.js';
4
+ import { DEFAULT_REGISTRY } from './components.js';
5
+ import { LayoutError } from './types.js';
6
+ /**
7
+ * Parse + render a node-carried JSX layout template against a data scope.
8
+ * Never throws — a malformed template returns `{ ok: false, error }` so the
9
+ * caller can show it inline and fall back. The default registry is the built-in
10
+ * component library; pass your own to extend it.
11
+ */
12
+ export function renderLayout(template, scope, registry = DEFAULT_REGISTRY) {
13
+ try {
14
+ const ast = parse(template);
15
+ return { ok: true, node: _jsx(_Fragment, { children: renderNodes(ast, scope, registry) }) };
16
+ }
17
+ catch (e) {
18
+ return { ok: false, error: e instanceof Error ? e.message : String(e) };
19
+ }
20
+ }
21
+ export { parse, DEFAULT_REGISTRY, LayoutError };
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout-engine/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAA6B,WAAW,EAAE,MAAM,YAAY,CAAC;AAIpE;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAY,EAAE,WAAqB,gBAAgB;IAChG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,4BAAG,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAI,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Node } from './types.js';
2
+ /**
3
+ * Parse a restricted JSX template into a node list. Supports elements
4
+ * (`<Name attr="s" attr={expr} flag>children</Name>` and self-closing),
5
+ * `{expression}` children, and text. Expressions are member/index/literal access
6
+ * only. Throws LayoutError on malformed input (surfaced as an inline error, never a crash).
7
+ */
8
+ export declare function parse(src: string): Node[];
9
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/layout-engine/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAA0F,MAAM,YAAY,CAAC;AAK/H;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAEzC"}
@@ -0,0 +1,213 @@
1
+ import { LayoutError } from './types.js';
2
+ const NAME_RE = /[A-Za-z0-9_$]/;
3
+ const WS_RE = /\s/;
4
+ /**
5
+ * Parse a restricted JSX template into a node list. Supports elements
6
+ * (`<Name attr="s" attr={expr} flag>children</Name>` and self-closing),
7
+ * `{expression}` children, and text. Expressions are member/index/literal access
8
+ * only. Throws LayoutError on malformed input (surfaced as an inline error, never a crash).
9
+ */
10
+ export function parse(src) {
11
+ return new Parser(src).parseRoot();
12
+ }
13
+ class Parser {
14
+ src;
15
+ pos = 0;
16
+ constructor(src) {
17
+ this.src = src;
18
+ }
19
+ parseRoot() {
20
+ const nodes = this.parseNodes();
21
+ if (this.pos < this.src.length)
22
+ throw new LayoutError(`Unexpected '${this.src.slice(this.pos, this.pos + 12)}' at ${String(this.pos)}`);
23
+ return nodes;
24
+ }
25
+ // Nodes up to a closing tag (`</`) or EOF; the closing tag is left for the caller.
26
+ parseNodes() {
27
+ const out = [];
28
+ while (this.pos < this.src.length) {
29
+ if (this.src.startsWith('</', this.pos))
30
+ break;
31
+ const c = this.src[this.pos];
32
+ if (c === '<')
33
+ out.push(this.parseElement());
34
+ else if (c === '{')
35
+ out.push(this.parseExprNode());
36
+ else {
37
+ const t = this.parseText();
38
+ if (t)
39
+ out.push(t);
40
+ }
41
+ }
42
+ return out;
43
+ }
44
+ parseElement() {
45
+ this.expect('<');
46
+ const name = this.parseName();
47
+ const attrs = this.parseAttrs();
48
+ this.skipWs();
49
+ if (this.src.startsWith('/>', this.pos)) {
50
+ this.pos += 2;
51
+ return { kind: 'element', name, attrs, children: [] };
52
+ }
53
+ this.expect('>');
54
+ const children = this.parseNodes();
55
+ this.expect('<');
56
+ this.expect('/');
57
+ const close = this.parseName();
58
+ this.skipWs();
59
+ this.expect('>');
60
+ if (close !== name)
61
+ throw new LayoutError(`Mismatched closing tag </${close}> for <${name}>`);
62
+ return { kind: 'element', name, attrs, children };
63
+ }
64
+ parseAttrs() {
65
+ const attrs = {};
66
+ for (;;) {
67
+ this.skipWs();
68
+ const c = this.src[this.pos];
69
+ if (c === undefined || c === '>' || c === '/')
70
+ break;
71
+ const name = this.parseName();
72
+ this.skipWs();
73
+ if (this.src[this.pos] === '=') {
74
+ this.pos++;
75
+ this.skipWs();
76
+ const v = this.src[this.pos];
77
+ if (v === '{')
78
+ attrs[name] = { kind: 'expr', expr: this.parseBraced() };
79
+ else if (v === '"' || v === "'")
80
+ attrs[name] = { kind: 'string', value: this.parseString() };
81
+ else
82
+ throw new LayoutError(`Expected value for attribute '${name}'`);
83
+ }
84
+ else {
85
+ attrs[name] = { kind: 'bool', value: true };
86
+ }
87
+ }
88
+ return attrs;
89
+ }
90
+ parseExprNode() { return { kind: 'expr', expr: this.parseBraced() }; }
91
+ parseBraced() {
92
+ this.expect('{');
93
+ this.skipWs();
94
+ const e = this.parseExpr();
95
+ this.skipWs();
96
+ this.expect('}');
97
+ return e;
98
+ }
99
+ parseText() {
100
+ let s = '';
101
+ while (this.pos < this.src.length) {
102
+ const c = this.src[this.pos];
103
+ if (c === '<' || c === '{')
104
+ break;
105
+ s += c;
106
+ this.pos++;
107
+ }
108
+ const collapsed = s.replace(/\s+/g, ' ');
109
+ return collapsed.trim() === '' ? null : { kind: 'text', value: collapsed };
110
+ }
111
+ // ─── Expressions: member/index chains over identifiers and literals ───
112
+ parseExpr() {
113
+ let e = this.parsePrimary();
114
+ for (;;) {
115
+ this.skipWs();
116
+ const c = this.src[this.pos];
117
+ if (c === '.') {
118
+ this.pos++;
119
+ this.skipWs();
120
+ e = { kind: 'member', obj: e, prop: this.parseName() };
121
+ }
122
+ else if (c === '[') {
123
+ this.pos++;
124
+ this.skipWs();
125
+ const index = this.parseExpr();
126
+ this.skipWs();
127
+ this.expect(']');
128
+ e = { kind: 'index', obj: e, index };
129
+ }
130
+ else
131
+ break;
132
+ }
133
+ return e;
134
+ }
135
+ parsePrimary() {
136
+ const c = this.src[this.pos];
137
+ if (c === '"' || c === "'")
138
+ return { kind: 'lit', value: this.parseString() };
139
+ if (c === '-' || (c !== undefined && c >= '0' && c <= '9'))
140
+ return { kind: 'lit', value: this.parseNumber() };
141
+ const name = this.parseName();
142
+ if (name === 'true')
143
+ return { kind: 'lit', value: true };
144
+ if (name === 'false')
145
+ return { kind: 'lit', value: false };
146
+ if (name === 'null')
147
+ return { kind: 'lit', value: null };
148
+ if (this.src[this.pos] === '(')
149
+ return { kind: 'call', name, args: this.parseArgs() };
150
+ return { kind: 'ident', name };
151
+ }
152
+ parseArgs() {
153
+ this.expect('(');
154
+ this.skipWs();
155
+ const args = [];
156
+ if (this.src[this.pos] === ')') {
157
+ this.pos++;
158
+ return args;
159
+ }
160
+ args.push(this.parseExpr());
161
+ this.skipWs();
162
+ while (this.src[this.pos] === ',') {
163
+ this.pos++;
164
+ this.skipWs();
165
+ args.push(this.parseExpr());
166
+ this.skipWs();
167
+ }
168
+ this.expect(')');
169
+ return args;
170
+ }
171
+ // ─── Lexical helpers ───
172
+ parseName() {
173
+ const start = this.pos;
174
+ while (this.pos < this.src.length && NAME_RE.test(this.src[this.pos]))
175
+ this.pos++;
176
+ if (this.pos === start)
177
+ throw new LayoutError(`Expected a name at ${String(this.pos)}`);
178
+ return this.src.slice(start, this.pos);
179
+ }
180
+ parseString() {
181
+ const quote = this.src[this.pos];
182
+ this.pos++;
183
+ let s = '';
184
+ while (this.pos < this.src.length && this.src[this.pos] !== quote) {
185
+ if (this.src[this.pos] === '\\') {
186
+ this.pos++;
187
+ }
188
+ s += this.src[this.pos];
189
+ this.pos++;
190
+ }
191
+ this.expect(quote);
192
+ return s;
193
+ }
194
+ parseNumber() {
195
+ const start = this.pos;
196
+ if (this.src[this.pos] === '-')
197
+ this.pos++;
198
+ while (this.pos < this.src.length && /[0-9.]/.test(this.src[this.pos]))
199
+ this.pos++;
200
+ const n = Number(this.src.slice(start, this.pos));
201
+ if (Number.isNaN(n))
202
+ throw new LayoutError(`Invalid number at ${String(start)}`);
203
+ return n;
204
+ }
205
+ skipWs() { while (this.pos < this.src.length && WS_RE.test(this.src[this.pos]))
206
+ this.pos++; }
207
+ expect(ch) {
208
+ if (this.src[this.pos] !== ch)
209
+ throw new LayoutError(`Expected '${ch}' at ${String(this.pos)}, found '${this.src[this.pos] ?? '<eof>'}'`);
210
+ this.pos++;
211
+ }
212
+ }
213
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/layout-engine/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Node, Scope, Registry } from './types.js';
3
+ /** Render a parsed template's nodes against a scope with a component registry. */
4
+ export declare function renderNodes(nodes: Node[], scope: Scope, registry: Registry): ReactNode[];
5
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/layout-engine/render.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAe,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIrE,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,CAExF"}