@xyne/workflow-ui 1.3.8 → 1.3.10

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 (60) hide show
  1. package/dist/components/execution/ApprovalsView.d.ts.map +1 -1
  2. package/dist/components/execution/ApprovalsView.js +4 -58
  3. package/dist/components/execution/ApprovalsView.js.map +1 -1
  4. package/dist/components/execution/ExecutionHeader.d.ts +7 -3
  5. package/dist/components/execution/ExecutionHeader.d.ts.map +1 -1
  6. package/dist/components/execution/ExecutionHeader.js +8 -4
  7. package/dist/components/execution/ExecutionHeader.js.map +1 -1
  8. package/dist/components/execution/ExecutionJourney.d.ts.map +1 -1
  9. package/dist/components/execution/ExecutionJourney.js +45 -147
  10. package/dist/components/execution/ExecutionJourney.js.map +1 -1
  11. package/dist/components/execution/ExecutionTabs.d.ts +34 -0
  12. package/dist/components/execution/ExecutionTabs.d.ts.map +1 -0
  13. package/dist/components/execution/ExecutionTabs.js +248 -0
  14. package/dist/components/execution/ExecutionTabs.js.map +1 -0
  15. package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
  16. package/dist/components/execution/ExecutionViewer.js +13 -2
  17. package/dist/components/execution/ExecutionViewer.js.map +1 -1
  18. package/dist/components/execution/journey-model.d.ts +112 -0
  19. package/dist/components/execution/journey-model.d.ts.map +1 -0
  20. package/dist/components/execution/journey-model.js +271 -0
  21. package/dist/components/execution/journey-model.js.map +1 -0
  22. package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
  23. package/dist/components/shared/AttachmentCard.js +9 -5
  24. package/dist/components/shared/AttachmentCard.js.map +1 -1
  25. package/dist/components/shared/ChatPanel.d.ts.map +1 -1
  26. package/dist/components/shared/ChatPanel.js +14 -2
  27. package/dist/components/shared/ChatPanel.js.map +1 -1
  28. package/dist/components/shared/RunAiChat.d.ts +28 -0
  29. package/dist/components/shared/RunAiChat.d.ts.map +1 -0
  30. package/dist/components/shared/RunAiChat.js +67 -0
  31. package/dist/components/shared/RunAiChat.js.map +1 -0
  32. package/dist/hooks/use-execution-viewer.d.ts.map +1 -1
  33. package/dist/hooks/use-execution-viewer.js +17 -1
  34. package/dist/hooks/use-execution-viewer.js.map +1 -1
  35. package/dist/layout-engine/components.d.ts +5 -0
  36. package/dist/layout-engine/components.d.ts.map +1 -0
  37. package/dist/layout-engine/components.js +137 -0
  38. package/dist/layout-engine/components.js.map +1 -0
  39. package/dist/layout-engine/evaluate.d.ts +9 -0
  40. package/dist/layout-engine/evaluate.d.ts.map +1 -0
  41. package/dist/layout-engine/evaluate.js +66 -0
  42. package/dist/layout-engine/evaluate.js.map +1 -0
  43. package/dist/layout-engine/index.d.ts +22 -0
  44. package/dist/layout-engine/index.d.ts.map +1 -0
  45. package/dist/layout-engine/index.js +22 -0
  46. package/dist/layout-engine/index.js.map +1 -0
  47. package/dist/layout-engine/parse.d.ts +9 -0
  48. package/dist/layout-engine/parse.d.ts.map +1 -0
  49. package/dist/layout-engine/parse.js +213 -0
  50. package/dist/layout-engine/parse.js.map +1 -0
  51. package/dist/layout-engine/render.d.ts +5 -0
  52. package/dist/layout-engine/render.d.ts.map +1 -0
  53. package/dist/layout-engine/render.js +89 -0
  54. package/dist/layout-engine/render.js.map +1 -0
  55. package/dist/layout-engine/types.d.ts +65 -0
  56. package/dist/layout-engine/types.d.ts.map +1 -0
  57. package/dist/layout-engine/types.js +11 -0
  58. package/dist/layout-engine/types.js.map +1 -0
  59. package/dist/styles.css +1 -1
  60. package/package.json +1 -1
@@ -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,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAe,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGrE,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,CAExF"}
@@ -0,0 +1,89 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Fragment } from 'react';
3
+ import { evaluate } from './evaluate.js';
4
+ /** Render a parsed template's nodes against a scope with a component registry. */
5
+ export function renderNodes(nodes, scope, registry) {
6
+ return nodes.map((n, i) => renderNode(n, scope, registry, String(i)));
7
+ }
8
+ function renderNode(node, scope, registry, key) {
9
+ if (node.kind === 'text')
10
+ return node.value;
11
+ if (node.kind === 'expr') {
12
+ const value = evaluate(node.expr, scope);
13
+ const Value = registry['Value'];
14
+ return Value ? Value.render({ value }, undefined, key) : stringify(value);
15
+ }
16
+ if (node.name === 'Each')
17
+ return renderEach(node, scope, registry, key);
18
+ if (node.name === 'If')
19
+ return renderIf(node, scope, registry, key);
20
+ const def = registry[node.name];
21
+ if (!def) {
22
+ return (_jsxs("span", { className: "rounded bg-[color-mix(in_srgb,#ef4444_12%,transparent)] px-1.5 py-0.5 font-mono text-[12px] text-red-600", children: ["<", node.name, "> unknown"] }, key));
23
+ }
24
+ const props = {};
25
+ for (const [name, av] of Object.entries(node.attrs)) {
26
+ props[name] = av.kind === 'string' ? av.value : av.kind === 'bool' ? true : evaluate(av.expr, scope);
27
+ }
28
+ const mode = def.childMode ?? 'nodes';
29
+ const kids = mode === 'text'
30
+ ? textOf(node.children, scope)
31
+ : mode === 'nodes'
32
+ ? (node.children.length ? renderNodes(node.children, scope, registry) : undefined)
33
+ : undefined;
34
+ return def.render(props, kids, key);
35
+ }
36
+ /** Collapse children to a raw string (for text components like Code / Markdown). */
37
+ function textOf(nodes, scope) {
38
+ return nodes.map((n) => (n.kind === 'text' ? n.value : n.kind === 'expr' ? stringify(evaluate(n.expr, scope)) : '')).join('');
39
+ }
40
+ function stringify(v) {
41
+ if (v == null)
42
+ return '';
43
+ if (typeof v === 'string')
44
+ return v;
45
+ try {
46
+ return JSON.stringify(v, null, 2);
47
+ }
48
+ catch {
49
+ return String(v);
50
+ }
51
+ }
52
+ function numAttr(node, name, scope) {
53
+ const a = node.attrs[name];
54
+ if (!a)
55
+ return undefined;
56
+ const v = a.kind === 'expr' ? evaluate(a.expr, scope) : a.kind === 'string' ? Number(a.value) : undefined;
57
+ return typeof v === 'number' && !Number.isNaN(v) ? v : undefined;
58
+ }
59
+ /**
60
+ * `<Each in={list} as="item" cols={2}>…</Each>` — iterate an array (or an object's
61
+ * entries, which bind as `{ key, value }`), rendering the children once per element
62
+ * with `item` (+ `index`) added to scope, laid out as an N-column grid or a list.
63
+ */
64
+ function renderEach(node, scope, registry, key) {
65
+ const inAttr = node.attrs['in'];
66
+ const source = inAttr && inAttr.kind === 'expr' ? evaluate(inAttr.expr, scope) : undefined;
67
+ const asAttr = node.attrs['as'];
68
+ const as = asAttr && asAttr.kind === 'string' ? asAttr.value : 'item';
69
+ const cols = numAttr(node, 'cols', scope);
70
+ const items = Array.isArray(source)
71
+ ? source
72
+ : source && typeof source === 'object'
73
+ ? Object.entries(source).map(([k, value]) => ({ key: k, value }))
74
+ : [];
75
+ if (items.length === 0)
76
+ return _jsx("div", { className: "text-[13px] italic text-[var(--wui-fg-muted)]", children: "None" }, key);
77
+ const children = items.map((item, i) => (_jsx("div", { className: "min-w-0", children: renderNodes(node.children, { ...scope, [as]: item, index: i }, registry) }, i)));
78
+ if (cols && cols > 1) {
79
+ return _jsx("div", { className: "grid gap-x-8 gap-y-5", style: { gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))` }, children: children }, key);
80
+ }
81
+ return _jsx("div", { className: "flex flex-col gap-3", children: children }, key);
82
+ }
83
+ /** `<If cond={expr}>…</If>` — render children only when the condition is truthy. */
84
+ function renderIf(node, scope, registry, key) {
85
+ const cond = node.attrs['cond'];
86
+ const truthy = cond ? (cond.kind === 'expr' ? Boolean(evaluate(cond.expr, scope)) : cond.kind === 'bool') : false;
87
+ return truthy ? _jsx(Fragment, { children: renderNodes(node.children, scope, registry) }, key) : null;
88
+ }
89
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/layout-engine/render.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Layout engine — a small, safe, dependency-free JSX interpreter for node-carried
3
+ * detail layouts. A step carries its layout as a JSX *string* (data); this engine
4
+ * parses it into an AST, resolves `{expression}` refs against a data scope
5
+ * (input / output / …), and renders whitelisted components. It is layout-only:
6
+ * there is no arbitrary code execution (expressions are member/index/literal access
7
+ * only) and all styling belongs to the components, not the template.
8
+ */
9
+ export type Expr = {
10
+ kind: 'ident';
11
+ name: string;
12
+ } | {
13
+ kind: 'member';
14
+ obj: Expr;
15
+ prop: string;
16
+ } | {
17
+ kind: 'index';
18
+ obj: Expr;
19
+ index: Expr;
20
+ } | {
21
+ kind: 'call';
22
+ name: string;
23
+ args: Expr[];
24
+ } | {
25
+ kind: 'lit';
26
+ value: string | number | boolean | null;
27
+ };
28
+ export type AttrValue = {
29
+ kind: 'string';
30
+ value: string;
31
+ } | {
32
+ kind: 'expr';
33
+ expr: Expr;
34
+ } | {
35
+ kind: 'bool';
36
+ value: true;
37
+ };
38
+ export interface ElementNode {
39
+ kind: 'element';
40
+ name: string;
41
+ attrs: Record<string, AttrValue>;
42
+ children: Node[];
43
+ }
44
+ export interface ExprNode {
45
+ kind: 'expr';
46
+ expr: Expr;
47
+ }
48
+ export interface TextNode {
49
+ kind: 'text';
50
+ value: string;
51
+ }
52
+ export type Node = ElementNode | ExprNode | TextNode;
53
+ /** The data a template can reference by expression (e.g. `output.response.pan`). */
54
+ export type Scope = Record<string, unknown>;
55
+ /** How a component consumes its children in a template. */
56
+ export type ChildMode = 'nodes' | 'text' | 'none';
57
+ export interface ComponentDef {
58
+ /** props = resolved attributes; kids = rendered nodes, raw text, or undefined per childMode. */
59
+ render: (props: Record<string, unknown>, kids: import('react').ReactNode | string | undefined, key: string) => import('react').ReactNode;
60
+ childMode?: ChildMode;
61
+ }
62
+ export type Registry = Record<string, ComponentDef>;
63
+ export declare class LayoutError extends Error {
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout-engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAElC,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;CAAE;AAClH,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE;AACtD,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACzD,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAIrD,oFAAoF;AACpF,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,gGAAgG;IAChG,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,CAAC;IACzI,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEpD,qBAAa,WAAY,SAAQ,KAAK;CAAG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Layout engine — a small, safe, dependency-free JSX interpreter for node-carried
3
+ * detail layouts. A step carries its layout as a JSX *string* (data); this engine
4
+ * parses it into an AST, resolves `{expression}` refs against a data scope
5
+ * (input / output / …), and renders whitelisted components. It is layout-only:
6
+ * there is no arbitrary code execution (expressions are member/index/literal access
7
+ * only) and all styling belongs to the components, not the template.
8
+ */
9
+ export class LayoutError extends Error {
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/layout-engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwCH,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG"}