@maxhealth.tech/prefab 0.3.9 → 0.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.
- package/CHANGELOG.md +27 -0
- package/README.md +76 -10
- package/dist/a2ui/browser.d.ts +46 -0
- package/dist/a2ui/browser.d.ts.map +1 -0
- package/dist/a2ui/browser.js +58 -0
- package/dist/a2ui/browser.js.map +1 -0
- package/dist/a2ui/catalog.d.ts +51 -0
- package/dist/a2ui/catalog.d.ts.map +1 -0
- package/dist/a2ui/catalog.js +465 -0
- package/dist/a2ui/catalog.js.map +1 -0
- package/dist/a2ui/emit.d.ts +59 -0
- package/dist/a2ui/emit.d.ts.map +1 -0
- package/dist/a2ui/emit.js +269 -0
- package/dist/a2ui/emit.js.map +1 -0
- package/dist/a2ui/expr.d.ts +58 -0
- package/dist/a2ui/expr.d.ts.map +1 -0
- package/dist/a2ui/expr.js +81 -0
- package/dist/a2ui/expr.js.map +1 -0
- package/dist/a2ui/icons.d.ts +30 -0
- package/dist/a2ui/icons.d.ts.map +1 -0
- package/dist/a2ui/icons.js +87 -0
- package/dist/a2ui/icons.js.map +1 -0
- package/dist/a2ui/index.d.ts +27 -0
- package/dist/a2ui/index.d.ts.map +1 -0
- package/dist/a2ui/index.js +23 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/table.d.ts +31 -0
- package/dist/a2ui/table.d.ts.map +1 -0
- package/dist/a2ui/table.js +155 -0
- package/dist/a2ui/table.js.map +1 -0
- package/dist/a2ui/types.d.ts +174 -0
- package/dist/a2ui/types.d.ts.map +1 -0
- package/dist/a2ui/types.js +35 -0
- package/dist/a2ui/types.js.map +1 -0
- package/dist/a2ui.min.js +1 -0
- package/dist/app.d.ts +17 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +19 -0
- package/dist/app.js.map +1 -1
- package/dist/auto/form.d.ts +25 -0
- package/dist/auto/form.d.ts.map +1 -1
- package/dist/auto/form.js +21 -8
- package/dist/auto/form.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.d.ts.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/a2ui.d.ts +91 -0
- package/dist/mcp/a2ui.d.ts.map +1 -0
- package/dist/mcp/a2ui.js +134 -0
- package/dist/mcp/a2ui.js.map +1 -0
- package/dist/mcp/display.d.ts +28 -6
- package/dist/mcp/display.d.ts.map +1 -1
- package/dist/mcp/display.js +10 -9
- package/dist/mcp/display.js.map +1 -1
- package/dist/mcp/index.d.ts +7 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +3 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/input-required.d.ts +79 -0
- package/dist/mcp/input-required.d.ts.map +1 -0
- package/dist/mcp/input-required.js +231 -0
- package/dist/mcp/input-required.js.map +1 -0
- package/dist/mcp/resource.d.ts +10 -0
- package/dist/mcp/resource.d.ts.map +1 -1
- package/dist/mcp/resource.js +12 -4
- package/dist/mcp/resource.js.map +1 -1
- package/dist/mcp/result.d.ts +7 -5
- package/dist/mcp/result.d.ts.map +1 -1
- package/dist/mcp/result.js +5 -3
- package/dist/mcp/result.js.map +1 -1
- package/dist/mcp/types.d.ts +117 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/renderer/components/index.d.ts.map +1 -1
- package/dist/renderer/components/index.js +6 -0
- package/dist/renderer/components/index.js.map +1 -1
- package/dist/renderer/engine.d.ts +4 -0
- package/dist/renderer/engine.d.ts.map +1 -1
- package/dist/renderer/engine.js +24 -0
- package/dist/renderer/engine.js.map +1 -1
- package/dist/renderer.auto.min.js +13 -13
- package/dist/renderer.min.js +13 -13
- package/package.json +13 -3
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prefab component type → A2UI Basic catalog mapper registry.
|
|
3
|
+
*
|
|
4
|
+
* prefab ships 115+ components; the A2UI Basic catalog defines 18. The gap is
|
|
5
|
+
* closed by degradation rather than by refusing to emit: a `Badge` becomes
|
|
6
|
+
* `Text`, an `Alert` becomes a `Card` wrapping its body, an `H2` becomes `Text`
|
|
7
|
+
* carrying a Markdown `##` prefix (which the Basic catalog's `Text` explicitly
|
|
8
|
+
* supports). Every degradation is recorded as a diagnostic, so what changed is
|
|
9
|
+
* visible at emit time instead of in someone else's renderer.
|
|
10
|
+
*
|
|
11
|
+
* A mapper returns the A2UI properties for one node without its `id`; the
|
|
12
|
+
* emitter allocates ids and owns the adjacency list. Mappers that expand one
|
|
13
|
+
* prefab node into several A2UI components (`Metric`, the table family in
|
|
14
|
+
* `./table.ts`) push the extras through `ctx.push` and return the root of the
|
|
15
|
+
* expansion.
|
|
16
|
+
*/
|
|
17
|
+
import { dynamicString, toBinding } from './expr.js';
|
|
18
|
+
import { a2uiIconName } from './icons.js';
|
|
19
|
+
import { mapTable, mapDataTable, TABLE_PART_TYPES } from './table.js';
|
|
20
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
21
|
+
/** Read the first present scalar prop from a node. */
|
|
22
|
+
function textOf(node, ...keys) {
|
|
23
|
+
for (const k of keys) {
|
|
24
|
+
const v = node[k];
|
|
25
|
+
if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')
|
|
26
|
+
return String(v);
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Build a `Text` component, prefixing Markdown syntax onto literal content. */
|
|
31
|
+
function text(node, ctx, opts) {
|
|
32
|
+
const raw = textOf(node, ...(opts?.keys ?? ['content', 'text', 'label', 'title']));
|
|
33
|
+
if (raw == null) {
|
|
34
|
+
ctx.note('unsupported', node.type, 'no text content to render');
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const bound = toBinding(raw);
|
|
38
|
+
if (bound.kind === 'unbindable') {
|
|
39
|
+
ctx.note('expression', node.type, `"${bound.expression}" is richer than a JSON Pointer; the text was left as written`);
|
|
40
|
+
}
|
|
41
|
+
const prefix = opts?.prefix ?? '';
|
|
42
|
+
const suffix = opts?.suffix ?? '';
|
|
43
|
+
// Markdown decoration can only wrap a literal. A bound value is handed over
|
|
44
|
+
// undecorated rather than emitting syntax the renderer would show as data.
|
|
45
|
+
if (bound.kind === 'binding') {
|
|
46
|
+
if (prefix !== '' || suffix !== '') {
|
|
47
|
+
ctx.note('degraded', node.type, 'Markdown emphasis dropped: the text is a data binding');
|
|
48
|
+
}
|
|
49
|
+
return { component: 'Text', text: bound.value, ...(opts?.variant != null && { variant: opts.variant }) };
|
|
50
|
+
}
|
|
51
|
+
const literal = bound.kind === 'literal' ? bound.value : raw;
|
|
52
|
+
return {
|
|
53
|
+
component: 'Text',
|
|
54
|
+
text: `${prefix}${literal}${suffix}`,
|
|
55
|
+
...(opts?.variant != null && { variant: opts.variant }),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Map prefab's justify/align vocabulary onto the Basic catalog's. */
|
|
59
|
+
const JUSTIFY = {
|
|
60
|
+
start: 'start', end: 'end', center: 'center',
|
|
61
|
+
between: 'spaceBetween', around: 'spaceAround', evenly: 'spaceEvenly',
|
|
62
|
+
spaceBetween: 'spaceBetween', spaceAround: 'spaceAround', spaceEvenly: 'spaceEvenly',
|
|
63
|
+
};
|
|
64
|
+
const ALIGN = {
|
|
65
|
+
start: 'start', end: 'end', center: 'center', stretch: 'stretch', baseline: 'baseline',
|
|
66
|
+
};
|
|
67
|
+
function flow(component) {
|
|
68
|
+
return (node, ctx) => {
|
|
69
|
+
const children = ctx.children(node.children);
|
|
70
|
+
if (children.length === 0) {
|
|
71
|
+
ctx.note('unsupported', node.type, `${component} requires at least one child and none survived`);
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const justify = typeof node.justify === 'string' ? JUSTIFY[node.justify] : undefined;
|
|
75
|
+
const align = typeof node.align === 'string' ? ALIGN[node.align] : undefined;
|
|
76
|
+
return {
|
|
77
|
+
component,
|
|
78
|
+
children,
|
|
79
|
+
...(justify != null && { justify }),
|
|
80
|
+
...(align != null && { align }),
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Container types carrying no meaning A2UI can express; they flatten to a Column. */
|
|
85
|
+
const AS_COLUMN = [
|
|
86
|
+
'Div', 'Container', 'Stack', 'Grid', 'GridItem', 'Page', 'Pages', 'Dashboard',
|
|
87
|
+
'DashboardItem', 'MasterDetail', 'Detail', 'Form', 'Fieldset', 'CardContent',
|
|
88
|
+
'CardHeader', 'CardFooter', 'Accordion', 'Carousel', 'SelectGroup', 'ComboboxGroup',
|
|
89
|
+
'Section', 'Article', 'Aside', 'Header', 'Footer', 'Nav', 'Span',
|
|
90
|
+
];
|
|
91
|
+
const AS_ROW = ['ButtonGroup', 'Toolbar', 'Inline'];
|
|
92
|
+
// ── Text ─────────────────────────────────────────────────────────────────────
|
|
93
|
+
const HEADING_PREFIX = {
|
|
94
|
+
H1: '# ', H2: '## ', H3: '### ', H4: '#### ', H5: '##### ', H6: '###### ',
|
|
95
|
+
};
|
|
96
|
+
const TEXT_MAPPERS = {
|
|
97
|
+
Heading: (node, ctx) => {
|
|
98
|
+
const level = typeof node.level === 'number' ? Math.min(6, Math.max(1, node.level)) : 1;
|
|
99
|
+
return text(node, ctx, { prefix: `${'#'.repeat(level)} ` });
|
|
100
|
+
},
|
|
101
|
+
Text: (node, ctx) => text(node, ctx),
|
|
102
|
+
P: (node, ctx) => text(node, ctx),
|
|
103
|
+
Lead: (node, ctx) => text(node, ctx),
|
|
104
|
+
Large: (node, ctx) => text(node, ctx),
|
|
105
|
+
Small: (node, ctx) => text(node, ctx, { variant: 'caption' }),
|
|
106
|
+
Muted: (node, ctx) => text(node, ctx, { variant: 'caption' }),
|
|
107
|
+
Label: (node, ctx) => text(node, ctx, { variant: 'caption' }),
|
|
108
|
+
TableCaption: (node, ctx) => text(node, ctx, { variant: 'caption' }),
|
|
109
|
+
BlockQuote: (node, ctx) => text(node, ctx, { prefix: '> ' }),
|
|
110
|
+
Code: (node, ctx) => text(node, ctx, { prefix: '`', suffix: '`' }),
|
|
111
|
+
Kbd: (node, ctx) => text(node, ctx, { prefix: '`', suffix: '`' }),
|
|
112
|
+
Markdown: (node, ctx) => text(node, ctx),
|
|
113
|
+
Badge: (node, ctx) => text(node, ctx, { keys: ['label', 'content'], variant: 'caption' }),
|
|
114
|
+
AlertTitle: (node, ctx) => text(node, ctx, { prefix: '**', suffix: '**' }),
|
|
115
|
+
AlertDescription: (node, ctx) => text(node, ctx),
|
|
116
|
+
};
|
|
117
|
+
for (const [type, prefix] of Object.entries(HEADING_PREFIX)) {
|
|
118
|
+
TEXT_MAPPERS[type] = (node, ctx) => text(node, ctx, { prefix });
|
|
119
|
+
}
|
|
120
|
+
// ── Media ────────────────────────────────────────────────────────────────────
|
|
121
|
+
function media(component) {
|
|
122
|
+
return (node, ctx) => {
|
|
123
|
+
const url = dynamicString(textOf(node, 'src', 'url'));
|
|
124
|
+
if (url == null) {
|
|
125
|
+
ctx.note('unsupported', node.type, 'no resolvable source URL');
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
// Only Image and AudioPlayer take a description; Video carries a poster instead.
|
|
129
|
+
const description = component === 'Video' ? undefined : dynamicString(textOf(node, 'alt', 'description'));
|
|
130
|
+
const poster = component === 'Video' ? dynamicString(textOf(node, 'poster', 'posterUrl')) : undefined;
|
|
131
|
+
return {
|
|
132
|
+
component,
|
|
133
|
+
url,
|
|
134
|
+
...(description != null && { description }),
|
|
135
|
+
...(poster != null && { posterUrl: poster }),
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// ── Form ─────────────────────────────────────────────────────────────────────
|
|
140
|
+
/** prefab `inputType` → the Basic catalog's four TextField variants. */
|
|
141
|
+
const TEXTFIELD_VARIANT = {
|
|
142
|
+
text: 'shortText', email: 'shortText', url: 'shortText', tel: 'shortText', search: 'shortText',
|
|
143
|
+
password: 'obscured', number: 'number',
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Bind a stateful control to the data model.
|
|
147
|
+
*
|
|
148
|
+
* prefab addresses form state by `name`, a key at the root of the state object,
|
|
149
|
+
* so the pointer is that name as a single escaped token.
|
|
150
|
+
*/
|
|
151
|
+
function valueBinding(node) {
|
|
152
|
+
const name = typeof node.name === 'string' ? node.name : undefined;
|
|
153
|
+
if (name == null)
|
|
154
|
+
return undefined;
|
|
155
|
+
const bound = toBinding(`{{ ${name} }}`);
|
|
156
|
+
return bound.kind === 'binding' ? bound.value : undefined;
|
|
157
|
+
}
|
|
158
|
+
function optionsOf(node, ctx) {
|
|
159
|
+
const children = Array.isArray(node.children) ? node.children : [];
|
|
160
|
+
const options = [];
|
|
161
|
+
for (const child of children) {
|
|
162
|
+
const value = textOf(child, 'value');
|
|
163
|
+
if (value == null) {
|
|
164
|
+
ctx.note('degraded', node.type, `dropped a ${child.type} child that carries no option value`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
options.push({ label: textOf(child, 'label') ?? value, value });
|
|
168
|
+
}
|
|
169
|
+
return options;
|
|
170
|
+
}
|
|
171
|
+
function dateTime(node, ctx, flags) {
|
|
172
|
+
if (textOf(node, 'label', 'name') == null) {
|
|
173
|
+
ctx.note('degraded', node.type, 'no label available for the DateTimeInput');
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
component: 'DateTimeInput',
|
|
177
|
+
// The catalog asks for an empty string while the value is unset.
|
|
178
|
+
value: valueBinding(node) ?? '',
|
|
179
|
+
...flags,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function choicePicker(variant) {
|
|
183
|
+
return (node, ctx) => {
|
|
184
|
+
const label = dynamicString(textOf(node, 'label', 'name'));
|
|
185
|
+
if (label == null) {
|
|
186
|
+
ctx.note('unsupported', node.type, 'ChoicePicker requires a label and none could be derived');
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
const options = optionsOf(node, ctx);
|
|
190
|
+
if (options.length === 0) {
|
|
191
|
+
ctx.note('unsupported', node.type, 'no options to choose from');
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
const value = valueBinding(node);
|
|
195
|
+
return { component: 'ChoicePicker', label, variant, options, ...(value != null && { value }) };
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function textField(node, ctx, variant) {
|
|
199
|
+
const label = dynamicString(textOf(node, 'label', 'name'));
|
|
200
|
+
if (label == null) {
|
|
201
|
+
ctx.note('unsupported', node.type, 'TextField requires a label and none could be derived');
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const value = valueBinding(node);
|
|
205
|
+
const placeholder = dynamicString(textOf(node, 'placeholder'));
|
|
206
|
+
return {
|
|
207
|
+
component: 'TextField',
|
|
208
|
+
label,
|
|
209
|
+
variant,
|
|
210
|
+
...(value != null && { value }),
|
|
211
|
+
...(placeholder != null && { placeholder }),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const FORM_MAPPERS = {
|
|
215
|
+
Input: (node, ctx) => {
|
|
216
|
+
const inputType = typeof node.inputType === 'string' ? node.inputType : 'text';
|
|
217
|
+
const variant = TEXTFIELD_VARIANT[inputType];
|
|
218
|
+
if (variant == null) {
|
|
219
|
+
ctx.note('degraded', node.type, `inputType "${inputType}" has no A2UI variant; used shortText`);
|
|
220
|
+
}
|
|
221
|
+
return textField(node, ctx, variant ?? 'shortText');
|
|
222
|
+
},
|
|
223
|
+
Textarea: (node, ctx) => textField(node, ctx, 'longText'),
|
|
224
|
+
Checkbox: (node, ctx) => {
|
|
225
|
+
const label = dynamicString(textOf(node, 'label', 'name'));
|
|
226
|
+
if (label == null) {
|
|
227
|
+
ctx.note('unsupported', node.type, 'CheckBox requires a label and none could be derived');
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
// `value` is required by the catalog; an unbound checkbox starts unchecked.
|
|
231
|
+
return { component: 'CheckBox', label, value: valueBinding(node) ?? false };
|
|
232
|
+
},
|
|
233
|
+
Slider: (node, ctx) => {
|
|
234
|
+
const max = typeof node.max === 'number' ? node.max : undefined;
|
|
235
|
+
if (max == null) {
|
|
236
|
+
ctx.note('unsupported', node.type, 'Slider requires a max and prefab left it open');
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
const label = dynamicString(textOf(node, 'label', 'name'));
|
|
240
|
+
const min = typeof node.min === 'number' ? node.min : undefined;
|
|
241
|
+
const step = typeof node.step === 'number' ? node.step : undefined;
|
|
242
|
+
// A2UI counts divisions where prefab counts increment size.
|
|
243
|
+
const steps = step != null && step > 0 ? Math.max(1, Math.round((max - (min ?? 0)) / step)) : undefined;
|
|
244
|
+
return {
|
|
245
|
+
component: 'Slider',
|
|
246
|
+
max,
|
|
247
|
+
value: valueBinding(node) ?? min ?? 0,
|
|
248
|
+
...(label != null && { label }),
|
|
249
|
+
...(min != null && { min }),
|
|
250
|
+
...(steps != null && { steps }),
|
|
251
|
+
};
|
|
252
|
+
},
|
|
253
|
+
Button: (node, ctx) => {
|
|
254
|
+
const label = textOf(node, 'label', 'content') ?? 'Button';
|
|
255
|
+
const action = ctx.action(node.onClick, 'Button')
|
|
256
|
+
?? (node.submit === true ? { event: { name: 'submit' } } : undefined);
|
|
257
|
+
if (action == null) {
|
|
258
|
+
ctx.note('unsupported', node.type, 'Button requires an action and none could be derived');
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
const child = ctx.push({ component: 'Text', text: dynamicString(label) ?? label });
|
|
262
|
+
const variant = node.variant === 'link' || node.variant === 'ghost'
|
|
263
|
+
? 'borderless'
|
|
264
|
+
: node.variant === 'default' ? 'primary' : 'default';
|
|
265
|
+
return { component: 'Button', child, action, variant };
|
|
266
|
+
},
|
|
267
|
+
Link: (node, ctx) => {
|
|
268
|
+
const href = textOf(node, 'href', 'url');
|
|
269
|
+
if (href == null) {
|
|
270
|
+
ctx.note('unsupported', node.type, 'no href to open');
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
const label = textOf(node, 'content', 'label') ?? href;
|
|
274
|
+
const child = ctx.push({ component: 'Text', text: dynamicString(label) ?? label });
|
|
275
|
+
// A2UI Basic renders links as a borderless Button running the openUrl function.
|
|
276
|
+
return {
|
|
277
|
+
component: 'Button',
|
|
278
|
+
child,
|
|
279
|
+
variant: 'borderless',
|
|
280
|
+
action: { functionCall: { call: 'openUrl', args: { url: href } } },
|
|
281
|
+
};
|
|
282
|
+
},
|
|
283
|
+
DatePicker: (node, ctx) => dateTime(node, ctx, { enableDate: true }),
|
|
284
|
+
TimePicker: (node, ctx) => dateTime(node, ctx, { enableTime: true }),
|
|
285
|
+
DateTimePicker: (node, ctx) => dateTime(node, ctx, { enableDate: true, enableTime: true }),
|
|
286
|
+
Select: choicePicker('mutuallyExclusive'),
|
|
287
|
+
RadioGroup: choicePicker('mutuallyExclusive'),
|
|
288
|
+
Combobox: choicePicker('mutuallyExclusive'),
|
|
289
|
+
};
|
|
290
|
+
// A Switch is a checkbox with a different affordance; A2UI Basic has one control for both.
|
|
291
|
+
FORM_MAPPERS.Switch = FORM_MAPPERS.Checkbox;
|
|
292
|
+
// ── Composites ───────────────────────────────────────────────────────────────
|
|
293
|
+
const COMPOSITE_MAPPERS = {
|
|
294
|
+
Card: (node, ctx) => {
|
|
295
|
+
const child = ctx.single(node.children);
|
|
296
|
+
if (child == null) {
|
|
297
|
+
ctx.note('unsupported', 'Card', 'Card requires a child and it had none');
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
return { component: 'Card', child };
|
|
301
|
+
},
|
|
302
|
+
Alert: (node, ctx) => {
|
|
303
|
+
const child = ctx.single(node.children);
|
|
304
|
+
if (child == null) {
|
|
305
|
+
ctx.note('unsupported', 'Alert', 'no alert body to render');
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
const variant = typeof node.variant === 'string' ? node.variant : 'default';
|
|
309
|
+
ctx.note('degraded', 'Alert', `variant "${variant}" rendered as a plain Card`);
|
|
310
|
+
return { component: 'Card', child };
|
|
311
|
+
},
|
|
312
|
+
Separator: () => ({ component: 'Divider' }),
|
|
313
|
+
Divider: () => ({ component: 'Divider' }),
|
|
314
|
+
Icon: (node, ctx) => {
|
|
315
|
+
const name = textOf(node, 'name', 'icon');
|
|
316
|
+
if (name == null) {
|
|
317
|
+
ctx.note('unsupported', 'Icon', 'no icon name');
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
// A2UI's icon names are a closed enum, so an unrecognised one fails
|
|
321
|
+
// validation rather than falling back to a default glyph.
|
|
322
|
+
const resolved = a2uiIconName(name);
|
|
323
|
+
if (resolved == null) {
|
|
324
|
+
ctx.note('unsupported', 'Icon', `"${name}" has no equivalent in the A2UI icon set`);
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
if (resolved !== name)
|
|
328
|
+
ctx.note('degraded', 'Icon', `"${name}" mapped to the A2UI icon "${resolved}"`);
|
|
329
|
+
return { component: 'Icon', name: resolved };
|
|
330
|
+
},
|
|
331
|
+
Metric: (node, ctx) => {
|
|
332
|
+
// A Column of caption + value is the closest Basic-catalog reading of a KPI tile.
|
|
333
|
+
const parts = [];
|
|
334
|
+
const label = textOf(node, 'label', 'title');
|
|
335
|
+
if (label != null) {
|
|
336
|
+
parts.push(ctx.push({ component: 'Text', text: dynamicString(label) ?? label, variant: 'caption' }));
|
|
337
|
+
}
|
|
338
|
+
const value = textOf(node, 'value');
|
|
339
|
+
if (value != null) {
|
|
340
|
+
parts.push(ctx.push({ component: 'Text', text: dynamicString(value) ?? value }));
|
|
341
|
+
}
|
|
342
|
+
if (parts.length === 0) {
|
|
343
|
+
ctx.note('unsupported', 'Metric', 'neither a label nor a value to render');
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
ctx.note('degraded', 'Metric', 'rendered as a Column of Text; trend and delta styling dropped');
|
|
347
|
+
return { component: 'Column', children: parts };
|
|
348
|
+
},
|
|
349
|
+
Tabs: (node, ctx) => {
|
|
350
|
+
const children = Array.isArray(node.children) ? node.children : [];
|
|
351
|
+
const tabs = [];
|
|
352
|
+
for (const tab of children) {
|
|
353
|
+
const child = ctx.single(tab.children);
|
|
354
|
+
if (child == null)
|
|
355
|
+
continue;
|
|
356
|
+
tabs.push({ title: textOf(tab, 'title') ?? 'Tab', child });
|
|
357
|
+
}
|
|
358
|
+
if (tabs.length === 0) {
|
|
359
|
+
ctx.note('unsupported', 'Tabs', 'no tab had renderable content');
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
362
|
+
return { component: 'Tabs', tabs };
|
|
363
|
+
},
|
|
364
|
+
Dialog: (node, ctx) => {
|
|
365
|
+
const content = ctx.single(node.children);
|
|
366
|
+
if (content == null) {
|
|
367
|
+
ctx.note('unsupported', 'Dialog', 'no dialog body to render');
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
const triggerNode = node.trigger;
|
|
371
|
+
const trigger = triggerNode != null
|
|
372
|
+
? ctx.child(triggerNode)
|
|
373
|
+
: ctx.push({ component: 'Text', text: textOf(node, 'title') ?? 'Open' });
|
|
374
|
+
if (trigger == null) {
|
|
375
|
+
ctx.note('unsupported', 'Dialog', 'Modal requires a trigger and none could be emitted');
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
return { component: 'Modal', trigger, content };
|
|
379
|
+
},
|
|
380
|
+
AccordionItem: (node, ctx) => {
|
|
381
|
+
const parts = [];
|
|
382
|
+
const title = textOf(node, 'title');
|
|
383
|
+
if (title != null)
|
|
384
|
+
parts.push(ctx.push({ component: 'Text', text: title, variant: 'caption' }));
|
|
385
|
+
parts.push(...ctx.children(node.children));
|
|
386
|
+
if (parts.length === 0) {
|
|
387
|
+
ctx.note('unsupported', 'AccordionItem', 'nothing to render');
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
ctx.note('degraded', 'AccordionItem', 'rendered expanded; A2UI Basic has no disclosure component');
|
|
391
|
+
return { component: 'Column', children: parts };
|
|
392
|
+
},
|
|
393
|
+
};
|
|
394
|
+
// ── Registry ─────────────────────────────────────────────────────────────────
|
|
395
|
+
const MAPPERS = {
|
|
396
|
+
Column: flow('Column'),
|
|
397
|
+
Row: flow('Row'),
|
|
398
|
+
...TEXT_MAPPERS,
|
|
399
|
+
...FORM_MAPPERS,
|
|
400
|
+
...COMPOSITE_MAPPERS,
|
|
401
|
+
Image: media('Image'),
|
|
402
|
+
Video: media('Video'),
|
|
403
|
+
Audio: media('AudioPlayer'),
|
|
404
|
+
Table: mapTable,
|
|
405
|
+
DataTable: mapDataTable,
|
|
406
|
+
};
|
|
407
|
+
for (const type of AS_COLUMN)
|
|
408
|
+
MAPPERS[type] ??= flow('Column');
|
|
409
|
+
for (const type of AS_ROW)
|
|
410
|
+
MAPPERS[type] ??= flow('Row');
|
|
411
|
+
/** Types that only make sense inside their parent's mapper. */
|
|
412
|
+
const CONSUMED_BY_PARENT = new Set([
|
|
413
|
+
'Tab', 'SelectOption', 'ComboboxOption', 'Radio', 'Option', ...TABLE_PART_TYPES,
|
|
414
|
+
]);
|
|
415
|
+
/**
|
|
416
|
+
* Component families with no Basic-catalog reading at all. Naming them keeps the
|
|
417
|
+
* diagnostic specific ("charts are outside the Basic catalog") rather than the
|
|
418
|
+
* generic fallback's "no equivalent".
|
|
419
|
+
*/
|
|
420
|
+
const KNOWN_UNSUPPORTED = {
|
|
421
|
+
LineChart: 'charts', BarChart: 'charts', AreaChart: 'charts', PieChart: 'charts',
|
|
422
|
+
ScatterChart: 'charts', RadarChart: 'charts', RadialChart: 'charts',
|
|
423
|
+
Histogram: 'charts', Sparkline: 'charts',
|
|
424
|
+
Svg: 'inline vector graphics', Mermaid: 'diagrams', Embed: 'embedded frames',
|
|
425
|
+
DropZone: 'file uploads', Ring: 'progress rings', Loader: 'loading indicators',
|
|
426
|
+
Progress: 'progress bars',
|
|
427
|
+
};
|
|
428
|
+
export function mapperFor(type) {
|
|
429
|
+
return MAPPERS[type];
|
|
430
|
+
}
|
|
431
|
+
export function isConsumedByParent(type) {
|
|
432
|
+
return CONSUMED_BY_PARENT.has(type);
|
|
433
|
+
}
|
|
434
|
+
/** Every prefab type with a first-class mapping, for docs and tests. */
|
|
435
|
+
export function mappedTypes() {
|
|
436
|
+
return Object.keys(MAPPERS).sort();
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Last-resort mapping for a type the registry does not name.
|
|
440
|
+
*
|
|
441
|
+
* A node with children becomes a Column, a node with text becomes a Text, and
|
|
442
|
+
* anything else is dropped. This is what keeps a tree built from unmapped
|
|
443
|
+
* components emitting something coherent instead of failing outright.
|
|
444
|
+
*/
|
|
445
|
+
export function fallbackMapper(node, ctx) {
|
|
446
|
+
const family = KNOWN_UNSUPPORTED[node.type];
|
|
447
|
+
if (family != null) {
|
|
448
|
+
ctx.note('unsupported', node.type, `${family} are outside the A2UI Basic catalog`);
|
|
449
|
+
return undefined;
|
|
450
|
+
}
|
|
451
|
+
if (Array.isArray(node.children) && node.children.length > 0) {
|
|
452
|
+
const children = ctx.children(node.children);
|
|
453
|
+
if (children.length > 0) {
|
|
454
|
+
ctx.note('degraded', node.type, 'no Basic-catalog equivalent; flattened to a Column');
|
|
455
|
+
return { component: 'Column', children };
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (textOf(node, 'content', 'text', 'label', 'title') != null) {
|
|
459
|
+
ctx.note('degraded', node.type, 'no Basic-catalog equivalent; rendered as Text');
|
|
460
|
+
return text(node, ctx);
|
|
461
|
+
}
|
|
462
|
+
ctx.note('unsupported', node.type, 'no Basic-catalog equivalent and nothing to render');
|
|
463
|
+
return undefined;
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/a2ui/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `$prefab` → A2UI emitter.
|
|
3
|
+
*
|
|
4
|
+
* Walks the nested `$prefab` component tree and produces A2UI's flat adjacency
|
|
5
|
+
* list, plus the surface data model. Three invariants drive the implementation:
|
|
6
|
+
*
|
|
7
|
+
* - **The root is named `root`.** A2UI requires exactly that id on the entry
|
|
8
|
+
* component, so it is reserved before traversal begins rather than renamed
|
|
9
|
+
* afterwards.
|
|
10
|
+
* - **Ids are allocated before children are emitted.** A mapper calls back
|
|
11
|
+
* into the context to emit its children, so the parent's slot is reserved
|
|
12
|
+
* first and filled in once the mapper returns. Nodes that turn out to be
|
|
13
|
+
* unmappable release their slot, which is why the components map is keyed
|
|
14
|
+
* by id rather than being a positional array.
|
|
15
|
+
* - **Emission is deterministic.** Ids are drawn from a counter in traversal
|
|
16
|
+
* order, so the same tree always produces byte-identical output and can be
|
|
17
|
+
* asserted on in tests and cached by hosts.
|
|
18
|
+
*/
|
|
19
|
+
import type { PrefabWireFormat } from '../app.js';
|
|
20
|
+
import { type A2uiDiagnostic, type A2uiMessage } from './types.js';
|
|
21
|
+
export interface A2uiEmitOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Surface id. Must be unique for the renderer's lifetime.
|
|
24
|
+
* @default 'prefab'
|
|
25
|
+
*/
|
|
26
|
+
surfaceId?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Catalog the surface's components are drawn from.
|
|
29
|
+
* @default the A2UI Basic catalog
|
|
30
|
+
*/
|
|
31
|
+
catalogId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Split the output into `createSurface` + `updateComponents` +
|
|
34
|
+
* `updateDataModel` instead of inlining everything into `createSurface`.
|
|
35
|
+
* Streaming transports want the split so the renderer can paint early; a
|
|
36
|
+
* single stored payload does not. @default false
|
|
37
|
+
*/
|
|
38
|
+
stream?: boolean;
|
|
39
|
+
/** Ask the renderer to echo the data model back on every event. @default false */
|
|
40
|
+
sendDataModel?: boolean;
|
|
41
|
+
/** Log degradations and dropped nodes at warn level. @default false */
|
|
42
|
+
warn?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Emitted messages plus what the translation cost. */
|
|
45
|
+
export interface A2uiEmitResult {
|
|
46
|
+
messages: A2uiMessage[];
|
|
47
|
+
diagnostics: A2uiDiagnostic[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Translate a `$prefab` wire payload into A2UI messages.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* const { messages, diagnostics } = emitA2UI(app.toJSON())
|
|
55
|
+
* if (diagnostics.length > 0) console.warn(diagnostics)
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function emitA2UI(wire: PrefabWireFormat, options?: A2uiEmitOptions): A2uiEmitResult;
|
|
59
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/a2ui/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAIjD,OAAO,EAML,KAAK,cAAc,EAGnB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AAInB,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,WAAW,EAAE,cAAc,EAAE,CAAA;CAC9B;AAkPD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,CAG1F"}
|