@maxhealth.tech/prefab 0.1.2
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 +51 -0
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/dist/actions/client.d.ts +98 -0
- package/dist/actions/client.d.ts.map +1 -0
- package/dist/actions/client.js +188 -0
- package/dist/actions/client.js.map +1 -0
- package/dist/actions/index.d.ts +6 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +3 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/mcp.d.ts +37 -0
- package/dist/actions/mcp.d.ts.map +1 -0
- package/dist/actions/mcp.js +64 -0
- package/dist/actions/mcp.js.map +1 -0
- package/dist/actions/types.d.ts +16 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +8 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +120 -0
- package/dist/app.js.map +1 -0
- package/dist/auto/chart.d.ts +36 -0
- package/dist/auto/chart.d.ts.map +1 -0
- package/dist/auto/chart.js +50 -0
- package/dist/auto/chart.js.map +1 -0
- package/dist/auto/comparison.d.ts +32 -0
- package/dist/auto/comparison.d.ts.map +1 -0
- package/dist/auto/comparison.js +66 -0
- package/dist/auto/comparison.js.map +1 -0
- package/dist/auto/form.d.ts +50 -0
- package/dist/auto/form.d.ts.map +1 -0
- package/dist/auto/form.js +68 -0
- package/dist/auto/form.js.map +1 -0
- package/dist/auto/index.d.ts +84 -0
- package/dist/auto/index.d.ts.map +1 -0
- package/dist/auto/index.js +240 -0
- package/dist/auto/index.js.map +1 -0
- package/dist/auto/metrics.d.ts +44 -0
- package/dist/auto/metrics.d.ts.map +1 -0
- package/dist/auto/metrics.js +55 -0
- package/dist/auto/metrics.js.map +1 -0
- package/dist/auto/progress.d.ts +38 -0
- package/dist/auto/progress.d.ts.map +1 -0
- package/dist/auto/progress.js +72 -0
- package/dist/auto/progress.js.map +1 -0
- package/dist/auto/timeline.d.ts +41 -0
- package/dist/auto/timeline.d.ts.map +1 -0
- package/dist/auto/timeline.js +72 -0
- package/dist/auto/timeline.js.map +1 -0
- package/dist/components/alert/index.d.ts +14 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +31 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/card/index.d.ts +12 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +33 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/charts/index.d.ts +57 -0
- package/dist/components/charts/index.d.ts.map +1 -0
- package/dist/components/charts/index.js +91 -0
- package/dist/components/charts/index.js.map +1 -0
- package/dist/components/control/index.d.ts +48 -0
- package/dist/components/control/index.d.ts.map +1 -0
- package/dist/components/control/index.js +47 -0
- package/dist/components/control/index.js.map +1 -0
- package/dist/components/data/index.d.ts +53 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/data/index.js +88 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/form/index.d.ts +103 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/form/index.js +247 -0
- package/dist/components/form/index.js.map +1 -0
- package/dist/components/interactive/index.d.ts +33 -0
- package/dist/components/interactive/index.d.ts.map +1 -0
- package/dist/components/interactive/index.js +59 -0
- package/dist/components/interactive/index.js.map +1 -0
- package/dist/components/layout/index.d.ts +61 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +86 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/media/index.d.ts +17 -0
- package/dist/components/media/index.d.ts.map +1 -0
- package/dist/components/media/index.js +41 -0
- package/dist/components/media/index.js.map +1 -0
- package/dist/components/table/index.d.ts +28 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/table/index.js +56 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/typography/index.d.ts +34 -0
- package/dist/components/typography/index.d.ts.map +1 -0
- package/dist/components/typography/index.js +93 -0
- package/dist/components/typography/index.js.map +1 -0
- package/dist/core/component.d.ts +67 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +122 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/validate.d.ts +30 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +178 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/display.d.ts +102 -0
- package/dist/mcp/display.d.ts.map +1 -0
- package/dist/mcp/display.js +124 -0
- package/dist/mcp/display.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +35 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/renderer/actions.d.ts +36 -0
- package/dist/renderer/actions.d.ts.map +1 -0
- package/dist/renderer/actions.js +296 -0
- package/dist/renderer/actions.js.map +1 -0
- package/dist/renderer/app.d.ts +87 -0
- package/dist/renderer/app.d.ts.map +1 -0
- package/dist/renderer/app.js +166 -0
- package/dist/renderer/app.js.map +1 -0
- package/dist/renderer/bridge.d.ts +91 -0
- package/dist/renderer/bridge.d.ts.map +1 -0
- package/dist/renderer/bridge.js +302 -0
- package/dist/renderer/bridge.js.map +1 -0
- package/dist/renderer/components/alert.d.ts +5 -0
- package/dist/renderer/components/alert.d.ts.map +1 -0
- package/dist/renderer/components/alert.js +44 -0
- package/dist/renderer/components/alert.js.map +1 -0
- package/dist/renderer/components/card.d.ts +5 -0
- package/dist/renderer/components/card.d.ts.map +1 -0
- package/dist/renderer/components/card.js +38 -0
- package/dist/renderer/components/card.js.map +1 -0
- package/dist/renderer/components/charts.d.ts +8 -0
- package/dist/renderer/components/charts.d.ts.map +1 -0
- package/dist/renderer/components/charts.js +232 -0
- package/dist/renderer/components/charts.js.map +1 -0
- package/dist/renderer/components/control.d.ts +5 -0
- package/dist/renderer/components/control.d.ts.map +1 -0
- package/dist/renderer/components/control.js +140 -0
- package/dist/renderer/components/control.js.map +1 -0
- package/dist/renderer/components/data.d.ts +5 -0
- package/dist/renderer/components/data.d.ts.map +1 -0
- package/dist/renderer/components/data.js +268 -0
- package/dist/renderer/components/data.js.map +1 -0
- package/dist/renderer/components/form.d.ts +5 -0
- package/dist/renderer/components/form.d.ts.map +1 -0
- package/dist/renderer/components/form.js +523 -0
- package/dist/renderer/components/form.js.map +1 -0
- package/dist/renderer/components/index.d.ts +5 -0
- package/dist/renderer/components/index.d.ts.map +1 -0
- package/dist/renderer/components/index.js +32 -0
- package/dist/renderer/components/index.js.map +1 -0
- package/dist/renderer/components/interactive.d.ts +5 -0
- package/dist/renderer/components/interactive.d.ts.map +1 -0
- package/dist/renderer/components/interactive.js +324 -0
- package/dist/renderer/components/interactive.js.map +1 -0
- package/dist/renderer/components/layout.d.ts +5 -0
- package/dist/renderer/components/layout.d.ts.map +1 -0
- package/dist/renderer/components/layout.js +113 -0
- package/dist/renderer/components/layout.js.map +1 -0
- package/dist/renderer/components/media.d.ts +5 -0
- package/dist/renderer/components/media.d.ts.map +1 -0
- package/dist/renderer/components/media.js +132 -0
- package/dist/renderer/components/media.js.map +1 -0
- package/dist/renderer/components/table.d.ts +5 -0
- package/dist/renderer/components/table.d.ts.map +1 -0
- package/dist/renderer/components/table.js +101 -0
- package/dist/renderer/components/table.js.map +1 -0
- package/dist/renderer/components/typography.d.ts +5 -0
- package/dist/renderer/components/typography.d.ts.map +1 -0
- package/dist/renderer/components/typography.js +90 -0
- package/dist/renderer/components/typography.js.map +1 -0
- package/dist/renderer/engine.d.ts +53 -0
- package/dist/renderer/engine.d.ts.map +1 -0
- package/dist/renderer/engine.js +112 -0
- package/dist/renderer/engine.js.map +1 -0
- package/dist/renderer/index.d.ts +94 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +215 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/rx.d.ts +37 -0
- package/dist/renderer/rx.d.ts.map +1 -0
- package/dist/renderer/rx.js +360 -0
- package/dist/renderer/rx.js.map +1 -0
- package/dist/renderer/state.d.ts +34 -0
- package/dist/renderer/state.d.ts.map +1 -0
- package/dist/renderer/state.js +132 -0
- package/dist/renderer/state.js.map +1 -0
- package/dist/renderer/theme.d.ts +13 -0
- package/dist/renderer/theme.d.ts.map +1 -0
- package/dist/renderer/theme.js +69 -0
- package/dist/renderer/theme.js.map +1 -0
- package/dist/renderer/transport.d.ts +22 -0
- package/dist/renderer/transport.d.ts.map +1 -0
- package/dist/renderer/transport.js +69 -0
- package/dist/renderer/transport.js.map +1 -0
- package/dist/renderer.min.js +83 -0
- package/dist/rx/index.d.ts +2 -0
- package/dist/rx/index.d.ts.map +1 -0
- package/dist/rx/index.js +2 -0
- package/dist/rx/index.js.map +1 -0
- package/dist/rx/rx.d.ts +81 -0
- package/dist/rx/rx.d.ts.map +1 -0
- package/dist/rx/rx.js +196 -0
- package/dist/rx/rx.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table component renderers — Table, TableHead, TableBody, TableRow, etc.
|
|
3
|
+
*/
|
|
4
|
+
import { registerComponent, renderChildren, renderNode, resolveStr, el } from '../engine.js';
|
|
5
|
+
export function registerTableComponents() {
|
|
6
|
+
registerComponent('Table', renderTable);
|
|
7
|
+
registerComponent('TableHead', renderTableSection('thead'));
|
|
8
|
+
registerComponent('TableBody', renderTableSection('tbody'));
|
|
9
|
+
registerComponent('TableFooter', renderTableSection('tfoot'));
|
|
10
|
+
registerComponent('TableRow', renderTableRow);
|
|
11
|
+
registerComponent('TableHeader', renderTableHeader);
|
|
12
|
+
registerComponent('TableCell', renderTableCell);
|
|
13
|
+
registerComponent('TableCaption', renderTableCaption);
|
|
14
|
+
registerComponent('ExpandableRow', renderExpandableRow);
|
|
15
|
+
}
|
|
16
|
+
function renderTable(node, ctx) {
|
|
17
|
+
const table = document.createElement('table');
|
|
18
|
+
table.className = 'pf-table';
|
|
19
|
+
table.style.width = '100%';
|
|
20
|
+
table.style.borderCollapse = 'collapse';
|
|
21
|
+
renderChildren(node, table, ctx);
|
|
22
|
+
return table;
|
|
23
|
+
}
|
|
24
|
+
function renderTableSection(tag) {
|
|
25
|
+
return (node, ctx) => {
|
|
26
|
+
const e = document.createElement(tag);
|
|
27
|
+
e.className = `pf-${tag}`;
|
|
28
|
+
renderChildren(node, e, ctx);
|
|
29
|
+
return e;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function renderTableRow(node, ctx) {
|
|
33
|
+
const tr = document.createElement('tr');
|
|
34
|
+
tr.className = 'pf-table-row';
|
|
35
|
+
renderChildren(node, tr, ctx);
|
|
36
|
+
return tr;
|
|
37
|
+
}
|
|
38
|
+
function renderTableHeader(node, ctx) {
|
|
39
|
+
const th = document.createElement('th');
|
|
40
|
+
th.className = 'pf-table-header';
|
|
41
|
+
th.style.textAlign = 'left';
|
|
42
|
+
th.style.padding = '8px 12px';
|
|
43
|
+
th.style.borderBottom = '2px solid var(--border, #e5e7eb)';
|
|
44
|
+
th.style.fontWeight = '600';
|
|
45
|
+
th.textContent = resolveStr(node.content, ctx);
|
|
46
|
+
return th;
|
|
47
|
+
}
|
|
48
|
+
function renderTableCell(node, ctx) {
|
|
49
|
+
const td = document.createElement('td');
|
|
50
|
+
td.className = 'pf-table-cell';
|
|
51
|
+
td.style.padding = '8px 12px';
|
|
52
|
+
td.style.borderBottom = '1px solid var(--border, #e5e7eb)';
|
|
53
|
+
if (node.colSpan != null)
|
|
54
|
+
td.colSpan = node.colSpan;
|
|
55
|
+
if (node.rowSpan != null)
|
|
56
|
+
td.rowSpan = node.rowSpan;
|
|
57
|
+
renderChildren(node, td, ctx);
|
|
58
|
+
return td;
|
|
59
|
+
}
|
|
60
|
+
function renderTableCaption(node, ctx) {
|
|
61
|
+
const caption = document.createElement('caption');
|
|
62
|
+
caption.className = 'pf-table-caption';
|
|
63
|
+
caption.style.padding = '8px';
|
|
64
|
+
caption.style.color = 'var(--muted-foreground, #6b7280)';
|
|
65
|
+
caption.style.fontSize = '14px';
|
|
66
|
+
caption.textContent = resolveStr(node.content, ctx);
|
|
67
|
+
return caption;
|
|
68
|
+
}
|
|
69
|
+
function renderExpandableRow(node, ctx) {
|
|
70
|
+
const wrapper = el('div', 'pf-expandable-row');
|
|
71
|
+
const summary = el('div', 'pf-expandable-row-summary');
|
|
72
|
+
summary.style.cursor = 'pointer';
|
|
73
|
+
summary.style.display = 'flex';
|
|
74
|
+
summary.style.alignItems = 'center';
|
|
75
|
+
summary.style.gap = '8px';
|
|
76
|
+
const arrow = el('span', 'pf-expandable-arrow');
|
|
77
|
+
arrow.textContent = '▶';
|
|
78
|
+
arrow.style.transition = 'transform 0.2s';
|
|
79
|
+
arrow.style.fontSize = '10px';
|
|
80
|
+
summary.appendChild(arrow);
|
|
81
|
+
const summaryNodes = node.summary;
|
|
82
|
+
if (summaryNodes) {
|
|
83
|
+
for (const sn of summaryNodes) {
|
|
84
|
+
summary.appendChild(renderNode(sn, ctx));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const detail = el('div', 'pf-expandable-row-detail');
|
|
88
|
+
detail.style.display = 'none';
|
|
89
|
+
detail.style.paddingLeft = '24px';
|
|
90
|
+
renderChildren(node, detail, ctx);
|
|
91
|
+
let expanded = false;
|
|
92
|
+
summary.addEventListener('click', () => {
|
|
93
|
+
expanded = !expanded;
|
|
94
|
+
detail.style.display = expanded ? 'block' : 'none';
|
|
95
|
+
arrow.style.transform = expanded ? 'rotate(90deg)' : '';
|
|
96
|
+
});
|
|
97
|
+
wrapper.appendChild(summary);
|
|
98
|
+
wrapper.appendChild(detail);
|
|
99
|
+
return wrapper;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/renderer/components/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typography.d.ts","sourceRoot":"","sources":["../../../src/renderer/components/typography.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAgB,4BAA4B,IAAI,IAAI,CAkBnD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typography component renderers — Heading, Text, Muted, Code, Markdown, etc.
|
|
3
|
+
*/
|
|
4
|
+
import { registerComponent, resolveStr, el, text } from '../engine.js';
|
|
5
|
+
export function registerTypographyComponents() {
|
|
6
|
+
registerComponent('Heading', renderHeading);
|
|
7
|
+
registerComponent('H1', (n, c) => renderHx(n, c, 'h1'));
|
|
8
|
+
registerComponent('H2', (n, c) => renderHx(n, c, 'h2'));
|
|
9
|
+
registerComponent('H3', (n, c) => renderHx(n, c, 'h3'));
|
|
10
|
+
registerComponent('H4', (n, c) => renderHx(n, c, 'h4'));
|
|
11
|
+
registerComponent('Text', renderText);
|
|
12
|
+
registerComponent('P', renderP);
|
|
13
|
+
registerComponent('Lead', (n, c) => renderStyled(n, c, 'p', 'pf-lead'));
|
|
14
|
+
registerComponent('Large', (n, c) => renderStyled(n, c, 'span', 'pf-large'));
|
|
15
|
+
registerComponent('Small', (n, c) => renderStyled(n, c, 'small', 'pf-small'));
|
|
16
|
+
registerComponent('Muted', (n, c) => renderStyled(n, c, 'p', 'pf-muted'));
|
|
17
|
+
registerComponent('BlockQuote', (n, c) => renderStyled(n, c, 'blockquote', 'pf-blockquote'));
|
|
18
|
+
registerComponent('Label', (n, c) => renderStyled(n, c, 'label', 'pf-label'));
|
|
19
|
+
registerComponent('Link', renderLink);
|
|
20
|
+
registerComponent('Code', renderCode);
|
|
21
|
+
registerComponent('Markdown', renderMarkdown);
|
|
22
|
+
registerComponent('Kbd', renderKbd);
|
|
23
|
+
}
|
|
24
|
+
function renderHeading(node, ctx) {
|
|
25
|
+
const level = node.level ?? 2;
|
|
26
|
+
const tag = `h${Math.min(Math.max(level, 1), 6)}`;
|
|
27
|
+
const e = document.createElement(tag);
|
|
28
|
+
e.className = `pf-heading pf-${tag}`;
|
|
29
|
+
e.textContent = resolveStr(node.content, ctx);
|
|
30
|
+
return e;
|
|
31
|
+
}
|
|
32
|
+
function renderHx(node, ctx, tag) {
|
|
33
|
+
const e = document.createElement(tag);
|
|
34
|
+
e.className = `pf-heading pf-${tag}`;
|
|
35
|
+
e.textContent = resolveStr(node.content, ctx);
|
|
36
|
+
return e;
|
|
37
|
+
}
|
|
38
|
+
function renderText(node, ctx) {
|
|
39
|
+
return text(el('span', 'pf-text'), resolveStr(node.content, ctx));
|
|
40
|
+
}
|
|
41
|
+
function renderP(node, ctx) {
|
|
42
|
+
return text(el('p', 'pf-p'), resolveStr(node.content, ctx));
|
|
43
|
+
}
|
|
44
|
+
function renderStyled(node, ctx, tag, cls) {
|
|
45
|
+
const e = document.createElement(tag);
|
|
46
|
+
e.className = cls;
|
|
47
|
+
e.textContent = resolveStr(node.content, ctx);
|
|
48
|
+
return e;
|
|
49
|
+
}
|
|
50
|
+
/** Blocked URL schemes that can execute code. */
|
|
51
|
+
const UNSAFE_SCHEMES = /^\s*(javascript|vbscript|data):/i;
|
|
52
|
+
function renderLink(node, ctx) {
|
|
53
|
+
const a = document.createElement('a');
|
|
54
|
+
a.className = 'pf-link';
|
|
55
|
+
a.textContent = resolveStr(node.content, ctx);
|
|
56
|
+
if (node.href != null) {
|
|
57
|
+
const href = resolveStr(node.href, ctx);
|
|
58
|
+
if (!UNSAFE_SCHEMES.test(href)) {
|
|
59
|
+
a.href = href;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (node.target != null)
|
|
63
|
+
a.target = resolveStr(node.target, ctx);
|
|
64
|
+
return a;
|
|
65
|
+
}
|
|
66
|
+
function renderCode(node, ctx) {
|
|
67
|
+
const pre = el('pre', 'pf-code');
|
|
68
|
+
const code = el('code');
|
|
69
|
+
code.textContent = resolveStr(node.content, ctx);
|
|
70
|
+
if (node.language != null)
|
|
71
|
+
code.setAttribute('data-language', node.language);
|
|
72
|
+
pre.appendChild(code);
|
|
73
|
+
return pre;
|
|
74
|
+
}
|
|
75
|
+
function renderMarkdown(node, ctx) {
|
|
76
|
+
const e = el('div', 'pf-markdown');
|
|
77
|
+
// Basic markdown rendering — just set innerHTML with escaped content
|
|
78
|
+
// A real implementation would use a markdown parser
|
|
79
|
+
const content = resolveStr(node.content, ctx);
|
|
80
|
+
e.textContent = content;
|
|
81
|
+
e.setAttribute('data-markdown', 'true');
|
|
82
|
+
return e;
|
|
83
|
+
}
|
|
84
|
+
function renderKbd(node, ctx) {
|
|
85
|
+
const e = document.createElement('kbd');
|
|
86
|
+
e.className = 'pf-kbd';
|
|
87
|
+
e.textContent = resolveStr(node.content, ctx);
|
|
88
|
+
return e;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=typography.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typography.js","sourceRoot":"","sources":["../../../src/renderer/components/typography.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component render engine — takes JSON component trees and produces DOM.
|
|
3
|
+
*
|
|
4
|
+
* The engine uses a registry of render functions keyed by component type.
|
|
5
|
+
* Each render function receives the JSON node and a render context,
|
|
6
|
+
* and returns an HTMLElement (or DocumentFragment).
|
|
7
|
+
*/
|
|
8
|
+
import type { Store } from './state.js';
|
|
9
|
+
import type { EvalScope } from './rx.js';
|
|
10
|
+
import type { DispatchContext, McpTransport, ToastEvent, ActionJSON } from './actions.js';
|
|
11
|
+
export interface ComponentNode {
|
|
12
|
+
type: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
cssClass?: string;
|
|
15
|
+
onMount?: ActionJSON | ActionJSON[];
|
|
16
|
+
children?: ComponentNode[];
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface RenderContext {
|
|
20
|
+
store: Store;
|
|
21
|
+
scope: EvalScope;
|
|
22
|
+
transport?: McpTransport;
|
|
23
|
+
rerender: () => void;
|
|
24
|
+
onToast?: (toast: ToastEvent) => void;
|
|
25
|
+
defs?: Record<string, ComponentNode>;
|
|
26
|
+
templates?: Record<string, ComponentNode[]>;
|
|
27
|
+
slots?: Record<string, ComponentNode[]>;
|
|
28
|
+
}
|
|
29
|
+
export type RenderFn = (node: ComponentNode, ctx: RenderContext) => HTMLElement | DocumentFragment;
|
|
30
|
+
/** Register a render function for a component type */
|
|
31
|
+
export declare function registerComponent(type: string, fn: RenderFn): void;
|
|
32
|
+
/** Get a render function (or fallback) */
|
|
33
|
+
export declare function getRenderer(type: string): RenderFn | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Render a component node to DOM.
|
|
36
|
+
* Looks up the renderer by type; falls back to a generic div.
|
|
37
|
+
*/
|
|
38
|
+
export declare function renderNode(node: ComponentNode, ctx: RenderContext): HTMLElement | DocumentFragment;
|
|
39
|
+
/**
|
|
40
|
+
* Render all children of a node into a parent element.
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderChildren(node: ComponentNode, parent: HTMLElement, ctx: RenderContext): void;
|
|
43
|
+
/** Resolve a possibly-reactive string value */
|
|
44
|
+
export declare function resolveStr(value: unknown, ctx: RenderContext): string;
|
|
45
|
+
/** Resolve a possibly-reactive value, keeping original type */
|
|
46
|
+
export declare function resolveValue(value: unknown, ctx: RenderContext): unknown;
|
|
47
|
+
/** Create a DispatchContext from RenderContext */
|
|
48
|
+
export declare function makeDispatchCtx(ctx: RenderContext): DispatchContext;
|
|
49
|
+
/** Create an element with a CSS class */
|
|
50
|
+
export declare function el(tag: string, className?: string): HTMLElement;
|
|
51
|
+
/** Set text content on an element */
|
|
52
|
+
export declare function text(element: HTMLElement, content: string): HTMLElement;
|
|
53
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/renderer/engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAMzF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAA;IACnC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;CACxC;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,KAAK,WAAW,GAAG,gBAAgB,CAAA;AAMlG,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAElE;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE9D;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,WAAW,GAAG,gBAAgB,CAwClG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAKjG;AAID,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAMrE;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAKxE;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAQnE;AAED,yCAAyC;AACzC,wBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAI/D;AAED,qCAAqC;AACrC,wBAAgB,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAGvE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component render engine — takes JSON component trees and produces DOM.
|
|
3
|
+
*
|
|
4
|
+
* The engine uses a registry of render functions keyed by component type.
|
|
5
|
+
* Each render function receives the JSON node and a render context,
|
|
6
|
+
* and returns an HTMLElement (or DocumentFragment).
|
|
7
|
+
*/
|
|
8
|
+
import { evaluateTemplate, isRxExpression } from './rx.js';
|
|
9
|
+
import { dispatchActions } from './actions.js';
|
|
10
|
+
// ── Registry ─────────────────────────────────────────────────────────────────
|
|
11
|
+
const registry = new Map();
|
|
12
|
+
/** Register a render function for a component type */
|
|
13
|
+
export function registerComponent(type, fn) {
|
|
14
|
+
registry.set(type, fn);
|
|
15
|
+
}
|
|
16
|
+
/** Get a render function (or fallback) */
|
|
17
|
+
export function getRenderer(type) {
|
|
18
|
+
return registry.get(type);
|
|
19
|
+
}
|
|
20
|
+
// ── Core render ──────────────────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Render a component node to DOM.
|
|
23
|
+
* Looks up the renderer by type; falls back to a generic div.
|
|
24
|
+
*/
|
|
25
|
+
export function renderNode(node, ctx) {
|
|
26
|
+
// Resolve defs: if node.type matches a def, substitute
|
|
27
|
+
if (ctx.defs?.[node.type]) {
|
|
28
|
+
const defNode = { ...ctx.defs[node.type], ...node, type: ctx.defs[node.type].type };
|
|
29
|
+
return renderNode(defNode, ctx);
|
|
30
|
+
}
|
|
31
|
+
const renderFn = registry.get(node.type);
|
|
32
|
+
let el;
|
|
33
|
+
if (renderFn) {
|
|
34
|
+
el = renderFn(node, ctx);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Fallback: generic div with data-type
|
|
38
|
+
el = document.createElement('div');
|
|
39
|
+
(el).setAttribute('data-prefab-type', node.type);
|
|
40
|
+
if (node.children) {
|
|
41
|
+
for (const child of node.children) {
|
|
42
|
+
el.appendChild(renderNode(child, ctx));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Apply common props
|
|
47
|
+
if (el instanceof HTMLElement) {
|
|
48
|
+
if (node.id)
|
|
49
|
+
el.id = node.id;
|
|
50
|
+
if (node.cssClass) {
|
|
51
|
+
const cls = resolveStr(node.cssClass, ctx);
|
|
52
|
+
if (cls)
|
|
53
|
+
el.className = (el.className ? el.className + ' ' : '') + cls;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Run onMount actions
|
|
57
|
+
if (node.onMount) {
|
|
58
|
+
const onMount = node.onMount;
|
|
59
|
+
const dispCtx = makeDispatchCtx(ctx);
|
|
60
|
+
queueMicrotask(() => void dispatchActions(onMount, dispCtx));
|
|
61
|
+
}
|
|
62
|
+
return el;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Render all children of a node into a parent element.
|
|
66
|
+
*/
|
|
67
|
+
export function renderChildren(node, parent, ctx) {
|
|
68
|
+
if (!node.children)
|
|
69
|
+
return;
|
|
70
|
+
for (const child of node.children) {
|
|
71
|
+
parent.appendChild(renderNode(child, ctx));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── Helpers for renderers ────────────────────────────────────────────────────
|
|
75
|
+
/** Resolve a possibly-reactive string value */
|
|
76
|
+
export function resolveStr(value, ctx) {
|
|
77
|
+
if (isRxExpression(value)) {
|
|
78
|
+
const result = evaluateTemplate(value, ctx.store, ctx.scope);
|
|
79
|
+
return result == null ? '' : String(result);
|
|
80
|
+
}
|
|
81
|
+
return value == null ? '' : String(value);
|
|
82
|
+
}
|
|
83
|
+
/** Resolve a possibly-reactive value, keeping original type */
|
|
84
|
+
export function resolveValue(value, ctx) {
|
|
85
|
+
if (isRxExpression(value)) {
|
|
86
|
+
return evaluateTemplate(value, ctx.store, ctx.scope);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
/** Create a DispatchContext from RenderContext */
|
|
91
|
+
export function makeDispatchCtx(ctx) {
|
|
92
|
+
return {
|
|
93
|
+
store: ctx.store,
|
|
94
|
+
transport: ctx.transport,
|
|
95
|
+
scope: ctx.scope,
|
|
96
|
+
rerender: ctx.rerender,
|
|
97
|
+
onToast: ctx.onToast,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Create an element with a CSS class */
|
|
101
|
+
export function el(tag, className) {
|
|
102
|
+
const e = document.createElement(tag);
|
|
103
|
+
if (className)
|
|
104
|
+
e.className = className;
|
|
105
|
+
return e;
|
|
106
|
+
}
|
|
107
|
+
/** Set text content on an element */
|
|
108
|
+
export function text(element, content) {
|
|
109
|
+
element.textContent = content;
|
|
110
|
+
return element;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/renderer/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrefabRenderer — Main entry point for the browser renderer.
|
|
3
|
+
*
|
|
4
|
+
* Usage (CDN — new API):
|
|
5
|
+
* ```html
|
|
6
|
+
* <script src="https://cdn.jsdelivr.net/npm/@maxhealth.tech/prefab/dist/renderer.min.js"></script>
|
|
7
|
+
* <script>
|
|
8
|
+
* const ui = await prefab.app();
|
|
9
|
+
* ui.onToolInput((args) => {
|
|
10
|
+
* ui.render('#root', chart({ data: args.data }));
|
|
11
|
+
* });
|
|
12
|
+
* </script>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Usage (CDN — legacy):
|
|
16
|
+
* ```html
|
|
17
|
+
* <script src="https://cdn.jsdelivr.net/npm/@maxhealth.tech/prefab/dist/renderer.min.js"></script>
|
|
18
|
+
* <script>
|
|
19
|
+
* PrefabRenderer.mount(document.getElementById('root'), data);
|
|
20
|
+
* </script>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Or as ESM:
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { PrefabRenderer, app } from '@maxhealth.tech/prefab/renderer'
|
|
26
|
+
* const ui = await app()
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { Store } from './state.js';
|
|
30
|
+
import type { ComponentNode } from './engine.js';
|
|
31
|
+
import type { McpTransport, ToastEvent, ActionJSON } from './actions.js';
|
|
32
|
+
import type { McpTransportOptions } from './transport.js';
|
|
33
|
+
export { app } from './app.js';
|
|
34
|
+
export type { AppOptions, PrefabApp, MountHandle } from './app.js';
|
|
35
|
+
export { Bridge, isIframe, applyHostTheme } from './bridge.js';
|
|
36
|
+
export type { AppCapabilities, HostCapabilities, HostContext, HostTheme, DisplayMode, BridgeMessage, } from './bridge.js';
|
|
37
|
+
export interface PrefabWireData {
|
|
38
|
+
$prefab: {
|
|
39
|
+
version: string;
|
|
40
|
+
};
|
|
41
|
+
view: ComponentNode;
|
|
42
|
+
state?: Record<string, unknown>;
|
|
43
|
+
theme?: {
|
|
44
|
+
light?: Record<string, string>;
|
|
45
|
+
dark?: Record<string, string>;
|
|
46
|
+
};
|
|
47
|
+
defs?: Record<string, ComponentNode>;
|
|
48
|
+
keyBindings?: Record<string, ActionJSON | ActionJSON[]>;
|
|
49
|
+
stylesheets?: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface PrefabUpdateData {
|
|
52
|
+
$prefab: {
|
|
53
|
+
version: string;
|
|
54
|
+
};
|
|
55
|
+
update: {
|
|
56
|
+
state: Record<string, unknown>;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export interface MountOptions {
|
|
60
|
+
/** MCP transport configuration. */
|
|
61
|
+
transport?: McpTransport | McpTransportOptions;
|
|
62
|
+
/** Toast notification handler. */
|
|
63
|
+
onToast?: (toast: ToastEvent) => void;
|
|
64
|
+
}
|
|
65
|
+
export interface MountedApp {
|
|
66
|
+
/** Re-render the entire UI from current state. */
|
|
67
|
+
rerender: () => void;
|
|
68
|
+
/** Apply a state update (from display_update). */
|
|
69
|
+
update: (data: PrefabUpdateData) => void;
|
|
70
|
+
/** Get the reactive store. */
|
|
71
|
+
store: Store;
|
|
72
|
+
/** Unmount and clean up. */
|
|
73
|
+
destroy: () => void;
|
|
74
|
+
}
|
|
75
|
+
export declare const PrefabRenderer: {
|
|
76
|
+
/**
|
|
77
|
+
* Mount a prefab UI into a DOM element.
|
|
78
|
+
*
|
|
79
|
+
* @param root - The DOM element to render into.
|
|
80
|
+
* @param data - The $prefab wire format JSON.
|
|
81
|
+
* @param options - Optional transport and toast handler.
|
|
82
|
+
* @returns A MountedApp handle for updates and cleanup.
|
|
83
|
+
*/
|
|
84
|
+
mount(root: HTMLElement, data: PrefabWireData, options?: MountOptions): MountedApp;
|
|
85
|
+
/**
|
|
86
|
+
* Check if data is a prefab wire format.
|
|
87
|
+
*/
|
|
88
|
+
isPrefabData(data: unknown): data is PrefabWireData;
|
|
89
|
+
/**
|
|
90
|
+
* Check if data is a prefab state update.
|
|
91
|
+
*/
|
|
92
|
+
isPrefabUpdate(data: unknown): data is PrefabUpdateData;
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAA;AAI/D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAKzD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,aAAa,CAAA;AAIpB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAA;IAC9C,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,kDAAkD;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACxC,8BAA8B;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,4BAA4B;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID,eAAO,MAAM,cAAc;IACzB;;;;;;;OAOG;gBACS,WAAW,QAAQ,cAAc,YAAY,YAAY,GAAG,UAAU;IAwFlF;;OAEG;uBACgB,OAAO,GAAG,IAAI,IAAI,cAAc;IAInD;;OAEG;yBACkB,OAAO,GAAG,IAAI,IAAI,gBAAgB;CAQxD,CAAA"}
|