@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 @@
1
+ {"version":3,"file":"chart.js","sourceRoot":"","sources":["../../src/auto/chart.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA2C,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAoBxF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CACvB,IAA+B,EAC/B,MAAqB,EACrB,OAA0B;IAE1B,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAA;IAC7C,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAA;IAE9C,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IAEzC,MAAM,UAAU,GAAmB;QACjC,IAAI;QACJ,MAAM;QACN,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAChE,UAAU;KACX,CAAA;IAED,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,IAAI,OAAO,EAAE,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACzD,IAAI,OAAO,EAAE,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE;YAC7B,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;SACxE,EAAE,CAAC,CAAC,CAAA;IAEL,OAAO,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,SAAS,GAA4D;IACzE,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;CACd,CAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * autoComparison — Side-by-side comparison of items in a Grid of Cards.
3
+ *
4
+ * Ported from mcp-generator-3.x display_tools.py → show_comparison.
5
+ */
6
+ import { type ContainerComponent } from '../core/component.js';
7
+ export interface AutoComparisonOptions {
8
+ /** Heading above the comparison. */
9
+ title?: string;
10
+ /** Optional subtitle. */
11
+ subtitle?: string;
12
+ /** Key whose value gets a colored Badge for emphasis. */
13
+ highlightKey?: string;
14
+ /** Number of grid columns. Defaults to number of items (max 4). */
15
+ columns?: number;
16
+ }
17
+ /**
18
+ * Auto-generate a side-by-side comparison of items.
19
+ *
20
+ * Uses the first key of each item as the card heading.
21
+ * Remaining keys are shown as labeled rows.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * autoComparison([
26
+ * { name: 'Plan A', price: '$10/mo', storage: '5GB' },
27
+ * { name: 'Plan B', price: '$20/mo', storage: '50GB' },
28
+ * ], { title: 'Plan Comparison', highlightKey: 'price' })
29
+ * ```
30
+ */
31
+ export declare function autoComparison(items: Record<string, unknown>[], options?: AutoComparisonOptions): ContainerComponent;
32
+ //# sourceMappingURL=comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../../src/auto/comparison.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAM9E,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,kBAAkB,CAuCpB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * autoComparison — Side-by-side comparison of items in a Grid of Cards.
3
+ *
4
+ * Ported from mcp-generator-3.x display_tools.py → show_comparison.
5
+ */
6
+ import {} from '../core/component.js';
7
+ import { Column, Row, Grid } from '../components/layout/index.js';
8
+ import { Heading, Text, Muted } from '../components/typography/index.js';
9
+ import { Card, CardHeader, CardContent } from '../components/card/index.js';
10
+ import { Badge } from '../components/data/index.js';
11
+ /**
12
+ * Auto-generate a side-by-side comparison of items.
13
+ *
14
+ * Uses the first key of each item as the card heading.
15
+ * Remaining keys are shown as labeled rows.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * autoComparison([
20
+ * { name: 'Plan A', price: '$10/mo', storage: '5GB' },
21
+ * { name: 'Plan B', price: '$20/mo', storage: '50GB' },
22
+ * ], { title: 'Plan Comparison', highlightKey: 'price' })
23
+ * ```
24
+ */
25
+ export function autoComparison(items, options) {
26
+ const children = [];
27
+ if (options?.title)
28
+ children.push(Heading(options.title));
29
+ if (options?.subtitle)
30
+ children.push(Muted(options.subtitle));
31
+ if (items.length === 0) {
32
+ children.push(Muted('No items to compare.'));
33
+ return Column({ gap: 5, cssClass: 'p-6', children });
34
+ }
35
+ const keys = Object.keys(items[0]);
36
+ const nameKey = keys[0];
37
+ const detailKeys = keys.slice(1);
38
+ const gridColumns = options?.columns ?? Math.min(items.length, 4);
39
+ const cards = items.map(item => {
40
+ const fieldRows = detailKeys.map(key => {
41
+ const rawVal = item[key];
42
+ const val = rawVal == null ? '' : String(rawVal);
43
+ const valueComponent = key === options?.highlightKey
44
+ ? Badge(val, { variant: 'success' })
45
+ : Text(val, { cssClass: 'font-medium' });
46
+ return Row({ gap: 3, align: 'center', cssClass: 'py-1', children: [
47
+ Muted(humanizeKey(key), { cssClass: 'w-28 shrink-0 text-xs' }),
48
+ valueComponent,
49
+ ] });
50
+ });
51
+ return Card({ children: [
52
+ CardHeader({ children: [Heading(item[nameKey] == null ? '' : String(item[nameKey]), { level: 3 })] }),
53
+ CardContent({ children: fieldRows }),
54
+ ] });
55
+ });
56
+ children.push(Grid({ columns: gridColumns, gap: 4, children: cards }));
57
+ return Column({ gap: 5, cssClass: 'p-6', children });
58
+ }
59
+ function humanizeKey(key) {
60
+ return key
61
+ .replace(/([A-Z])/g, ' $1')
62
+ .replace(/[_-]/g, ' ')
63
+ .trim()
64
+ .replace(/^\w/, c => c.toUpperCase());
65
+ }
66
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../src/auto/comparison.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * autoForm — Generates a Form from field definitions that submits to an MCP tool.
3
+ *
4
+ * Ported from mcp-generator-3.x display_tools.py → show_form.
5
+ */
6
+ import { type ContainerComponent } from '../core/component.js';
7
+ import type { Action } from '../actions/types.js';
8
+ export interface AutoFormField {
9
+ /** Field name (used as the key in submitted data). */
10
+ name: string;
11
+ /** Display label. Defaults to humanized name. */
12
+ label?: string;
13
+ /** Input type: 'text', 'email', 'number', 'password', 'url', etc. */
14
+ type?: string;
15
+ /** Placeholder text. */
16
+ placeholder?: string;
17
+ /** Whether the field is required. */
18
+ required?: boolean;
19
+ }
20
+ export interface AutoFormOptions {
21
+ /** Form heading. */
22
+ title?: string;
23
+ /** Optional subtitle. */
24
+ subtitle?: string;
25
+ /** Submit button text. Default 'Submit'. */
26
+ submitLabel?: string;
27
+ /** Custom onSubmit action. Overrides submitTool. */
28
+ onSubmit?: Action | Action[];
29
+ /** Success toast message. */
30
+ successMessage?: string;
31
+ /** Error toast message. */
32
+ errorMessage?: string;
33
+ }
34
+ /**
35
+ * Auto-generate a Form that submits to an MCP tool.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * autoForm(
40
+ * [
41
+ * { name: 'email', label: 'Email', type: 'email', required: true },
42
+ * { name: 'name', label: 'Full Name', required: true },
43
+ * ],
44
+ * 'create_user',
45
+ * { title: 'Create User', submitLabel: 'Create' },
46
+ * )
47
+ * ```
48
+ */
49
+ export declare function autoForm(fields: AutoFormField[], submitTool: string, options?: AutoFormOptions): ContainerComponent;
50
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/auto/form.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAO9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC5B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,eAAe,GACxB,kBAAkB,CAoCpB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * autoForm — Generates a Form from field definitions that submits to an MCP tool.
3
+ *
4
+ * Ported from mcp-generator-3.x display_tools.py → show_form.
5
+ */
6
+ import {} from '../core/component.js';
7
+ import { Column } from '../components/layout/index.js';
8
+ import { Heading, Muted } from '../components/typography/index.js';
9
+ import { Card, CardContent } from '../components/card/index.js';
10
+ import { Form, Input, Button } from '../components/form/index.js';
11
+ import { CallTool } from '../actions/mcp.js';
12
+ import { ShowToast } from '../actions/client.js';
13
+ /**
14
+ * Auto-generate a Form that submits to an MCP tool.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * autoForm(
19
+ * [
20
+ * { name: 'email', label: 'Email', type: 'email', required: true },
21
+ * { name: 'name', label: 'Full Name', required: true },
22
+ * ],
23
+ * 'create_user',
24
+ * { title: 'Create User', submitLabel: 'Create' },
25
+ * )
26
+ * ```
27
+ */
28
+ export function autoForm(fields, submitTool, options) {
29
+ const submitLabel = options?.submitLabel ?? 'Submit';
30
+ const successMsg = options?.successMessage ?? 'Success!';
31
+ const errorMsg = options?.errorMessage ?? 'Something went wrong';
32
+ const onSubmit = options?.onSubmit ?? new CallTool(submitTool, {
33
+ onSuccess: new ShowToast(successMsg, { variant: 'success' }),
34
+ onError: new ShowToast(errorMsg, { variant: 'error' }),
35
+ });
36
+ const inputComponents = fields.map(f => Input({
37
+ name: f.name,
38
+ label: f.label ?? humanizeFieldName(f.name),
39
+ ...(f.type && { inputType: f.type }),
40
+ ...(f.placeholder && { placeholder: f.placeholder }),
41
+ ...(f.required && { required: true }),
42
+ }));
43
+ const formChildren = [
44
+ Column({ gap: 4, children: [
45
+ ...inputComponents,
46
+ Button(submitLabel, { submit: true, cssClass: 'w-full' }),
47
+ ] }),
48
+ ];
49
+ const children = [];
50
+ if (options?.title)
51
+ children.push(Heading(options.title));
52
+ if (options?.subtitle)
53
+ children.push(Muted(options.subtitle));
54
+ children.push(Card({ children: [
55
+ CardContent({ cssClass: 'py-4', children: [
56
+ Form({ onSubmit, children: formChildren }),
57
+ ] }),
58
+ ] }));
59
+ return Column({ gap: 5, cssClass: 'p-6 max-w-2xl', children });
60
+ }
61
+ function humanizeFieldName(name) {
62
+ return name
63
+ .replace(/([A-Z])/g, ' $1')
64
+ .replace(/[_-]/g, ' ')
65
+ .trim()
66
+ .replace(/^\w/, c => c.toUpperCase());
67
+ }
68
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/auto/form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Auto-rendering utilities — smart component generation from raw data.
3
+ *
4
+ * Ported from mcp-generator-3.x display_renderers.py and display_tools.py.
5
+ * These helpers let you render API responses as rich UIs without
6
+ * manually building component trees.
7
+ */
8
+ import { type ContainerComponent } from '../core/component.js';
9
+ import type { DataTableColumnDef, BadgeVariant } from '../components/data/index.js';
10
+ export { autoChart } from './chart.js';
11
+ export type { AutoChartOptions, ChartType } from './chart.js';
12
+ export { autoForm } from './form.js';
13
+ export type { AutoFormField, AutoFormOptions } from './form.js';
14
+ export { autoComparison } from './comparison.js';
15
+ export type { AutoComparisonOptions } from './comparison.js';
16
+ export { autoMetrics } from './metrics.js';
17
+ export type { AutoMetricDef, AutoMetricsOptions } from './metrics.js';
18
+ export { autoTimeline } from './timeline.js';
19
+ export type { AutoTimelineEvent, AutoTimelineOptions } from './timeline.js';
20
+ export { autoProgress } from './progress.js';
21
+ export type { AutoProgressStep, AutoProgressOptions } from './progress.js';
22
+ /**
23
+ * Get a Badge variant for a status string.
24
+ * Falls back to 'outline' for unknown statuses.
25
+ */
26
+ export declare function statusVariant(status: string): BadgeVariant;
27
+ /**
28
+ * Register additional status→variant mappings.
29
+ */
30
+ export declare function registerStatusVariants(mappings: Record<string, BadgeVariant>): void;
31
+ export interface AutoDetailOptions {
32
+ /** Title shown at the top of the card. Defaults to auto-detect from data. */
33
+ title?: string;
34
+ /** Fields to exclude from the detail view. */
35
+ exclude?: string[];
36
+ /** Fields to include (if set, only these are shown). */
37
+ include?: string[];
38
+ /** Max nested depth to render (default 1). */
39
+ maxDepth?: number;
40
+ }
41
+ /**
42
+ * Auto-generate a detail Card from a data object.
43
+ *
44
+ * Inspects value types and renders:
45
+ * - Booleans → Badge (Yes/No)
46
+ * - Status-like strings → Badge with variant
47
+ * - Dates → Text with tabular-nums class
48
+ * - Nested objects → sub-section
49
+ * - Everything else → Text
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * autoDetail({ name: 'John', status: 'active', createdAt: '2024-01-01' })
54
+ * ```
55
+ */
56
+ export declare function autoDetail(data: Record<string, unknown>, options?: AutoDetailOptions): ContainerComponent;
57
+ export interface AutoTableOptions {
58
+ /** Title shown above the table. */
59
+ title?: string;
60
+ /** Override column definitions. If not set, auto-inferred from first row. */
61
+ columns?: DataTableColumnDef[];
62
+ /** Fields to exclude from auto-generated columns. */
63
+ exclude?: string[];
64
+ /** Enable search. Default true. */
65
+ search?: boolean;
66
+ /** Make all columns sortable. Default true. */
67
+ sortable?: boolean;
68
+ }
69
+ /**
70
+ * Auto-generate a DataTable from an array of objects.
71
+ *
72
+ * Infers columns from the first row's keys, skipping nested objects/arrays.
73
+ * Wraps in a Column with a title and record count badge.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * autoTable([
78
+ * { name: 'John', email: 'john@example.com', age: 30 },
79
+ * { name: 'Jane', email: 'jane@example.com', age: 25 },
80
+ * ], { title: 'Users' })
81
+ * ```
82
+ */
83
+ export declare function autoTable(rows: Record<string, unknown>[], options?: AutoTableOptions): ContainerComponent;
84
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAK9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAInF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AA8C1E;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAG1D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAInF;AA2BD,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,kBAAkB,CAczG;AAuFD,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,CAoBzG"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Auto-rendering utilities — smart component generation from raw data.
3
+ *
4
+ * Ported from mcp-generator-3.x display_renderers.py and display_tools.py.
5
+ * These helpers let you render API responses as rich UIs without
6
+ * manually building component trees.
7
+ */
8
+ import {} from '../core/component.js';
9
+ import { Column, Row } from '../components/layout/index.js';
10
+ import { Heading, Text, Muted } from '../components/typography/index.js';
11
+ import { Card, CardContent } from '../components/card/index.js';
12
+ import { DataTable, col, Badge, Separator } from '../components/data/index.js';
13
+ // ── Re-export sub-modules ───────────────────────────────────────────────────
14
+ export { autoChart } from './chart.js';
15
+ export { autoForm } from './form.js';
16
+ export { autoComparison } from './comparison.js';
17
+ export { autoMetrics } from './metrics.js';
18
+ export { autoTimeline } from './timeline.js';
19
+ export { autoProgress } from './progress.js';
20
+ // ── Status → Badge variant mapping ──────────────────────────────────────────
21
+ const STATUS_VARIANTS = {
22
+ // Success
23
+ available: 'success',
24
+ active: 'success',
25
+ enabled: 'success',
26
+ approved: 'success',
27
+ delivered: 'success',
28
+ complete: 'success',
29
+ completed: 'success',
30
+ resolved: 'success',
31
+ verified: 'success',
32
+ published: 'success',
33
+ open: 'success',
34
+ healthy: 'success',
35
+ connected: 'success',
36
+ // Warning
37
+ pending: 'warning',
38
+ processing: 'warning',
39
+ in_progress: 'warning',
40
+ in_review: 'warning',
41
+ placed: 'warning',
42
+ waiting: 'warning',
43
+ queued: 'warning',
44
+ draft: 'warning',
45
+ partial: 'warning',
46
+ // Destructive / Error
47
+ sold: 'destructive',
48
+ inactive: 'destructive',
49
+ disabled: 'destructive',
50
+ deleted: 'destructive',
51
+ cancelled: 'destructive',
52
+ rejected: 'destructive',
53
+ failed: 'destructive',
54
+ error: 'destructive',
55
+ expired: 'destructive',
56
+ blocked: 'destructive',
57
+ closed: 'destructive',
58
+ revoked: 'destructive',
59
+ suspended: 'destructive',
60
+ disconnected: 'destructive',
61
+ };
62
+ /**
63
+ * Get a Badge variant for a status string.
64
+ * Falls back to 'outline' for unknown statuses.
65
+ */
66
+ export function statusVariant(status) {
67
+ const normalized = status.toLowerCase().replace(/[\s-]/g, '_');
68
+ return STATUS_VARIANTS[normalized] ?? 'outline';
69
+ }
70
+ /**
71
+ * Register additional status→variant mappings.
72
+ */
73
+ export function registerStatusVariants(mappings) {
74
+ for (const [key, variant] of Object.entries(mappings)) {
75
+ STATUS_VARIANTS[key.toLowerCase().replace(/[\s-]/g, '_')] = variant;
76
+ }
77
+ }
78
+ // ── Type detection helpers ──────────────────────────────────────────────────
79
+ function isDateString(value) {
80
+ if (typeof value !== 'string')
81
+ return false;
82
+ return /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2})?/.test(value);
83
+ }
84
+ function isStatusLike(key, value) {
85
+ if (typeof value !== 'string')
86
+ return false;
87
+ const statusKeys = ['status', 'state', 'phase', 'condition', 'mode'];
88
+ return statusKeys.some(sk => key.toLowerCase().includes(sk))
89
+ || value.toLowerCase().replace(/[\s-]/g, '_') in STATUS_VARIANTS;
90
+ }
91
+ function humanizeKey(key) {
92
+ return key
93
+ .replace(/([A-Z])/g, ' $1')
94
+ .replace(/[_-]/g, ' ')
95
+ .replace(/\bid\b/gi, 'ID')
96
+ .trim()
97
+ .replace(/^\w/, c => c.toUpperCase());
98
+ }
99
+ /**
100
+ * Auto-generate a detail Card from a data object.
101
+ *
102
+ * Inspects value types and renders:
103
+ * - Booleans → Badge (Yes/No)
104
+ * - Status-like strings → Badge with variant
105
+ * - Dates → Text with tabular-nums class
106
+ * - Nested objects → sub-section
107
+ * - Everything else → Text
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * autoDetail({ name: 'John', status: 'active', createdAt: '2024-01-01' })
112
+ * ```
113
+ */
114
+ export function autoDetail(data, options) {
115
+ const title = options?.title ?? detectTitle(data);
116
+ const exclude = new Set(options?.exclude ?? []);
117
+ const include = options?.include ? new Set(options.include) : null;
118
+ const maxDepth = options?.maxDepth ?? 1;
119
+ const fieldRows = buildDetailFields(data, exclude, include, 0, maxDepth);
120
+ return Column({ gap: 5, cssClass: 'p-6 max-w-2xl', children: [
121
+ ...(title ? [Heading(title)] : []),
122
+ Card({ children: [
123
+ CardContent({ cssClass: 'py-4', children: fieldRows }),
124
+ ] }),
125
+ ] });
126
+ }
127
+ function detectTitle(data) {
128
+ const titleFields = ['name', 'title', 'username', 'displayName', 'display_name', 'label', 'email'];
129
+ for (const field of titleFields) {
130
+ if (typeof data[field] === 'string' && data[field]) {
131
+ return data[field];
132
+ }
133
+ }
134
+ return undefined;
135
+ }
136
+ function buildDetailFields(data, exclude, include, depth, maxDepth) {
137
+ const entries = Object.entries(data).filter(([key]) => {
138
+ if (exclude.has(key))
139
+ return false;
140
+ if (include && !include.has(key))
141
+ return false;
142
+ return true;
143
+ });
144
+ const components = [];
145
+ let shown = 0;
146
+ for (const [key, value] of entries) {
147
+ // Skip nested objects/arrays at top level (handle below)
148
+ if (typeof value === 'object' && value !== null && !Array.isArray(value))
149
+ continue;
150
+ if (Array.isArray(value))
151
+ continue;
152
+ if (shown > 0)
153
+ components.push(Separator());
154
+ const label = humanizeKey(key);
155
+ const valueComponent = renderFieldValue(key, value);
156
+ components.push(Row({ gap: 4, align: 'center', cssClass: 'py-2', children: [
157
+ Text(label, { cssClass: 'font-medium text-muted-foreground w-40 shrink-0' }),
158
+ valueComponent,
159
+ ] }));
160
+ shown++;
161
+ }
162
+ // Nested objects as sub-sections
163
+ if (depth < maxDepth) {
164
+ for (const [key, value] of entries) {
165
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
166
+ continue;
167
+ if (shown > 0)
168
+ components.push(Separator());
169
+ const label = humanizeKey(key);
170
+ const nestedFields = buildDetailFields(value, exclude, null, depth + 1, maxDepth);
171
+ components.push(Column({ gap: 2, cssClass: 'py-2', children: [
172
+ Text(label, { bold: true, cssClass: 'text-muted-foreground' }),
173
+ ...nestedFields,
174
+ ] }));
175
+ shown++;
176
+ }
177
+ }
178
+ return components;
179
+ }
180
+ function renderFieldValue(key, value) {
181
+ if (value === null || value === undefined) {
182
+ return Muted('—');
183
+ }
184
+ if (typeof value === 'boolean') {
185
+ return Badge(value ? 'Yes' : 'No', { variant: value ? 'success' : 'outline' });
186
+ }
187
+ if (isStatusLike(key, value)) {
188
+ return Badge(value, { variant: statusVariant(value) });
189
+ }
190
+ if (isDateString(value)) {
191
+ return Text(value, { cssClass: 'font-medium tabular-nums' });
192
+ }
193
+ return Text(typeof value === 'string' ? value : String(value), { cssClass: 'font-medium' });
194
+ }
195
+ /**
196
+ * Auto-generate a DataTable from an array of objects.
197
+ *
198
+ * Infers columns from the first row's keys, skipping nested objects/arrays.
199
+ * Wraps in a Column with a title and record count badge.
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * autoTable([
204
+ * { name: 'John', email: 'john@example.com', age: 30 },
205
+ * { name: 'Jane', email: 'jane@example.com', age: 25 },
206
+ * ], { title: 'Users' })
207
+ * ```
208
+ */
209
+ export function autoTable(rows, options) {
210
+ const title = options?.title;
211
+ const search = options?.search ?? true;
212
+ const sortable = options?.sortable ?? true;
213
+ const exclude = new Set(options?.exclude ?? []);
214
+ const columns = options?.columns ?? inferColumns(rows, exclude, sortable);
215
+ const children = [];
216
+ if (title) {
217
+ children.push(Heading(title));
218
+ children.push(Row({ gap: 2, align: 'center', children: [
219
+ Badge(`${rows.length} records`, { variant: 'outline' }),
220
+ ] }));
221
+ }
222
+ children.push(DataTable({ rows, columns, search }));
223
+ return Column({ gap: 5, cssClass: 'p-6 max-w-4xl', children });
224
+ }
225
+ function inferColumns(rows, exclude, sortable) {
226
+ if (rows.length === 0)
227
+ return [];
228
+ const firstRow = rows[0];
229
+ const columns = [];
230
+ for (const [key, value] of Object.entries(firstRow)) {
231
+ if (exclude.has(key))
232
+ continue;
233
+ // Skip nested objects and arrays — they don't render well in tables
234
+ if (typeof value === 'object' && value !== null)
235
+ continue;
236
+ columns.push(col(key, humanizeKey(key), sortable ? { sortable: true } : undefined));
237
+ }
238
+ return columns;
239
+ }
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auto/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * autoMetrics — KPI dashboard grid with Metric cards and optional Sparklines.
3
+ *
4
+ * Ported from mcp-generator-3.x display_tools.py → show_metrics.
5
+ */
6
+ import { type ContainerComponent } from '../core/component.js';
7
+ export interface AutoMetricDef {
8
+ /** Metric label (e.g. 'Revenue'). */
9
+ label: string;
10
+ /** Metric value (e.g. '$42K'). */
11
+ value: string;
12
+ /** Delta string (e.g. '+12%'). */
13
+ delta?: string;
14
+ /** Trend direction. */
15
+ trend?: 'up' | 'down' | 'flat';
16
+ /** Trend sentiment (positive = green, negative = red). */
17
+ trendSentiment?: 'positive' | 'negative' | 'neutral';
18
+ /** Description text below the metric. */
19
+ description?: string;
20
+ /** Sparkline data points. */
21
+ sparkline?: number[];
22
+ }
23
+ export interface AutoMetricsOptions {
24
+ /** Dashboard heading. */
25
+ title?: string;
26
+ /** Optional subtitle. */
27
+ subtitle?: string;
28
+ /** Number of grid columns. Default 4. */
29
+ columns?: number;
30
+ }
31
+ /**
32
+ * Auto-generate a KPI dashboard grid.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * autoMetrics([
37
+ * { label: 'Revenue', value: '$42K', delta: '+12%', trend: 'up', trendSentiment: 'positive', sparkline: [10, 25, 18, 30, 42] },
38
+ * { label: 'Users', value: '1,234', delta: '+5%', trend: 'up', trendSentiment: 'positive' },
39
+ * { label: 'Errors', value: '3', delta: '-80%', trend: 'down', trendSentiment: 'positive' },
40
+ * ], { title: 'Dashboard', columns: 3 })
41
+ * ```
42
+ */
43
+ export declare function autoMetrics(metrics: AutoMetricDef[], options?: AutoMetricsOptions): ContainerComponent;
44
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/auto/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAO9E,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAC9B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;IACpD,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,kBAAkB,CAiCpB"}