@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.
Files changed (217) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/LICENSE +21 -0
  3. package/README.md +340 -0
  4. package/dist/actions/client.d.ts +98 -0
  5. package/dist/actions/client.d.ts.map +1 -0
  6. package/dist/actions/client.js +188 -0
  7. package/dist/actions/client.js.map +1 -0
  8. package/dist/actions/index.d.ts +6 -0
  9. package/dist/actions/index.d.ts.map +1 -0
  10. package/dist/actions/index.js +3 -0
  11. package/dist/actions/index.js.map +1 -0
  12. package/dist/actions/mcp.d.ts +37 -0
  13. package/dist/actions/mcp.d.ts.map +1 -0
  14. package/dist/actions/mcp.js +64 -0
  15. package/dist/actions/mcp.js.map +1 -0
  16. package/dist/actions/types.d.ts +16 -0
  17. package/dist/actions/types.d.ts.map +1 -0
  18. package/dist/actions/types.js +8 -0
  19. package/dist/actions/types.js.map +1 -0
  20. package/dist/app.d.ts +65 -0
  21. package/dist/app.d.ts.map +1 -0
  22. package/dist/app.js +120 -0
  23. package/dist/app.js.map +1 -0
  24. package/dist/auto/chart.d.ts +36 -0
  25. package/dist/auto/chart.d.ts.map +1 -0
  26. package/dist/auto/chart.js +50 -0
  27. package/dist/auto/chart.js.map +1 -0
  28. package/dist/auto/comparison.d.ts +32 -0
  29. package/dist/auto/comparison.d.ts.map +1 -0
  30. package/dist/auto/comparison.js +66 -0
  31. package/dist/auto/comparison.js.map +1 -0
  32. package/dist/auto/form.d.ts +50 -0
  33. package/dist/auto/form.d.ts.map +1 -0
  34. package/dist/auto/form.js +68 -0
  35. package/dist/auto/form.js.map +1 -0
  36. package/dist/auto/index.d.ts +84 -0
  37. package/dist/auto/index.d.ts.map +1 -0
  38. package/dist/auto/index.js +240 -0
  39. package/dist/auto/index.js.map +1 -0
  40. package/dist/auto/metrics.d.ts +44 -0
  41. package/dist/auto/metrics.d.ts.map +1 -0
  42. package/dist/auto/metrics.js +55 -0
  43. package/dist/auto/metrics.js.map +1 -0
  44. package/dist/auto/progress.d.ts +38 -0
  45. package/dist/auto/progress.d.ts.map +1 -0
  46. package/dist/auto/progress.js +72 -0
  47. package/dist/auto/progress.js.map +1 -0
  48. package/dist/auto/timeline.d.ts +41 -0
  49. package/dist/auto/timeline.d.ts.map +1 -0
  50. package/dist/auto/timeline.js +72 -0
  51. package/dist/auto/timeline.js.map +1 -0
  52. package/dist/components/alert/index.d.ts +14 -0
  53. package/dist/components/alert/index.d.ts.map +1 -0
  54. package/dist/components/alert/index.js +31 -0
  55. package/dist/components/alert/index.js.map +1 -0
  56. package/dist/components/card/index.d.ts +12 -0
  57. package/dist/components/card/index.d.ts.map +1 -0
  58. package/dist/components/card/index.js +33 -0
  59. package/dist/components/card/index.js.map +1 -0
  60. package/dist/components/charts/index.d.ts +57 -0
  61. package/dist/components/charts/index.d.ts.map +1 -0
  62. package/dist/components/charts/index.js +91 -0
  63. package/dist/components/charts/index.js.map +1 -0
  64. package/dist/components/control/index.d.ts +48 -0
  65. package/dist/components/control/index.d.ts.map +1 -0
  66. package/dist/components/control/index.js +47 -0
  67. package/dist/components/control/index.js.map +1 -0
  68. package/dist/components/data/index.d.ts +53 -0
  69. package/dist/components/data/index.d.ts.map +1 -0
  70. package/dist/components/data/index.js +88 -0
  71. package/dist/components/data/index.js.map +1 -0
  72. package/dist/components/form/index.d.ts +103 -0
  73. package/dist/components/form/index.d.ts.map +1 -0
  74. package/dist/components/form/index.js +247 -0
  75. package/dist/components/form/index.js.map +1 -0
  76. package/dist/components/interactive/index.d.ts +33 -0
  77. package/dist/components/interactive/index.d.ts.map +1 -0
  78. package/dist/components/interactive/index.js +59 -0
  79. package/dist/components/interactive/index.js.map +1 -0
  80. package/dist/components/layout/index.d.ts +61 -0
  81. package/dist/components/layout/index.d.ts.map +1 -0
  82. package/dist/components/layout/index.js +86 -0
  83. package/dist/components/layout/index.js.map +1 -0
  84. package/dist/components/media/index.d.ts +17 -0
  85. package/dist/components/media/index.d.ts.map +1 -0
  86. package/dist/components/media/index.js +41 -0
  87. package/dist/components/media/index.js.map +1 -0
  88. package/dist/components/table/index.d.ts +28 -0
  89. package/dist/components/table/index.d.ts.map +1 -0
  90. package/dist/components/table/index.js +56 -0
  91. package/dist/components/table/index.js.map +1 -0
  92. package/dist/components/typography/index.d.ts +34 -0
  93. package/dist/components/typography/index.d.ts.map +1 -0
  94. package/dist/components/typography/index.js +93 -0
  95. package/dist/components/typography/index.js.map +1 -0
  96. package/dist/core/component.d.ts +67 -0
  97. package/dist/core/component.d.ts.map +1 -0
  98. package/dist/core/component.js +122 -0
  99. package/dist/core/component.js.map +1 -0
  100. package/dist/core/index.d.ts +5 -0
  101. package/dist/core/index.d.ts.map +1 -0
  102. package/dist/core/index.js +3 -0
  103. package/dist/core/index.js.map +1 -0
  104. package/dist/core/validate.d.ts +30 -0
  105. package/dist/core/validate.d.ts.map +1 -0
  106. package/dist/core/validate.js +178 -0
  107. package/dist/core/validate.js.map +1 -0
  108. package/dist/index.d.ts +48 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +48 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/mcp/display.d.ts +102 -0
  113. package/dist/mcp/display.d.ts.map +1 -0
  114. package/dist/mcp/display.js +124 -0
  115. package/dist/mcp/display.js.map +1 -0
  116. package/dist/mcp/index.d.ts +7 -0
  117. package/dist/mcp/index.d.ts.map +1 -0
  118. package/dist/mcp/index.js +5 -0
  119. package/dist/mcp/index.js.map +1 -0
  120. package/dist/mcp/types.d.ts +35 -0
  121. package/dist/mcp/types.d.ts.map +1 -0
  122. package/dist/mcp/types.js +8 -0
  123. package/dist/mcp/types.js.map +1 -0
  124. package/dist/renderer/actions.d.ts +36 -0
  125. package/dist/renderer/actions.d.ts.map +1 -0
  126. package/dist/renderer/actions.js +296 -0
  127. package/dist/renderer/actions.js.map +1 -0
  128. package/dist/renderer/app.d.ts +87 -0
  129. package/dist/renderer/app.d.ts.map +1 -0
  130. package/dist/renderer/app.js +166 -0
  131. package/dist/renderer/app.js.map +1 -0
  132. package/dist/renderer/bridge.d.ts +91 -0
  133. package/dist/renderer/bridge.d.ts.map +1 -0
  134. package/dist/renderer/bridge.js +302 -0
  135. package/dist/renderer/bridge.js.map +1 -0
  136. package/dist/renderer/components/alert.d.ts +5 -0
  137. package/dist/renderer/components/alert.d.ts.map +1 -0
  138. package/dist/renderer/components/alert.js +44 -0
  139. package/dist/renderer/components/alert.js.map +1 -0
  140. package/dist/renderer/components/card.d.ts +5 -0
  141. package/dist/renderer/components/card.d.ts.map +1 -0
  142. package/dist/renderer/components/card.js +38 -0
  143. package/dist/renderer/components/card.js.map +1 -0
  144. package/dist/renderer/components/charts.d.ts +8 -0
  145. package/dist/renderer/components/charts.d.ts.map +1 -0
  146. package/dist/renderer/components/charts.js +232 -0
  147. package/dist/renderer/components/charts.js.map +1 -0
  148. package/dist/renderer/components/control.d.ts +5 -0
  149. package/dist/renderer/components/control.d.ts.map +1 -0
  150. package/dist/renderer/components/control.js +140 -0
  151. package/dist/renderer/components/control.js.map +1 -0
  152. package/dist/renderer/components/data.d.ts +5 -0
  153. package/dist/renderer/components/data.d.ts.map +1 -0
  154. package/dist/renderer/components/data.js +268 -0
  155. package/dist/renderer/components/data.js.map +1 -0
  156. package/dist/renderer/components/form.d.ts +5 -0
  157. package/dist/renderer/components/form.d.ts.map +1 -0
  158. package/dist/renderer/components/form.js +523 -0
  159. package/dist/renderer/components/form.js.map +1 -0
  160. package/dist/renderer/components/index.d.ts +5 -0
  161. package/dist/renderer/components/index.d.ts.map +1 -0
  162. package/dist/renderer/components/index.js +32 -0
  163. package/dist/renderer/components/index.js.map +1 -0
  164. package/dist/renderer/components/interactive.d.ts +5 -0
  165. package/dist/renderer/components/interactive.d.ts.map +1 -0
  166. package/dist/renderer/components/interactive.js +324 -0
  167. package/dist/renderer/components/interactive.js.map +1 -0
  168. package/dist/renderer/components/layout.d.ts +5 -0
  169. package/dist/renderer/components/layout.d.ts.map +1 -0
  170. package/dist/renderer/components/layout.js +113 -0
  171. package/dist/renderer/components/layout.js.map +1 -0
  172. package/dist/renderer/components/media.d.ts +5 -0
  173. package/dist/renderer/components/media.d.ts.map +1 -0
  174. package/dist/renderer/components/media.js +132 -0
  175. package/dist/renderer/components/media.js.map +1 -0
  176. package/dist/renderer/components/table.d.ts +5 -0
  177. package/dist/renderer/components/table.d.ts.map +1 -0
  178. package/dist/renderer/components/table.js +101 -0
  179. package/dist/renderer/components/table.js.map +1 -0
  180. package/dist/renderer/components/typography.d.ts +5 -0
  181. package/dist/renderer/components/typography.d.ts.map +1 -0
  182. package/dist/renderer/components/typography.js +90 -0
  183. package/dist/renderer/components/typography.js.map +1 -0
  184. package/dist/renderer/engine.d.ts +53 -0
  185. package/dist/renderer/engine.d.ts.map +1 -0
  186. package/dist/renderer/engine.js +112 -0
  187. package/dist/renderer/engine.js.map +1 -0
  188. package/dist/renderer/index.d.ts +94 -0
  189. package/dist/renderer/index.d.ts.map +1 -0
  190. package/dist/renderer/index.js +215 -0
  191. package/dist/renderer/index.js.map +1 -0
  192. package/dist/renderer/rx.d.ts +37 -0
  193. package/dist/renderer/rx.d.ts.map +1 -0
  194. package/dist/renderer/rx.js +360 -0
  195. package/dist/renderer/rx.js.map +1 -0
  196. package/dist/renderer/state.d.ts +34 -0
  197. package/dist/renderer/state.d.ts.map +1 -0
  198. package/dist/renderer/state.js +132 -0
  199. package/dist/renderer/state.js.map +1 -0
  200. package/dist/renderer/theme.d.ts +13 -0
  201. package/dist/renderer/theme.d.ts.map +1 -0
  202. package/dist/renderer/theme.js +69 -0
  203. package/dist/renderer/theme.js.map +1 -0
  204. package/dist/renderer/transport.d.ts +22 -0
  205. package/dist/renderer/transport.d.ts.map +1 -0
  206. package/dist/renderer/transport.js +69 -0
  207. package/dist/renderer/transport.js.map +1 -0
  208. package/dist/renderer.min.js +83 -0
  209. package/dist/rx/index.d.ts +2 -0
  210. package/dist/rx/index.d.ts.map +1 -0
  211. package/dist/rx/index.js +2 -0
  212. package/dist/rx/index.js.map +1 -0
  213. package/dist/rx/rx.d.ts +81 -0
  214. package/dist/rx/rx.d.ts.map +1 -0
  215. package/dist/rx/rx.js +196 -0
  216. package/dist/rx/rx.js.map +1 -0
  217. 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,5 @@
1
+ /**
2
+ * Typography component renderers — Heading, Text, Muted, Code, Markdown, etc.
3
+ */
4
+ export declare function registerTypographyComponents(): void;
5
+ //# sourceMappingURL=typography.d.ts.map
@@ -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"}