@assistant-ui/react-generative-ui 0.0.20 → 0.0.22

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 (189) hide show
  1. package/LICENSE +1 -1
  2. package/dist/JSONGenerativeUI.client.d.ts.map +1 -1
  3. package/dist/JSONGenerativeUI.client.js +30 -13
  4. package/dist/JSONGenerativeUI.client.js.map +1 -1
  5. package/dist/RadioGroupScope.d.ts +6 -0
  6. package/dist/RadioGroupScope.d.ts.map +1 -0
  7. package/dist/RadioGroupScope.js +25 -0
  8. package/dist/RadioGroupScope.js.map +1 -0
  9. package/dist/a2ui/BindingContext.d.ts +11 -0
  10. package/dist/a2ui/BindingContext.d.ts.map +1 -0
  11. package/dist/a2ui/BindingContext.js +12 -0
  12. package/dist/a2ui/BindingContext.js.map +1 -0
  13. package/dist/a2ui/PresentRenderer.d.ts +11 -0
  14. package/dist/a2ui/PresentRenderer.d.ts.map +1 -0
  15. package/dist/a2ui/PresentRenderer.js +39 -0
  16. package/dist/a2ui/PresentRenderer.js.map +1 -0
  17. package/dist/a2ui/convert.d.ts +6 -0
  18. package/dist/a2ui/convert.d.ts.map +1 -1
  19. package/dist/a2ui/convert.js +369 -87
  20. package/dist/a2ui/convert.js.map +1 -1
  21. package/dist/a2ui/dataModel.d.ts +9 -0
  22. package/dist/a2ui/dataModel.d.ts.map +1 -0
  23. package/dist/a2ui/dataModel.js +44 -0
  24. package/dist/a2ui/dataModel.js.map +1 -0
  25. package/dist/a2ui/reducer.d.ts +5 -0
  26. package/dist/a2ui/reducer.d.ts.map +1 -1
  27. package/dist/a2ui/reducer.js +3 -3
  28. package/dist/a2ui/reducer.js.map +1 -1
  29. package/dist/a2ui/types.d.ts +8 -2
  30. package/dist/a2ui/types.d.ts.map +1 -1
  31. package/dist/a2ui/types.js.map +1 -1
  32. package/dist/a2ui/valueFunctions.d.ts +16 -0
  33. package/dist/a2ui/valueFunctions.d.ts.map +1 -0
  34. package/dist/a2ui/valueFunctions.js +332 -0
  35. package/dist/a2ui/valueFunctions.js.map +1 -0
  36. package/dist/actionRegistry.d.ts +1 -1
  37. package/dist/actionRegistry.js.map +1 -1
  38. package/dist/answeredValues.d.ts +16 -0
  39. package/dist/answeredValues.d.ts.map +1 -0
  40. package/dist/answeredValues.js +37 -0
  41. package/dist/answeredValues.js.map +1 -0
  42. package/dist/constants.d.ts +2 -0
  43. package/dist/constants.d.ts.map +1 -1
  44. package/dist/constants.js +3 -1
  45. package/dist/constants.js.map +1 -1
  46. package/dist/fieldReferences.d.ts +9 -0
  47. package/dist/fieldReferences.d.ts.map +1 -0
  48. package/dist/fieldReferences.js +53 -0
  49. package/dist/fieldReferences.js.map +1 -0
  50. package/dist/generativeUIToJSX.js +3 -3
  51. package/dist/generativeUIToJSX.js.map +1 -1
  52. package/dist/index.js +2 -2
  53. package/dist/index.server.js +2 -2
  54. package/dist/index.shared.js +2 -2
  55. package/dist/ir.d.ts +1 -1
  56. package/dist/ir.js.map +1 -1
  57. package/dist/renderGenerativeUI.d.ts.map +1 -1
  58. package/dist/renderGenerativeUI.js +12 -1
  59. package/dist/renderGenerativeUI.js.map +1 -1
  60. package/dist/slack/constants.d.ts +2 -0
  61. package/dist/slack/constants.d.ts.map +1 -1
  62. package/dist/slack/constants.js +3 -1
  63. package/dist/slack/constants.js.map +1 -1
  64. package/dist/slack/decodeBlockAction.d.ts +3 -1
  65. package/dist/slack/decodeBlockAction.d.ts.map +1 -1
  66. package/dist/slack/decodeBlockAction.js +58 -7
  67. package/dist/slack/decodeBlockAction.js.map +1 -1
  68. package/dist/slack/fromSlackBlocks.d.ts.map +1 -1
  69. package/dist/slack/fromSlackBlocks.js +20 -3
  70. package/dist/slack/fromSlackBlocks.js.map +1 -1
  71. package/dist/slack/toSlackBlocks.d.ts.map +1 -1
  72. package/dist/slack/toSlackBlocks.js +187 -19
  73. package/dist/slack/toSlackBlocks.js.map +1 -1
  74. package/dist/slack/types.d.ts +4 -0
  75. package/dist/slack/types.d.ts.map +1 -1
  76. package/dist/teams/constants.d.ts +1 -1
  77. package/dist/teams/constants.d.ts.map +1 -1
  78. package/dist/teams/constants.js +1 -1
  79. package/dist/teams/constants.js.map +1 -1
  80. package/dist/teams/decodeSubmitData.d.ts +4 -0
  81. package/dist/teams/decodeSubmitData.d.ts.map +1 -1
  82. package/dist/teams/decodeSubmitData.js +6 -1
  83. package/dist/teams/decodeSubmitData.js.map +1 -1
  84. package/dist/teams/toAdaptiveCard.d.ts +5 -4
  85. package/dist/teams/toAdaptiveCard.d.ts.map +1 -1
  86. package/dist/teams/toAdaptiveCard.js +56 -17
  87. package/dist/teams/toAdaptiveCard.js.map +1 -1
  88. package/dist/teams/types.d.ts +4 -1
  89. package/dist/teams/types.d.ts.map +1 -1
  90. package/dist/vocabulary/alert.d.ts +9 -2
  91. package/dist/vocabulary/alert.d.ts.map +1 -1
  92. package/dist/vocabulary/alert.js +116 -19
  93. package/dist/vocabulary/alert.js.map +1 -1
  94. package/dist/vocabulary/collectFormValues.d.ts +2 -1
  95. package/dist/vocabulary/collectFormValues.d.ts.map +1 -1
  96. package/dist/vocabulary/collectFormValues.js +10 -3
  97. package/dist/vocabulary/collectFormValues.js.map +1 -1
  98. package/dist/vocabulary/data.d.ts +22 -5
  99. package/dist/vocabulary/data.d.ts.map +1 -1
  100. package/dist/vocabulary/data.js +278 -83
  101. package/dist/vocabulary/data.js.map +1 -1
  102. package/dist/vocabulary/dispatch.d.ts +3 -2
  103. package/dist/vocabulary/dispatch.d.ts.map +1 -1
  104. package/dist/vocabulary/dispatch.js +33 -4
  105. package/dist/vocabulary/dispatch.js.map +1 -1
  106. package/dist/vocabulary/fact.d.ts +8 -1
  107. package/dist/vocabulary/fact.d.ts.map +1 -1
  108. package/dist/vocabulary/fact.js +37 -11
  109. package/dist/vocabulary/fact.js.map +1 -1
  110. package/dist/vocabulary/form.d.ts.map +1 -1
  111. package/dist/vocabulary/form.js +3 -3
  112. package/dist/vocabulary/form.js.map +1 -1
  113. package/dist/vocabulary/formatValue.d.ts +7 -0
  114. package/dist/vocabulary/formatValue.d.ts.map +1 -0
  115. package/dist/vocabulary/formatValue.js +76 -0
  116. package/dist/vocabulary/formatValue.js.map +1 -0
  117. package/dist/vocabulary/icon.d.ts +1 -1
  118. package/dist/vocabulary/interactive.d.ts +137 -8
  119. package/dist/vocabulary/interactive.d.ts.map +1 -1
  120. package/dist/vocabulary/interactive.js +404 -103
  121. package/dist/vocabulary/interactive.js.map +1 -1
  122. package/dist/vocabulary/layout.d.ts.map +1 -1
  123. package/dist/vocabulary/layout.js +4 -4
  124. package/dist/vocabulary/layout.js.map +1 -1
  125. package/dist/vocabulary/list.js +2 -2
  126. package/dist/vocabulary/list.js.map +1 -1
  127. package/dist/vocabulary/text.d.ts +1 -1
  128. package/package.json +6 -3
  129. package/src/JSONGenerativeUI.client.tsx +84 -40
  130. package/src/JSONGenerativeUI.test.tsx +964 -68
  131. package/src/RadioGroupScope.server.test.tsx +24 -0
  132. package/src/RadioGroupScope.tsx +34 -0
  133. package/src/a2ui/BindingContext.ts +26 -0
  134. package/src/a2ui/PresentRenderer.tsx +83 -0
  135. package/src/a2ui/convert.test.ts +1982 -145
  136. package/src/a2ui/convert.ts +677 -137
  137. package/src/a2ui/dataModel.ts +69 -0
  138. package/src/a2ui/reducer.test.ts +35 -0
  139. package/src/a2ui/reducer.ts +5 -4
  140. package/src/a2ui/types.ts +9 -2
  141. package/src/a2ui/valueFunctions.test.ts +271 -0
  142. package/src/a2ui/valueFunctions.ts +523 -0
  143. package/src/actionRegistry.ts +1 -1
  144. package/src/answeredValues.test.ts +33 -0
  145. package/src/answeredValues.tsx +70 -0
  146. package/src/constants.ts +4 -0
  147. package/src/fieldReferences.test.ts +66 -0
  148. package/src/fieldReferences.ts +83 -0
  149. package/src/generativeUIToJSX.test.ts +18 -0
  150. package/src/generativeUIToJSX.ts +4 -6
  151. package/src/index.server.test.ts +106 -0
  152. package/src/ir.ts +1 -1
  153. package/src/renderGenerativeUI.test.tsx +14 -5
  154. package/src/renderGenerativeUI.tsx +30 -1
  155. package/src/slack/a2uiSlack.test.ts +198 -0
  156. package/src/slack/constants.ts +3 -0
  157. package/src/slack/decodeBlockAction.test.ts +98 -0
  158. package/src/slack/decodeBlockAction.ts +110 -17
  159. package/src/slack/fromSlackBlocks.test.ts +222 -3
  160. package/src/slack/fromSlackBlocks.ts +53 -2
  161. package/src/slack/toSlackBlocks.test.ts +682 -3
  162. package/src/slack/toSlackBlocks.ts +374 -23
  163. package/src/slack/types.ts +4 -0
  164. package/src/teams/constants.ts +1 -1
  165. package/src/teams/decodeSubmitData.test.ts +33 -0
  166. package/src/teams/decodeSubmitData.ts +9 -1
  167. package/src/teams/toAdaptiveCard.test.ts +219 -0
  168. package/src/teams/toAdaptiveCard.ts +93 -19
  169. package/src/teams/types.ts +4 -1
  170. package/src/vocabulary/alert.test.tsx +288 -7
  171. package/src/vocabulary/alert.tsx +168 -26
  172. package/src/vocabulary/collectFormValues.test.ts +28 -1
  173. package/src/vocabulary/collectFormValues.ts +25 -5
  174. package/src/vocabulary/data.test.tsx +248 -6
  175. package/src/vocabulary/data.tsx +398 -100
  176. package/src/vocabulary/dispatch.ts +63 -2
  177. package/src/vocabulary/fact.test.tsx +67 -0
  178. package/src/vocabulary/fact.tsx +40 -9
  179. package/src/vocabulary/form.tsx +7 -2
  180. package/src/vocabulary/formatValue.test.ts +72 -0
  181. package/src/vocabulary/formatValue.ts +127 -0
  182. package/src/vocabulary/index.test.ts +2 -0
  183. package/src/vocabulary/interactive.dispatch.test.tsx +167 -79
  184. package/src/vocabulary/interactive.dom.test.tsx +1699 -0
  185. package/src/vocabulary/interactive.test.tsx +60 -4
  186. package/src/vocabulary/interactive.tsx +770 -151
  187. package/src/vocabulary/layout.test.tsx +6 -4
  188. package/src/vocabulary/layout.tsx +13 -2
  189. package/src/vocabulary/list.tsx +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","names":[],"sources":["../../src/vocabulary/data.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { toTextContent } from \"./toTextContent\";\n\nconst columnSchema = z.object({\n label: z.string().describe(\"Column header label.\"),\n});\n\nconst cellSchema = z\n .union([z.string(), z.number(), z.boolean()])\n .describe(\"A cell value.\");\n\ntype TableColumn = { label: string };\ntype TableCell = string | number | boolean;\n\nconst isTableColumn = (column: unknown): column is TableColumn =>\n column !== null &&\n typeof column === \"object\" &&\n \"label\" in column &&\n typeof column.label === \"string\";\n\nconst isTableCell = (cell: unknown): cell is TableCell =>\n typeof cell === \"string\" ||\n typeof cell === \"number\" ||\n typeof cell === \"boolean\";\n\nconst CHART_HEIGHT = 40;\nconst CHART_WIDTH = 100;\n\nconst clampValue = (value: unknown): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst yFor = (value: number, max: number): number =>\n max > 0 ? CHART_HEIGHT - (value / max) * CHART_HEIGHT : CHART_HEIGHT;\n\nconst pointSchema = z.object({\n label: z.string().optional().describe(\"Point label.\"),\n value: z.number().describe(\"Point value.\"),\n});\n\nconst seriesSchema = z.object({\n label: z.string().optional().describe(\"Series label, shown in the legend.\"),\n data: z.array(pointSchema).describe(\"Data points for this series.\"),\n});\n\ntype ChartPoint = { label?: string; value: number };\ntype ChartSeriesInput = { label?: string; data: ChartPoint[] };\ntype NormalizedChartSeries = {\n label: string | undefined;\n values: number[];\n labels: (string | undefined)[];\n};\n\n/** Pads every series to the longest series' length, treating a shorter series' missing points as `{ value: 0 }` so mismatched series never misalign or throw. */\nfunction normalizeSeries(\n seriesProp: unknown,\n dataProp: unknown,\n): { count: number; series: NormalizedChartSeries[] } {\n const rawSeries: ChartSeriesInput[] =\n Array.isArray(seriesProp) && seriesProp.length > 0\n ? (seriesProp as ChartSeriesInput[])\n : [{ data: Array.isArray(dataProp) ? (dataProp as ChartPoint[]) : [] }];\n\n const count = rawSeries.reduce((max, s) => {\n const len = Array.isArray(s?.data) ? s.data.length : 0;\n return Math.max(max, len);\n }, 0);\n\n const series = rawSeries.map((s) => {\n const points = Array.isArray(s?.data) ? s.data : [];\n const values: number[] = [];\n const labels: (string | undefined)[] = [];\n for (let i = 0; i < count; i++) {\n const point = points[i];\n values.push(clampValue(point?.value));\n labels.push(typeof point?.label === \"string\" ? point.label : undefined);\n }\n return {\n label: typeof s?.label === \"string\" ? s.label : undefined,\n values,\n labels,\n };\n });\n\n return { count, series };\n}\n\nfunction computeMax(\n series: NormalizedChartSeries[],\n count: number,\n stacked: boolean,\n): number {\n if (stacked) {\n let max = 0;\n for (let i = 0; i < count; i++) {\n let sum = 0;\n for (const s of series) sum += s.values[i] ?? 0;\n max = Math.max(max, sum);\n }\n return max;\n }\n let max = 0;\n for (const s of series) for (const v of s.values) max = Math.max(max, v);\n return max;\n}\n\nconst NICE_MULTIPLES = [1, 2, 5];\n\n/** The smallest of `{1, 2, 5} × 10^n` that is `>= max`, so axis ticks land on round numbers. */\nfunction niceMax(max: number): number {\n if (max <= 0) return 0;\n const exponent = Math.floor(Math.log10(max));\n for (const multiple of NICE_MULTIPLES) {\n const candidate = multiple * 10 ** exponent;\n if (candidate >= max) return candidate;\n }\n return 10 ** (exponent + 1);\n}\n\nconst TICK_COUNT = 5;\n\n/** `TICK_COUNT` evenly spaced ticks from `max` down to `0`, for a top-to-bottom y-axis column. */\nfunction tickValues(max: number): number[] {\n const ticks: number[] = [];\n for (let i = 0; i < TICK_COUNT; i++) {\n ticks.push((max * (TICK_COUNT - 1 - i)) / (TICK_COUNT - 1));\n }\n return ticks;\n}\n\nfunction formatTick(value: number): string {\n return (Math.round(value * 100) / 100).toLocaleString(\"en-US\");\n}\n\ntype ChartVariant = \"bar\" | \"line\" | \"sparkline\" | \"area\";\n\nconst SERIES_PALETTE_SIZE = 5;\n\nfunction renderSeriesMarks(\n variant: ChartVariant,\n series: NormalizedChartSeries[],\n count: number,\n scaleMax: number,\n stacked: boolean,\n) {\n if (variant === \"bar\") {\n const slot = count > 0 ? CHART_WIDTH / count : 0;\n const gap = slot * 0.2;\n const groupWidth = slot - gap;\n const seriesCount = series.length;\n const perSeriesWidth =\n stacked || seriesCount <= 1 ? groupWidth : groupWidth / seriesCount;\n const cumulative = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const marks = s.values.map((value, i) => {\n const height = scaleMax > 0 ? (value / scaleMax) * CHART_HEIGHT : 0;\n const belowHeight =\n stacked && scaleMax > 0\n ? ((cumulative[i] ?? 0) / scaleMax) * CHART_HEIGHT\n : 0;\n const x =\n stacked || seriesCount <= 1\n ? i * slot + gap / 2\n : i * slot + gap / 2 + seriesIndex * perSeriesWidth;\n return (\n <rect\n key={i}\n x={x}\n y={CHART_HEIGHT - belowHeight - height}\n width={perSeriesWidth}\n height={height}\n fill=\"currentColor\"\n />\n );\n });\n if (stacked) {\n for (let i = 0; i < count; i++) {\n cumulative[i] = (cumulative[i] ?? 0) + (s.values[i] ?? 0);\n }\n }\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n >\n {marks}\n </g>\n );\n });\n }\n\n if (variant === \"area\") {\n const cumulative = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const bottoms = stacked\n ? cumulative.slice()\n : (new Array(count).fill(0) as number[]);\n if (stacked) {\n for (let i = 0; i < count; i++) {\n cumulative[i] = (cumulative[i] ?? 0) + (s.values[i] ?? 0);\n }\n }\n const tops = stacked ? cumulative.slice() : s.values.slice();\n\n if (count === 1) {\n const y = yFor(tops[0] ?? 0, scaleMax);\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n >\n <circle cx={CHART_WIDTH / 2} cy={y} r={2} fill=\"currentColor\" />\n </g>\n );\n }\n if (count === 0) {\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n />\n );\n }\n\n const topPoints = tops.map(\n (v, i) => `${(i / (count - 1)) * CHART_WIDTH},${yFor(v, scaleMax)}`,\n );\n const bottomPoints = bottoms\n .map(\n (v, i) => `${(i / (count - 1)) * CHART_WIDTH},${yFor(v, scaleMax)}`,\n )\n .reverse();\n\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n >\n <polygon\n points={[...topPoints, ...bottomPoints].join(\" \")}\n fill=\"currentColor\"\n fillOpacity=\"0.25\"\n />\n <polyline\n points={topPoints.join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </g>\n );\n });\n }\n\n // line / sparkline: each series is always drawn independently. Stacking a line has no single standard meaning, so `stacked` is ignored (the caller never passes it for these variants).\n return series.map((s, seriesIndex) => (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n >\n {count === 1 ? (\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(s.values[0] ?? 0, scaleMax)}\n r={2}\n fill=\"currentColor\"\n />\n ) : count > 1 ? (\n <polyline\n points={s.values\n .map(\n (v, i) =>\n `${(i / (count - 1)) * CHART_WIDTH},${yFor(v, scaleMax)}`,\n )\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n </g>\n ));\n}\n\nexport const dataVocabulary = {\n Table: {\n description:\n \"Tabular data. Provide `columns` and `rows`; each row is an array of cells matching the columns.\",\n properties: z.object({\n columns: z.array(columnSchema).optional().describe(\"Column definitions.\"),\n rows: z.array(z.array(cellSchema)).optional().describe(\"Rows of cells.\"),\n }),\n render: ({ columns, rows, children }) => {\n const safeColumns = Array.isArray(columns) ? columns : [];\n const hasColumns = safeColumns.some(isTableColumn);\n const safeRows = Array.isArray(rows) ? rows.filter(Array.isArray) : [];\n\n return (\n <table data-aui=\"table\">\n {hasColumns ? (\n <thead>\n <tr>\n {safeColumns.map((column, i) => (\n <th key={i} data-aui=\"table-col\">\n {isTableColumn(column) ? column.label : \"\"}\n </th>\n ))}\n </tr>\n </thead>\n ) : null}\n {safeRows.length ? (\n <tbody>\n {safeRows.map((row, r) => (\n <tr key={r}>\n {row.map((cell, c) => (\n <td key={c}>{isTableCell(cell) ? String(cell) : \"\"}</td>\n ))}\n </tr>\n ))}\n </tbody>\n ) : null}\n {children}\n </table>\n );\n },\n },\n Markdown: {\n description:\n \"A markdown string. Rendered as-is by default; override this component for a full markdown renderer.\",\n properties: z.object({\n value: z.string().describe(\"Markdown source.\"),\n }),\n streamProperties: true,\n render: ({ value, children }) => (\n <div data-aui=\"markdown\">\n {toTextContent(value)}\n {children}\n </div>\n ),\n },\n Chart: {\n description:\n \"A chart. `variant` selects bar, line, sparkline, or area rendering. Provide `data` for a single series, or `series` for multiple named series (`series` takes precedence over `data` when both are present). Set `stacked` to accumulate series values instead of overlaying them, and `showAxis`/`showLegend` to add y-axis ticks, x-axis point labels, and a legend.\",\n properties: z.object({\n variant: z\n .enum([\"bar\", \"line\", \"sparkline\", \"area\"])\n .describe(\"Chart variant.\"),\n data: z\n .array(pointSchema)\n .optional()\n .describe(\"Data points for a single series.\"),\n series: z\n .array(seriesSchema)\n .optional()\n .describe(\n \"Multiple named series; takes precedence over `data` when present.\",\n ),\n stacked: z\n .boolean()\n .optional()\n .describe(\n \"Accumulate series values instead of overlaying them (bar and area variants; ignored for line and sparkline).\",\n ),\n showAxis: z\n .boolean()\n .optional()\n .describe(\"Show y-axis ticks and x-axis point labels.\"),\n showLegend: z\n .boolean()\n .optional()\n .describe(\"Show a legend mapping each series to its color.\"),\n color: z\n .string()\n .optional()\n .describe(\n \"Series color (single-series mode only). One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.\",\n ),\n }),\n render: ({\n variant,\n data,\n series,\n stacked,\n showAxis,\n showLegend,\n color,\n }) => {\n const usesExtendedFeatures =\n variant === \"area\" ||\n !!stacked ||\n !!showAxis ||\n !!showLegend ||\n (Array.isArray(series) && series.length > 0);\n\n if (!usesExtendedFeatures) {\n const points = Array.isArray(data) ? data : [];\n const n = points.length;\n const values = points.map((d) => clampValue(d?.value));\n const max = values.reduce((m, v) => Math.max(m, v), 0);\n const slot = n > 0 ? CHART_WIDTH / n : 0;\n const gap = slot * 0.2;\n const barWidth = slot - gap;\n\n return (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${n} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {variant === \"bar\" ? (\n values.map((v, i) => {\n const height = max > 0 ? (v / max) * CHART_HEIGHT : 0;\n return (\n <rect\n key={i}\n x={i * slot + gap / 2}\n y={CHART_HEIGHT - height}\n width={barWidth}\n height={height}\n fill=\"currentColor\"\n />\n );\n })\n ) : n === 1 ? (\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(values[0] ?? 0, max)}\n r={2}\n fill=\"currentColor\"\n />\n ) : n > 1 ? (\n <polyline\n points={values\n .map(\n (v, i) => `${(i / (n - 1)) * CHART_WIDTH},${yFor(v, max)}`,\n )\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n />\n ) : null}\n </svg>\n );\n }\n\n const { count, series: normalized } = normalizeSeries(series, data);\n const stackedScale =\n !!stacked && (variant === \"bar\" || variant === \"area\");\n const rawMax = computeMax(normalized, count, stackedScale);\n const scaleMax = showAxis ? niceMax(rawMax) : rawMax;\n const marks = renderSeriesMarks(\n variant,\n normalized,\n count,\n scaleMax,\n stackedScale,\n );\n\n const svg = (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${count} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {marks}\n </svg>\n );\n\n if (!showAxis && !showLegend) return svg;\n\n return (\n <div data-aui=\"chart-frame\">\n {showAxis ? (\n <div data-aui=\"chart-ticks\">\n {tickValues(scaleMax).map((tick, i) => (\n <div key={i}>{formatTick(tick)}</div>\n ))}\n </div>\n ) : null}\n {svg}\n {showAxis ? (\n <div data-aui=\"chart-xlabels\">\n {(normalized[0]?.labels ?? []).map((label, i) => (\n <div key={i}>{label ?? \"\"}</div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <div data-aui=\"chart-legend\">\n {normalized.map((s, i) => (\n <span\n key={i}\n data-aui=\"chart-legend-item\"\n data-aui-series={i % SERIES_PALETTE_SIZE}\n >\n <span data-aui=\"chart-legend-swatch\" />\n {s.label ?? `Series ${i + 1}`}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","names":[],"sources":["../../src/vocabulary/data.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { formatValue, isNumericTableFormat } from \"./formatValue\";\nimport { toTextContent } from \"./toTextContent\";\n\nconst columnSchema = z.object({\n label: z.string().describe(\"Column header label.\"),\n align: z.enum([\"start\", \"end\"]).optional().describe(\"Cell alignment.\"),\n format: z\n .object({\n kind: z\n .enum([\"number\", \"currency\", \"percent\", \"date\"])\n .describe(\n \"Format kind. `percent` takes a fraction, so 0.25 renders as 25%.\",\n ),\n currency: z.string().optional().describe(\"Currency code.\"),\n decimals: z.number().optional().describe(\"Decimal places.\"),\n })\n .optional()\n .describe(\"Cell value format.\"),\n});\n\nconst cellSchema = z\n .union([z.string(), z.number(), z.boolean()])\n .describe(\"A cell value.\");\n\ntype TableColumn = {\n label: string;\n align?: \"start\" | \"end\";\n format?: unknown;\n};\ntype TableCell = string | number | boolean;\n\ntype TableSort = { column: number; direction: \"ascending\" | \"descending\" };\n\nconst tableCollator = new Intl.Collator(\"en-US\", { numeric: true });\n\nconst isTableColumn = (column: unknown): column is TableColumn =>\n column !== null &&\n typeof column === \"object\" &&\n \"label\" in column &&\n typeof column.label === \"string\";\n\nconst isTableCell = (cell: unknown): cell is TableCell =>\n typeof cell === \"string\" ||\n typeof cell === \"number\" ||\n typeof cell === \"boolean\";\n\nconst tableAlignment = (column: unknown): \"start\" | \"end\" | undefined => {\n if (!isTableColumn(column)) return undefined;\n if (column.align === \"start\" || column.align === \"end\") return column.align;\n return isNumericTableFormat(column.format) ? \"end\" : undefined;\n};\n\nconst compareTableCells = (left: unknown, right: unknown): number => {\n if (\n typeof left === \"number\" &&\n Number.isFinite(left) &&\n typeof right === \"number\" &&\n Number.isFinite(right)\n ) {\n return left - right;\n }\n if (typeof left === \"number\" && Number.isFinite(left)) return -1;\n if (typeof right === \"number\" && Number.isFinite(right)) return 1;\n return tableCollator.compare(\n isTableCell(left) ? String(left) : \"\",\n isTableCell(right) ? String(right) : \"\",\n );\n};\n\ntype TableViewProps = {\n columns: unknown;\n rows: unknown;\n children: React.ReactNode;\n sort?: TableSort | undefined;\n onSort?: ((column: number) => void) | undefined;\n};\n\nfunction TableView({ columns, rows, children, sort, onSort }: TableViewProps) {\n const safeColumns = Array.isArray(columns) ? columns : [];\n const hasColumns = safeColumns.some(isTableColumn);\n const safeRows = Array.isArray(rows) ? rows.filter(Array.isArray) : [];\n const sortedRows =\n sort === undefined\n ? safeRows\n : safeRows\n .map((row, index) => ({ row, index }))\n .sort((left, right) => {\n const comparison = compareTableCells(\n left.row[sort.column],\n right.row[sort.column],\n );\n return comparison === 0\n ? left.index - right.index\n : sort.direction === \"ascending\"\n ? comparison\n : -comparison;\n })\n .map(({ row }) => row);\n\n return (\n <table data-aui=\"table\">\n {hasColumns ? (\n <thead>\n <tr>\n {safeColumns.map((column, i) => {\n const label = isTableColumn(column) ? column.label : \"\";\n const direction = sort?.column === i ? sort.direction : undefined;\n return (\n <th\n key={i}\n data-aui=\"table-col\"\n data-aui-align={tableAlignment(column)}\n aria-sort={direction}\n >\n {onSort ? (\n <button\n type=\"button\"\n data-aui=\"table-sort\"\n onClick={() => onSort(i)}\n >\n {label}\n {direction ? (\n <span\n aria-hidden=\"true\"\n data-aui=\"table-sort-direction\"\n >\n {direction === \"ascending\" ? \"↑\" : \"↓\"}\n </span>\n ) : null}\n </button>\n ) : (\n label\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n ) : null}\n {safeRows.length ? (\n <tbody>\n {sortedRows.map((row, r) => (\n <tr key={r}>\n {row.map((cell, c) => (\n <td key={c} data-aui-align={tableAlignment(safeColumns[c])}>\n {formatValue(\n cell,\n isTableColumn(safeColumns[c])\n ? safeColumns[c].format\n : undefined,\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n ) : null}\n {children}\n </table>\n );\n}\n\nfunction SortableTable(props: Omit<TableViewProps, \"sort\" | \"onSort\">) {\n const [sort, setSort] = React.useState<TableSort | undefined>();\n return (\n <TableView\n {...props}\n sort={sort}\n onSort={(column) =>\n setSort((current) =>\n current?.column !== column\n ? { column, direction: \"ascending\" }\n : current.direction === \"ascending\"\n ? { column, direction: \"descending\" }\n : undefined,\n )\n }\n />\n );\n}\n\nconst CHART_HEIGHT = 40;\nconst CHART_WIDTH = 100;\n\nconst clampValue = (value: unknown): number =>\n typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n\ntype ChartScale = { min: number; max: number };\n\nconst yFor = (value: number, scale: ChartScale): number => {\n const span = scale.max - scale.min;\n return span > 0\n ? CHART_HEIGHT - ((value - scale.min) / span) * CHART_HEIGHT\n : CHART_HEIGHT;\n};\n\nconst pointSchema = z.object({\n label: z.string().optional().describe(\"Point label.\"),\n value: z.number().describe(\"Point value.\"),\n});\n\nconst seriesSchema = z.object({\n label: z.string().optional().describe(\"Series label, shown in the legend.\"),\n color: z\n .string()\n .optional()\n .describe(\n \"Series color. One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.\",\n ),\n data: z.array(pointSchema).describe(\"Data points for this series.\"),\n});\n\ntype ChartPoint = { label?: string | undefined; value: number };\ntype ChartSeriesInput = {\n label?: string | undefined;\n color?: string | undefined;\n data?: ChartPoint[] | undefined;\n};\ntype NormalizedChartSeries = {\n label: string | undefined;\n color: string | undefined;\n values: number[];\n labels: (string | undefined)[];\n};\n\n/** Pads every series to the longest series' length, treating a shorter series' missing points as `{ value: 0 }` so mismatched series never misalign or throw. */\nfunction normalizeSeries(\n seriesProp: unknown,\n dataProp: unknown,\n): { count: number; series: NormalizedChartSeries[] } {\n const rawSeries: ChartSeriesInput[] =\n Array.isArray(seriesProp) && seriesProp.length > 0\n ? (seriesProp as ChartSeriesInput[])\n : [{ data: Array.isArray(dataProp) ? (dataProp as ChartPoint[]) : [] }];\n\n const count = rawSeries.reduce((max, s) => {\n const len = Array.isArray(s?.data) ? s.data.length : 0;\n return Math.max(max, len);\n }, 0);\n\n const series = rawSeries.map((s) => {\n const points = Array.isArray(s?.data) ? s.data : [];\n const values: number[] = [];\n const labels: (string | undefined)[] = [];\n for (let i = 0; i < count; i++) {\n const point = points[i];\n values.push(clampValue(point?.value));\n labels.push(typeof point?.label === \"string\" ? point.label : undefined);\n }\n return {\n label: typeof s?.label === \"string\" ? s.label : undefined,\n color: typeof s?.color === \"string\" ? s.color : undefined,\n values,\n labels,\n };\n });\n\n return { count, series };\n}\n\nfunction valueScale(values: number[]): ChartScale {\n let min = 0;\n let max = 0;\n for (const value of values) {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return { min, max };\n}\n\nfunction computeScale(\n series: NormalizedChartSeries[],\n count: number,\n stacked: boolean,\n): ChartScale {\n if (stacked) {\n let min = 0;\n let max = 0;\n for (let i = 0; i < count; i++) {\n let negative = 0;\n let positive = 0;\n for (const s of series) {\n const value = s.values[i] ?? 0;\n if (value < 0) negative += value;\n else positive += value;\n }\n min = Math.min(min, negative);\n max = Math.max(max, positive);\n }\n return { min, max };\n }\n return valueScale(series.flatMap((s) => s.values));\n}\n\nconst NICE_MULTIPLES = [1, 2, 5];\n\n/** The smallest of `{1, 2, 5} × 10^n` that is `>= max`, so axis ticks land on round numbers. */\nfunction niceMax(max: number): number {\n if (max <= 0) return 0;\n const exponent = Math.floor(Math.log10(max));\n for (const multiple of NICE_MULTIPLES) {\n const candidate = multiple * 10 ** exponent;\n if (candidate >= max) return candidate;\n }\n return 10 ** (exponent + 1);\n}\n\nconst TICK_COUNT = 5;\n\nfunction axisScale(scale: ChartScale): ChartScale {\n if (scale.min === 0) return { min: 0, max: niceMax(scale.max) };\n if (scale.max === 0) return { min: -niceMax(-scale.min), max: 0 };\n const step = niceMax(Math.max(-scale.min, scale.max) / 2);\n return { min: -2 * step, max: 2 * step };\n}\n\n/** `TICK_COUNT` evenly spaced ticks from the top of the scale down to its bottom, for a top-to-bottom y-axis column. */\nfunction tickValues(scale: ChartScale): number[] {\n const ticks: number[] = [];\n if (scale.min === 0) {\n for (let i = 0; i < TICK_COUNT; i++) {\n ticks.push((scale.max * (TICK_COUNT - 1 - i)) / (TICK_COUNT - 1));\n }\n return ticks;\n }\n for (let i = 0; i < TICK_COUNT; i++) {\n ticks.push(\n scale.min +\n ((scale.max - scale.min) * (TICK_COUNT - 1 - i)) / (TICK_COUNT - 1),\n );\n }\n return ticks;\n}\n\nfunction formatTick(value: number): string {\n return (Math.round(value * 100) / 100).toLocaleString(\"en-US\");\n}\n\ntype ChartVariant = \"bar\" | \"line\" | \"sparkline\" | \"area\";\n\nconst SERIES_PALETTE_SIZE = 5;\n\nconst tooltipText = (\n seriesLabel: string | undefined,\n pointLabel: string | undefined,\n index: number,\n value: number,\n) =>\n `${seriesLabel ? `${seriesLabel}, ` : \"\"}${pointLabel || index + 1}: ${formatTick(value)}`;\n\nconst seriesColor = (\n series: NormalizedChartSeries,\n seriesCount: number,\n color: unknown,\n) =>\n series.color ??\n (seriesCount === 1 && typeof color === \"string\" ? color : undefined);\n\nconst xFor = (index: number, count: number): number =>\n count === 1 ? CHART_WIDTH / 2 : (index / (count - 1)) * CHART_WIDTH;\n\nfunction pointTargets(\n series: NormalizedChartSeries,\n positions: number[],\n count: number,\n scale: ChartScale,\n) {\n return series.values.map((value, i) => (\n <circle\n key={i}\n data-aui=\"chart-point\"\n cx={xFor(i, count)}\n cy={yFor(positions[i] ?? 0, scale)}\n r={4}\n fill=\"transparent\"\n >\n <title>{tooltipText(series.label, series.labels[i], i, value)}</title>\n </circle>\n ));\n}\n\nfunction barGeometry(value: number, start: number, scale: ChartScale) {\n const end = start + value;\n if (scale.min === 0 && start >= 0 && end >= 0) {\n const height = scale.max > 0 ? (value / scale.max) * CHART_HEIGHT : 0;\n const belowHeight = scale.max > 0 ? (start / scale.max) * CHART_HEIGHT : 0;\n return { y: CHART_HEIGHT - belowHeight - height, height };\n }\n const startY = yFor(start, scale);\n const endY = yFor(end, scale);\n return { y: Math.min(startY, endY), height: Math.abs(endY - startY) };\n}\n\nfunction renderSeriesMarks(\n variant: ChartVariant,\n series: NormalizedChartSeries[],\n count: number,\n scale: ChartScale,\n stacked: boolean,\n color: unknown,\n) {\n const seriesCount = series.length;\n\n if (variant === \"bar\") {\n const slot = count > 0 ? CHART_WIDTH / count : 0;\n const gap = slot * 0.2;\n const groupWidth = slot - gap;\n const perSeriesWidth =\n stacked || seriesCount <= 1 ? groupWidth : groupWidth / seriesCount;\n const negatives = new Array(count).fill(0) as number[];\n const positives = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const marks = s.values.map((value, i) => {\n const start = stacked\n ? value < 0\n ? (negatives[i] ?? 0)\n : (positives[i] ?? 0)\n : 0;\n const { y, height } = barGeometry(value, start, scale);\n const x =\n stacked || seriesCount <= 1\n ? i * slot + gap / 2\n : i * slot + gap / 2 + seriesIndex * perSeriesWidth;\n return (\n <rect\n key={i}\n x={x}\n y={y}\n width={perSeriesWidth}\n height={height}\n fill=\"currentColor\"\n >\n <title>{tooltipText(s.label, s.labels[i], i, value)}</title>\n </rect>\n );\n });\n if (stacked) {\n for (let i = 0; i < count; i++) {\n const value = s.values[i] ?? 0;\n if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;\n else positives[i] = (positives[i] ?? 0) + value;\n }\n }\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n {marks}\n </g>\n );\n });\n }\n\n if (variant === \"area\") {\n const negatives = new Array(count).fill(0) as number[];\n const positives = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const bottoms = s.values.map((value, i) =>\n stacked ? (value < 0 ? (negatives[i] ?? 0) : (positives[i] ?? 0)) : 0,\n );\n const tops = s.values.map((value, i) =>\n stacked ? (bottoms[i] ?? 0) + value : value,\n );\n if (stacked) {\n for (let i = 0; i < count; i++) {\n const value = s.values[i] ?? 0;\n if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;\n else positives[i] = (positives[i] ?? 0) + value;\n }\n }\n\n if (count === 1) {\n const y = yFor(tops[0] ?? 0, scale);\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n <circle cx={CHART_WIDTH / 2} cy={y} r={2} fill=\"currentColor\" />\n {pointTargets(s, tops, count, scale)}\n </g>\n );\n }\n if (count === 0) {\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n />\n );\n }\n\n const topPoints = tops.map(\n (v, i) => `${xFor(i, count)},${yFor(v, scale)}`,\n );\n const bottomPoints = bottoms\n .map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`)\n .reverse();\n\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n <polygon\n points={[...topPoints, ...bottomPoints].join(\" \")}\n fill=\"currentColor\"\n fillOpacity=\"0.25\"\n />\n <polyline\n points={topPoints.join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {pointTargets(s, tops, count, scale)}\n </g>\n );\n });\n }\n\n // line / sparkline: each series is always drawn independently. Stacking a line has no single standard meaning, so `stacked` is ignored (the caller never passes it for these variants).\n return series.map((s, seriesIndex) => (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, series.length, color)}\n >\n {count === 1 ? (\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(s.values[0] ?? 0, scale)}\n r={2}\n fill=\"currentColor\"\n />\n ) : count > 1 ? (\n <polyline\n points={s.values\n .map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`)\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {variant === \"line\" ? pointTargets(s, s.values, count, scale) : null}\n </g>\n ));\n}\n\nexport const dataVocabulary = {\n Table: {\n description:\n \"Tabular data. Provide `columns` and `rows`; each row is an array of cells matching the columns.\",\n properties: z.object({\n columns: z.array(columnSchema).optional().describe(\"Column definitions.\"),\n rows: z.array(z.array(cellSchema)).optional().describe(\"Rows of cells.\"),\n sortable: z.boolean().optional().describe(\"Allow header sorting.\"),\n }),\n render: ({ columns, rows, sortable, children }) =>\n sortable === true ? (\n <SortableTable columns={columns} rows={rows}>\n {children}\n </SortableTable>\n ) : (\n <TableView columns={columns} rows={rows}>\n {children}\n </TableView>\n ),\n },\n Markdown: {\n description:\n \"A markdown string. Rendered as-is by default; override this component for a full markdown renderer.\",\n properties: z.object({\n value: z.string().describe(\"Markdown source.\"),\n }),\n streamProperties: true,\n render: ({ value, children }) => (\n <div data-aui=\"markdown\">\n {toTextContent(value)}\n {children}\n </div>\n ),\n },\n Chart: {\n description:\n \"A chart. `variant` selects bar, line, sparkline, or area rendering. Provide `data` for a single series, or `series` for multiple named series (`series` takes precedence over `data` when both are present). Set `stacked` to accumulate series values instead of overlaying them, and `showAxis`/`showLegend` to add y-axis ticks, x-axis point labels, and a legend.\",\n properties: z.object({\n variant: z\n .enum([\"bar\", \"line\", \"sparkline\", \"area\"])\n .describe(\"Chart variant.\"),\n data: z\n .array(pointSchema)\n .optional()\n .describe(\"Data points for a single series.\"),\n series: z\n .array(seriesSchema)\n .optional()\n .describe(\n \"Multiple named series; takes precedence over `data` when present.\",\n ),\n stacked: z\n .boolean()\n .optional()\n .describe(\n \"Accumulate series values instead of overlaying them (bar and area variants; ignored for line and sparkline).\",\n ),\n showAxis: z\n .boolean()\n .optional()\n .describe(\"Show y-axis ticks and x-axis point labels.\"),\n showLegend: z\n .boolean()\n .optional()\n .describe(\"Show a legend mapping each series to its color.\"),\n color: z\n .string()\n .optional()\n .describe(\n \"Series color (single-series mode only). One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.\",\n ),\n }),\n render: ({\n variant,\n data,\n series,\n stacked,\n showAxis,\n showLegend,\n color,\n }) => {\n const usesExtendedFeatures =\n variant === \"area\" ||\n !!stacked ||\n !!showAxis ||\n !!showLegend ||\n (Array.isArray(series) && series.length > 0);\n\n if (!usesExtendedFeatures) {\n const points = Array.isArray(data) ? data : [];\n const n = points.length;\n const values = points.map((d) => clampValue(d?.value));\n const scale = valueScale(values);\n const chartSeries: NormalizedChartSeries = {\n label: undefined,\n color: undefined,\n values,\n labels: points.map((point) =>\n typeof point?.label === \"string\" ? point.label : undefined,\n ),\n };\n const slot = n > 0 ? CHART_WIDTH / n : 0;\n const gap = slot * 0.2;\n const barWidth = slot - gap;\n const crossesZero = scale.min < 0 && scale.max > 0;\n\n return (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${n} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {crossesZero ? (\n <line\n data-aui=\"chart-zero\"\n x1={0}\n x2={CHART_WIDTH}\n y1={yFor(0, scale)}\n y2={yFor(0, scale)}\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {variant === \"bar\" ? (\n values.map((v, i) => {\n const { y, height } = barGeometry(v, 0, scale);\n return (\n <rect\n key={i}\n x={i * slot + gap / 2}\n y={y}\n width={barWidth}\n height={height}\n fill=\"currentColor\"\n >\n <title>\n {tooltipText(undefined, chartSeries.labels[i], i, v)}\n </title>\n </rect>\n );\n })\n ) : n === 1 ? (\n <>\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(values[0] ?? 0, scale)}\n r={2}\n fill=\"currentColor\"\n />\n {variant === \"line\"\n ? pointTargets(chartSeries, values, n, scale)\n : null}\n </>\n ) : n > 1 ? (\n <>\n <polyline\n points={values\n .map((v, i) => `${xFor(i, n)},${yFor(v, scale)}`)\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n />\n {variant === \"line\"\n ? pointTargets(chartSeries, values, n, scale)\n : null}\n </>\n ) : null}\n </svg>\n );\n }\n\n const { count, series: normalized } = normalizeSeries(series, data);\n const stackedScale =\n !!stacked && (variant === \"bar\" || variant === \"area\");\n const rawScale = computeScale(normalized, count, stackedScale);\n const scale = showAxis ? axisScale(rawScale) : rawScale;\n const marks = renderSeriesMarks(\n variant,\n normalized,\n count,\n scale,\n stackedScale,\n color,\n );\n const crossesZero = rawScale.min < 0 && rawScale.max > 0;\n\n const svg = (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${count} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {crossesZero ? (\n <line\n data-aui=\"chart-zero\"\n x1={0}\n x2={CHART_WIDTH}\n y1={yFor(0, scale)}\n y2={yFor(0, scale)}\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {marks}\n </svg>\n );\n\n if (!showAxis && !showLegend) return svg;\n\n return (\n <div data-aui=\"chart-frame\">\n {showAxis ? (\n <div data-aui=\"chart-ticks\">\n {tickValues(scale).map((tick, i) => (\n <div key={i}>{formatTick(tick)}</div>\n ))}\n </div>\n ) : null}\n {svg}\n {showAxis ? (\n <div data-aui=\"chart-xlabels\">\n {(normalized[0]?.labels ?? []).map((label, i) => (\n <div key={i}>{label ?? \"\"}</div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <div data-aui=\"chart-legend\">\n {normalized.map((s, i) => (\n <span\n key={i}\n data-aui=\"chart-legend-item\"\n data-aui-series={i % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, normalized.length, color)}\n >\n <span data-aui=\"chart-legend-swatch\" />\n {s.label ?? `Series ${i + 1}`}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { Action } from "../ir.js";
2
2
  import type { GenerativeUIDispatch } from "../types.js";
3
+ import type { A2uiBinding } from "../a2ui/BindingContext.js";
3
4
  export declare const actionAttr: (a: Action | undefined) => string | undefined;
4
5
  /**
5
- * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.
6
+ * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. Each `{ "$field": name }` inside `$action` first resolves to the current value of the control with that `name` in the vocabulary form or generative UI root nearest to `source`, collected the way a `Form` collects it; a reference whose control is missing or holds no value resolves to its `fallback`, or is dropped without one. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.
6
7
  */
7
- export declare const fire: ($action: Action | undefined, $dispatch: GenerativeUIDispatch | undefined, input?: unknown) => void;
8
+ export declare const fire: ($action: Action | undefined, $dispatch: GenerativeUIDispatch | undefined, input?: unknown, source?: Element, bindings?: ReadonlyMap<string, A2uiBinding>) => void;
8
9
  //# sourceMappingURL=dispatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/vocabulary/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAiB;AAErD,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SACzB,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,MAAM,GAAG,SAAS,EAC3B,WAAW,oBAAoB,GAAG,SAAS,EAC3C,QAAQ,OAAO,SAShB,CAAC"}
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/vocabulary/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAiB;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,kCAA+B;AAQ1D,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SACzB,CAAC;AA8CpC;;GAEG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,MAAM,GAAG,SAAS,EAC3B,WAAW,oBAAoB,GAAG,SAAS,EAC3C,QAAQ,OAAO,EACf,SAAS,OAAO,EAChB,WAAW,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,SAgB5C,CAAC"}
@@ -1,12 +1,41 @@
1
+ import { hasFieldReference, resolveFieldReferences } from "../fieldReferences.js";
2
+ import "../constants.js";
3
+ import { equalData } from "../a2ui/dataModel.js";
4
+ import { collectFormValues } from "./collectFormValues.js";
1
5
  //#region src/vocabulary/dispatch.ts
2
6
  const actionAttr = (a) => a ? JSON.stringify(a) : void 0;
7
+ const fieldValues = (source, bindings) => {
8
+ const scope = source.closest("form[data-aui], [data-aui=\"root\"]");
9
+ if (!scope) return {};
10
+ const root = scope.closest("[data-aui=\"root\"]");
11
+ const controls = Array.from(scope.querySelectorAll("input, select, textarea")).filter((control) => control.closest("[data-aui=\"root\"]") === root);
12
+ const values = collectFormValues(controls);
13
+ if (!bindings) return values;
14
+ const groups = /* @__PURE__ */ new Map();
15
+ for (const control of controls) {
16
+ const name = control.getAttribute("data-aui-field-name") ?? control.name;
17
+ if (!bindings.has(name)) continue;
18
+ const field = groups.get(name) ?? /* @__PURE__ */ new Map();
19
+ groups.set(name, field);
20
+ const group = control.type === "radio" || control.hasAttribute("data-aui-checkbox-group") ? control.closest("fieldset") ?? control : control;
21
+ const elements = field.get(group) ?? [];
22
+ elements.push(control);
23
+ field.set(group, elements);
24
+ }
25
+ for (const [name, field] of groups) {
26
+ const candidates = [...field.values()].map((elements) => collectFormValues(elements)[name]).filter((value) => value !== void 0);
27
+ if (candidates.length > 0) values[name] = candidates.find((value) => !equalData(value, bindings.get(name).value)) ?? candidates[0];
28
+ }
29
+ return values;
30
+ };
3
31
  /**
4
- * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.
32
+ * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. Each `{ "$field": name }` inside `$action` first resolves to the current value of the control with that `name` in the vocabulary form or generative UI root nearest to `source`, collected the way a `Form` collects it; a reference whose control is missing or holds no value resolves to its `fallback`, or is dropped without one. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.
5
33
  */
6
- const fire = ($action, $dispatch, input) => {
34
+ const fire = ($action, $dispatch, input, source, bindings) => {
7
35
  if (!$action || !$dispatch) return;
8
- const payload = input === void 0 ? $action : {
9
- ...$action,
36
+ const action = source && hasFieldReference($action) ? resolveFieldReferences($action, fieldValues(source, bindings)) : $action;
37
+ const payload = input === void 0 ? action : {
38
+ ...action,
10
39
  $input: input
11
40
  };
12
41
  Promise.resolve($dispatch(payload)).catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","names":[],"sources":["../../src/vocabulary/dispatch.ts"],"sourcesContent":["import type { Action } from \"../ir\";\nimport type { GenerativeUIDispatch } from \"../types\";\n\nexport const actionAttr = (a: Action | undefined): string | undefined =>\n a ? JSON.stringify(a) : undefined;\n\n/**\n * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.\n */\nexport const fire = (\n $action: Action | undefined,\n $dispatch: GenerativeUIDispatch | undefined,\n input?: unknown,\n) => {\n if (!$action || !$dispatch) return;\n const payload = input === undefined ? $action : { ...$action, $input: input };\n void Promise.resolve($dispatch(payload)).catch((error) => {\n queueMicrotask(() => {\n throw error;\n });\n });\n};\n"],"mappings":";AAGA,MAAa,cAAc,MACzB,IAAI,KAAK,UAAU,CAAC,IAAI,KAAA;;;;AAK1B,MAAa,QACX,SACA,WACA,UACG;CACH,IAAI,CAAC,WAAW,CAAC,WAAW;CAC5B,MAAM,UAAU,UAAU,KAAA,IAAY,UAAU;EAAE,GAAG;EAAS,QAAQ;CAAM;CAC5E,QAAa,QAAQ,UAAU,OAAO,CAAC,CAAC,CAAC,OAAO,UAAU;EACxD,qBAAqB;GACnB,MAAM;EACR,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"dispatch.js","names":[],"sources":["../../src/vocabulary/dispatch.ts"],"sourcesContent":["import { hasFieldReference, resolveFieldReferences } from \"../fieldReferences\";\nimport type { Action } from \"../ir\";\nimport type { GenerativeUIDispatch } from \"../types\";\nimport type { A2uiBinding } from \"../a2ui/BindingContext\";\nimport { equalData } from \"../a2ui/dataModel\";\nimport { CHECKBOX_GROUP_ATTR, FIELD_NAME_ATTR } from \"../constants\";\nimport {\n collectFormValues,\n type FormControlElementLike,\n} from \"./collectFormValues\";\n\nexport const actionAttr = (a: Action | undefined): string | undefined =>\n a ? JSON.stringify(a) : undefined;\n\nconst fieldValues = (\n source: Element,\n bindings?: ReadonlyMap<string, A2uiBinding>,\n): Record<string, unknown> => {\n const scope = source.closest('form[data-aui], [data-aui=\"root\"]');\n if (!scope) return {};\n const root = scope.closest('[data-aui=\"root\"]');\n const controls = Array.from(\n scope.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\"),\n ).filter((control) => control.closest('[data-aui=\"root\"]') === root);\n const values = collectFormValues(\n controls as ArrayLike<FormControlElementLike>,\n );\n if (!bindings) return values;\n const groups = new Map<string, Map<Element, FormControlElementLike[]>>();\n for (const control of controls) {\n const name = control.getAttribute(FIELD_NAME_ATTR) ?? control.name;\n if (!bindings.has(name)) continue;\n const field =\n groups.get(name) ?? new Map<Element, FormControlElementLike[]>();\n groups.set(name, field);\n const group =\n control.type === \"radio\" || control.hasAttribute(CHECKBOX_GROUP_ATTR)\n ? (control.closest(\"fieldset\") ?? control)\n : control;\n const elements = field.get(group) ?? [];\n elements.push(control);\n field.set(group, elements);\n }\n for (const [name, field] of groups) {\n const candidates = [...field.values()]\n .map((elements) => collectFormValues(elements)[name])\n .filter((value) => value !== undefined);\n if (candidates.length > 0)\n values[name] =\n candidates.find(\n (value) => !equalData(value, bindings.get(name)!.value),\n ) ?? candidates[0];\n }\n return values;\n};\n\n/**\n * Fires `$action` through `$dispatch` when both are present, merging a runtime value into the payload under the reserved `$input` key (not `value`) so the user's input never clobbers a model-supplied `value` field. Each `{ \"$field\": name }` inside `$action` first resolves to the current value of the control with that `name` in the vocabulary form or generative UI root nearest to `source`, collected the way a `Form` collects it; a reference whose control is missing or holds no value resolves to its `fallback`, or is dropped without one. No-op when no registry is wired. The returned promise from an async handler is caught and re-thrown on a microtask so rejections surface rather than going unhandled.\n */\nexport const fire = (\n $action: Action | undefined,\n $dispatch: GenerativeUIDispatch | undefined,\n input?: unknown,\n source?: Element,\n bindings?: ReadonlyMap<string, A2uiBinding>,\n) => {\n if (!$action || !$dispatch) return;\n const action =\n source && hasFieldReference($action)\n ? (resolveFieldReferences(\n $action,\n fieldValues(source, bindings),\n ) as Action)\n : $action;\n const payload = input === undefined ? action : { ...action, $input: input };\n void Promise.resolve($dispatch(payload)).catch((error) => {\n queueMicrotask(() => {\n throw error;\n });\n });\n};\n"],"mappings":";;;;;AAWA,MAAa,cAAc,MACzB,IAAI,KAAK,UAAU,CAAC,IAAI,KAAA;AAE1B,MAAM,eACJ,QACA,aAC4B;CAC5B,MAAM,QAAQ,OAAO,QAAQ,qCAAmC;CAChE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,MAAM,OAAO,MAAM,QAAQ,qBAAmB;CAC9C,MAAM,WAAW,MAAM,KACrB,MAAM,iBAEJ,yBAAyB,CAC7B,CAAC,CAAC,QAAQ,YAAY,QAAQ,QAAQ,qBAAmB,MAAM,IAAI;CACnE,MAAM,SAAS,kBACb,QACF;CACA,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,yBAAS,IAAI,IAAoD;CACvE,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,OAAO,QAAQ,aAAA,qBAA4B,KAAK,QAAQ;EAC9D,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG;EACzB,MAAM,QACJ,OAAO,IAAI,IAAI,qBAAK,IAAI,IAAuC;EACjE,OAAO,IAAI,MAAM,KAAK;EACtB,MAAM,QACJ,QAAQ,SAAS,WAAW,QAAQ,aAAA,yBAAgC,IAC/D,QAAQ,QAAQ,UAAU,KAAK,UAChC;EACN,MAAM,WAAW,MAAM,IAAI,KAAK,KAAK,CAAC;EACtC,SAAS,KAAK,OAAO;EACrB,MAAM,IAAI,OAAO,QAAQ;CAC3B;CACA,KAAK,MAAM,CAAC,MAAM,UAAU,QAAQ;EAClC,MAAM,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CACnC,KAAK,aAAa,kBAAkB,QAAQ,CAAC,CAAC,KAAK,CAAC,CACpD,QAAQ,UAAU,UAAU,KAAA,CAAS;EACxC,IAAI,WAAW,SAAS,GACtB,OAAO,QACL,WAAW,MACR,UAAU,CAAC,UAAU,OAAO,SAAS,IAAI,IAAI,CAAC,CAAE,KAAK,CACxD,KAAK,WAAW;CACtB;CACA,OAAO;AACT;;;;AAKA,MAAa,QACX,SACA,WACA,OACA,QACA,aACG;CACH,IAAI,CAAC,WAAW,CAAC,WAAW;CAC5B,MAAM,SACJ,UAAU,kBAAkB,OAAO,IAC9B,uBACC,SACA,YAAY,QAAQ,QAAQ,CAC9B,IACA;CACN,MAAM,UAAU,UAAU,KAAA,IAAY,SAAS;EAAE,GAAG;EAAQ,QAAQ;CAAM;CAC1E,QAAa,QAAQ,UAAU,OAAO,CAAC,CAAC,CAAC,OAAO,UAAU;EACxD,qBAAqB;GACnB,MAAM;EACR,CAAC;CACH,CAAC;AACH"}
@@ -5,8 +5,15 @@ export declare const factVocabulary: {
5
5
  properties: z.ZodObject<{
6
6
  label: z.ZodString;
7
7
  value: z.ZodString;
8
+ delta: z.ZodOptional<z.ZodString>;
9
+ trend: z.ZodOptional<z.ZodEnum<{
10
+ flat: "flat";
11
+ up: "up";
12
+ down: "down";
13
+ }>>;
14
+ upIsGood: z.ZodOptional<z.ZodBoolean>;
8
15
  }, z.core.$strip>;
9
- render: ({ label, value, children }: any) => import("react").JSX.Element;
16
+ render: ({ label, value, delta, trend, upIsGood, children }: any) => import("react").JSX.Element;
10
17
  };
11
18
  };
12
19
  //# sourceMappingURL=fact.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fact.d.ts","sourceRoot":"","sources":["../../src/vocabulary/fact.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;;;;CAkBI,CAAC"}
1
+ {"version":3,"file":"fact.d.ts","sourceRoot":"","sources":["../../src/vocabulary/fact.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;CAsCI,CAAC"}
@@ -1,23 +1,49 @@
1
1
  import { toTextContent } from "./toTextContent.js";
2
+ import { factTrend, formatFactDelta } from "./formatValue.js";
2
3
  import { jsx, jsxs } from "react/jsx-runtime";
3
4
  import { z } from "zod";
4
5
  //#region src/vocabulary/fact.tsx
6
+ const factTone = (trend, upIsGood) => {
7
+ if (trend === "flat") return "neutral";
8
+ const positive = upIsGood !== false;
9
+ return (trend === "up" ? positive : !positive) ? "good" : "bad";
10
+ };
5
11
  const factVocabulary = { Fact: {
6
12
  description: "A label/value pair, rendered as a key followed by its value. Use for compact metadata.",
7
13
  properties: z.object({
8
14
  label: z.string().describe("The fact label (key)."),
9
- value: z.string().describe("The fact value.")
15
+ value: z.string().describe("The fact value."),
16
+ delta: z.string().optional().describe("Change from before."),
17
+ trend: z.enum([
18
+ "up",
19
+ "down",
20
+ "flat"
21
+ ]).optional().describe("Change direction."),
22
+ upIsGood: z.boolean().optional().describe("Whether up is good.")
10
23
  }),
11
- render: ({ label, value, children }) => /* @__PURE__ */ jsxs("dl", {
12
- "data-aui": "fact",
13
- children: [/* @__PURE__ */ jsx("dt", {
14
- "data-aui": "fact-label",
15
- children: toTextContent(label)
16
- }), /* @__PURE__ */ jsxs("dd", {
17
- "data-aui": "fact-value",
18
- children: [toTextContent(value), children]
19
- })]
20
- })
24
+ render: ({ label, value, delta, trend, upIsGood, children }) => {
25
+ const direction = factTrend(delta, trend);
26
+ const tone = factTone(direction, upIsGood);
27
+ return /* @__PURE__ */ jsxs("dl", {
28
+ "data-aui": "fact",
29
+ children: [/* @__PURE__ */ jsx("dt", {
30
+ "data-aui": "fact-label",
31
+ children: toTextContent(label)
32
+ }), /* @__PURE__ */ jsxs("dd", {
33
+ "data-aui": "fact-value",
34
+ children: [
35
+ toTextContent(value),
36
+ typeof delta === "string" ? /* @__PURE__ */ jsx("span", {
37
+ "data-aui": "fact-delta",
38
+ "data-aui-trend": direction,
39
+ "data-aui-tone": tone,
40
+ children: formatFactDelta(delta, direction)
41
+ }) : null,
42
+ children
43
+ ]
44
+ })]
45
+ });
46
+ }
21
47
  } };
22
48
  //#endregion
23
49
  export { factVocabulary };
@@ -1 +1 @@
1
- {"version":3,"file":"fact.js","names":[],"sources":["../../src/vocabulary/fact.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { toTextContent } from \"./toTextContent\";\n\nexport const factVocabulary = {\n Fact: {\n description:\n \"A label/value pair, rendered as a key followed by its value. Use for compact metadata.\",\n properties: z.object({\n label: z.string().describe(\"The fact label (key).\"),\n value: z.string().describe(\"The fact value.\"),\n }),\n render: ({ label, value, children }) => (\n <dl data-aui=\"fact\">\n <dt data-aui=\"fact-label\">{toTextContent(label)}</dt>\n <dd data-aui=\"fact-value\">\n {toTextContent(value)}\n {children}\n </dd>\n </dl>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAIA,MAAa,iBAAiB,EAC5B,MAAM;CACJ,aACE;CACF,YAAY,EAAE,OAAO;EACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,uBAAuB;EAClD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,iBAAiB;CAC9C,CAAC;CACD,SAAS,EAAE,OAAO,OAAO,eACvB,qBAAC,MAAD;EAAI,YAAS;EAAb,UAAA,CACE,oBAAC,MAAD;GAAI,YAAS;GAAc,UAAA,cAAc,KAAK;EAAM,CAAA,GACpD,qBAAC,MAAD;GAAI,YAAS;GAAb,UAAA,CACG,cAAc,KAAK,GACnB,QACC;EACF,CAAA,CAAA;;AAER,EACF"}
1
+ {"version":3,"file":"fact.js","names":[],"sources":["../../src/vocabulary/fact.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { factTrend, formatFactDelta } from \"./formatValue\";\nimport { toTextContent } from \"./toTextContent\";\n\nconst factTone = (\n trend: \"up\" | \"down\" | \"flat\",\n upIsGood: unknown,\n): \"good\" | \"bad\" | \"neutral\" => {\n if (trend === \"flat\") return \"neutral\";\n const positive = upIsGood !== false;\n const isGood = trend === \"up\" ? positive : !positive;\n return isGood ? \"good\" : \"bad\";\n};\n\nexport const factVocabulary = {\n Fact: {\n description:\n \"A label/value pair, rendered as a key followed by its value. Use for compact metadata.\",\n properties: z.object({\n label: z.string().describe(\"The fact label (key).\"),\n value: z.string().describe(\"The fact value.\"),\n delta: z.string().optional().describe(\"Change from before.\"),\n trend: z\n .enum([\"up\", \"down\", \"flat\"])\n .optional()\n .describe(\"Change direction.\"),\n upIsGood: z.boolean().optional().describe(\"Whether up is good.\"),\n }),\n render: ({ label, value, delta, trend, upIsGood, children }) => {\n const direction = factTrend(delta, trend);\n const tone = factTone(direction, upIsGood);\n\n return (\n <dl data-aui=\"fact\">\n <dt data-aui=\"fact-label\">{toTextContent(label)}</dt>\n <dd data-aui=\"fact-value\">\n {toTextContent(value)}\n {typeof delta === \"string\" ? (\n <span\n data-aui=\"fact-delta\"\n data-aui-trend={direction}\n data-aui-tone={tone}\n >\n {formatFactDelta(delta, direction)}\n </span>\n ) : null}\n {children}\n </dd>\n </dl>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;;AAKA,MAAM,YACJ,OACA,aAC+B;CAC/B,IAAI,UAAU,QAAQ,OAAO;CAC7B,MAAM,WAAW,aAAa;CAE9B,QADe,UAAU,OAAO,WAAW,CAAC,YAC5B,SAAS;AAC3B;AAEA,MAAa,iBAAiB,EAC5B,MAAM;CACJ,aACE;CACF,YAAY,EAAE,OAAO;EACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,uBAAuB;EAClD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,iBAAiB;EAC5C,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,qBAAqB;EAC3D,OAAO,EACJ,KAAK;GAAC;GAAM;GAAQ;EAAM,CAAC,CAAC,CAC5B,SAAS,CAAC,CACV,SAAS,mBAAmB;EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,qBAAqB;CACjE,CAAC;CACD,SAAS,EAAE,OAAO,OAAO,OAAO,OAAO,UAAU,eAAe;EAC9D,MAAM,YAAY,UAAU,OAAO,KAAK;EACxC,MAAM,OAAO,SAAS,WAAW,QAAQ;EAEzC,OACE,qBAAC,MAAD;GAAI,YAAS;GAAb,UAAA,CACE,oBAAC,MAAD;IAAI,YAAS;IAAc,UAAA,cAAc,KAAK;GAAM,CAAA,GACpD,qBAAC,MAAD;IAAI,YAAS;IAAb,UAAA;KACG,cAAc,KAAK;KACnB,OAAO,UAAU,WAChB,oBAAC,QAAD;MACE,YAAS;MACT,kBAAgB;MAChB,iBAAe;MAEd,UAAA,gBAAgB,OAAO,SAAS;KAC7B,CAAA,IACJ;KACH;IACC;GACF,CAAA,CAAA;;CAER;AACF,EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/vocabulary/form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc;;;;;;;;CA4BI,CAAC"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/vocabulary/form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc;;;;;;;;CAiCI,CAAC"}
@@ -1,10 +1,10 @@
1
- import { actionAttr, fire } from "./dispatch.js";
2
1
  import { collectFormValuesFromEvent } from "./collectFormValues.js";
2
+ import { actionAttr, fire } from "./dispatch.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { z } from "zod";
5
5
  //#region src/vocabulary/form.tsx
6
6
  const formVocabulary = { Form: {
7
- description: "Wraps named child controls (Select/Input/Checkbox/RadioGroup/DatePicker with a `name`). Carries `$action`; on submit it fires with every named control's value, keyed by `name`.",
7
+ description: "Wraps named child controls (Select/Input/Checkbox/RadioGroup/CheckboxGroup/DatePicker with a `name`). Carries `$action`; on submit it fires with every named control's value, keyed by `name`.",
8
8
  properties: z.object({ gap: z.number().min(0).max(8).optional().describe("Gap between children in 4px units. 0 to 8 is the supported range.") }),
9
9
  render: ({ gap, $action, $dispatch, children }) => /* @__PURE__ */ jsx("form", {
10
10
  "data-aui": "form",
@@ -12,7 +12,7 @@ const formVocabulary = { Form: {
12
12
  "data-aui-action": actionAttr($action),
13
13
  onSubmit: (event) => {
14
14
  event.preventDefault();
15
- fire($action, $dispatch, collectFormValuesFromEvent(event));
15
+ fire($action, $dispatch, collectFormValuesFromEvent(event), event.currentTarget);
16
16
  },
17
17
  children
18
18
  })
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","names":[],"sources":["../../src/vocabulary/form.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { actionAttr, fire } from \"./dispatch\";\nimport { collectFormValuesFromEvent } from \"./collectFormValues\";\n\nexport const formVocabulary = {\n Form: {\n description:\n \"Wraps named child controls (Select/Input/Checkbox/RadioGroup/DatePicker with a `name`). Carries `$action`; on submit it fires with every named control's value, keyed by `name`.\",\n properties: z.object({\n gap: z\n .number()\n .min(0)\n .max(8)\n .optional()\n .describe(\n \"Gap between children in 4px units. 0 to 8 is the supported range.\",\n ),\n }),\n render: ({ gap, $action, $dispatch, children }) => (\n <form\n data-aui=\"form\"\n data-aui-gap={gap}\n data-aui-action={actionAttr($action)}\n onSubmit={(event) => {\n event.preventDefault();\n fire($action, $dispatch, collectFormValuesFromEvent(event));\n }}\n >\n {children}\n </form>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;;AAKA,MAAa,iBAAiB,EAC5B,MAAM;CACJ,aACE;CACF,YAAY,EAAE,OAAO,EACnB,KAAK,EACF,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SACC,mEACF,EACJ,CAAC;CACD,SAAS,EAAE,KAAK,SAAS,WAAW,eAClC,oBAAC,QAAD;EACE,YAAS;EACT,gBAAc;EACd,mBAAiB,WAAW,OAAO;EACnC,WAAW,UAAU;GACnB,MAAM,eAAe;GACrB,KAAK,SAAS,WAAW,2BAA2B,KAAK,CAAC;EAC5D;EAEC;CACG,CAAA;AAEV,EACF"}
1
+ {"version":3,"file":"form.js","names":[],"sources":["../../src/vocabulary/form.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { actionAttr, fire } from \"./dispatch\";\nimport { collectFormValuesFromEvent } from \"./collectFormValues\";\n\nexport const formVocabulary = {\n Form: {\n description:\n \"Wraps named child controls (Select/Input/Checkbox/RadioGroup/CheckboxGroup/DatePicker with a `name`). Carries `$action`; on submit it fires with every named control's value, keyed by `name`.\",\n properties: z.object({\n gap: z\n .number()\n .min(0)\n .max(8)\n .optional()\n .describe(\n \"Gap between children in 4px units. 0 to 8 is the supported range.\",\n ),\n }),\n render: ({ gap, $action, $dispatch, children }) => (\n <form\n data-aui=\"form\"\n data-aui-gap={gap}\n data-aui-action={actionAttr($action)}\n onSubmit={(event) => {\n event.preventDefault();\n fire(\n $action,\n $dispatch,\n collectFormValuesFromEvent(event),\n event.currentTarget,\n );\n }}\n >\n {children}\n </form>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;;AAKA,MAAa,iBAAiB,EAC5B,MAAM;CACJ,aACE;CACF,YAAY,EAAE,OAAO,EACnB,KAAK,EACF,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SACC,mEACF,EACJ,CAAC;CACD,SAAS,EAAE,KAAK,SAAS,WAAW,eAClC,oBAAC,QAAD;EACE,YAAS;EACT,gBAAc;EACd,mBAAiB,WAAW,OAAO;EACnC,WAAW,UAAU;GACnB,MAAM,eAAe;GACrB,KACE,SACA,WACA,2BAA2B,KAAK,GAChC,MAAM,aACR;EACF;EAEC;CACG,CAAA;AAEV,EACF"}
@@ -0,0 +1,7 @@
1
+ type FactTrend = "up" | "down" | "flat";
2
+ export declare const factTrend: (delta: unknown, trend: unknown) => FactTrend;
3
+ export declare const formatFactDelta: (delta: string, trend: FactTrend) => string;
4
+ export declare const isNumericTableFormat: (format: unknown) => boolean;
5
+ export declare const formatValue: (value: unknown, format: unknown) => string;
6
+ export {};
7
+ //# sourceMappingURL=formatValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatValue.d.ts","sourceRoot":"","sources":["../../src/vocabulary/formatValue.ts"],"names":[],"mappings":"AAWA,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAsDxC,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,EAAE,OAAO,OAAO,KAAG,SAM1D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,OAAO,SAAS,KAAG,MASjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,OAAO,KAAG,OACN,CAAC;AAElD,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,QAAQ,OAAO,KAAG,MAuC7D,CAAC"}
@@ -0,0 +1,76 @@
1
+ //#region src/vocabulary/formatValue.ts
2
+ const DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
3
+ const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
4
+ const toRawText = (value) => typeof value === "string" || typeof value === "number" || typeof value === "boolean" ? String(value) : "";
5
+ const isTableFormat = (format) => format !== null && typeof format === "object" && "kind" in format && (format.kind === "number" || format.kind === "currency" || format.kind === "percent" || format.kind === "date");
6
+ const fractionDigits = (decimals) => {
7
+ if (typeof decimals !== "number" || !Number.isFinite(decimals)) return;
8
+ return Math.min(20, Math.max(0, Math.trunc(decimals)));
9
+ };
10
+ const isCalendarDate = (value) => {
11
+ const [year, month, day] = value.slice(0, 10).split("-").map(Number);
12
+ if (year === void 0 || month === void 0 || day === void 0) return false;
13
+ const daysInMonth = month === 2 ? year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28 : [
14
+ 4,
15
+ 6,
16
+ 9,
17
+ 11
18
+ ].includes(month) ? 30 : 31;
19
+ return month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth;
20
+ };
21
+ const dateFromValue = (value) => {
22
+ if (typeof value === "number") {
23
+ const date = new Date(value);
24
+ return Number.isNaN(date.getTime()) ? void 0 : date;
25
+ }
26
+ if (typeof value !== "string" || !ISO_DATE_PATTERN.test(value)) return;
27
+ if (!isCalendarDate(value)) return void 0;
28
+ const date = new Date(value);
29
+ return Number.isNaN(date.getTime()) ? void 0 : date;
30
+ };
31
+ const factTrend = (delta, trend) => {
32
+ if (trend === "down" || trend === "flat" || trend === "up") return trend;
33
+ if (typeof delta === "string" && /\d/.test(delta) && !/[1-9]/.test(delta)) return "flat";
34
+ return typeof delta === "string" && /^[-\u2212]/.test(delta) ? "down" : "up";
35
+ };
36
+ const formatFactDelta = (delta, trend) => {
37
+ return `${trend === "up" ? "↑" : trend === "down" ? "↓" : "→"} ${trend === "up" ? delta.replace(/^\+/, "") : trend === "down" ? delta.replace(/^[-\u2212]/, "") : delta}`;
38
+ };
39
+ const isNumericTableFormat = (format) => isTableFormat(format) && format.kind !== "date";
40
+ const formatValue = (value, format) => {
41
+ const raw = toRawText(value);
42
+ try {
43
+ if (!isTableFormat(format)) return raw;
44
+ if (format.kind === "date") {
45
+ const date = dateFromValue(value);
46
+ return date === void 0 ? raw : new Intl.DateTimeFormat("en-US", {
47
+ dateStyle: "medium",
48
+ ...typeof value === "string" && DATE_ONLY_PATTERN.test(value) ? { timeZone: "UTC" } : {}
49
+ }).format(date);
50
+ }
51
+ if (typeof value !== "number") return raw;
52
+ const decimals = fractionDigits(format.decimals);
53
+ const digitOptions = decimals === void 0 ? {} : {
54
+ minimumFractionDigits: decimals,
55
+ maximumFractionDigits: decimals
56
+ };
57
+ if (format.kind === "currency") {
58
+ if (typeof format.currency !== "string") return raw;
59
+ return new Intl.NumberFormat("en-US", {
60
+ ...digitOptions,
61
+ style: "currency",
62
+ currency: format.currency
63
+ }).format(value);
64
+ }
65
+ return new Intl.NumberFormat("en-US", {
66
+ ...digitOptions,
67
+ ...format.kind === "percent" ? { style: "percent" } : {}
68
+ }).format(value);
69
+ } catch {
70
+ return raw;
71
+ }
72
+ };
73
+ //#endregion
74
+ export { factTrend, formatFactDelta, formatValue, isNumericTableFormat };
75
+
76
+ //# sourceMappingURL=formatValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatValue.js","names":[],"sources":["../../src/vocabulary/formatValue.ts"],"sourcesContent":["type TableFormat = {\n kind: \"number\" | \"currency\" | \"percent\" | \"date\";\n currency?: string;\n decimals?: number;\n};\n\nconst DATE_ONLY_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst ISO_DATE_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\ntype FactTrend = \"up\" | \"down\" | \"flat\";\n\nconst toRawText = (value: unknown): string =>\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ? String(value)\n : \"\";\n\nconst isTableFormat = (format: unknown): format is TableFormat =>\n format !== null &&\n typeof format === \"object\" &&\n \"kind\" in format &&\n (format.kind === \"number\" ||\n format.kind === \"currency\" ||\n format.kind === \"percent\" ||\n format.kind === \"date\");\n\nconst fractionDigits = (decimals: unknown): number | undefined => {\n if (typeof decimals !== \"number\" || !Number.isFinite(decimals)) {\n return undefined;\n }\n return Math.min(20, Math.max(0, Math.trunc(decimals)));\n};\n\nconst isCalendarDate = (value: string): boolean => {\n const [year, month, day] = value.slice(0, 10).split(\"-\").map(Number);\n if (year === undefined || month === undefined || day === undefined) {\n return false;\n }\n const daysInMonth =\n month === 2\n ? year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)\n ? 29\n : 28\n : [4, 6, 9, 11].includes(month)\n ? 30\n : 31;\n return month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth;\n};\n\nconst dateFromValue = (value: unknown): Date | undefined => {\n if (typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date;\n }\n if (typeof value !== \"string\" || !ISO_DATE_PATTERN.test(value)) {\n return undefined;\n }\n if (!isCalendarDate(value)) return undefined;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date;\n};\n\nexport const factTrend = (delta: unknown, trend: unknown): FactTrend => {\n if (trend === \"down\" || trend === \"flat\" || trend === \"up\") return trend;\n if (typeof delta === \"string\" && /\\d/.test(delta) && !/[1-9]/.test(delta)) {\n return \"flat\";\n }\n return typeof delta === \"string\" && /^[-\\u2212]/.test(delta) ? \"down\" : \"up\";\n};\n\nexport const formatFactDelta = (delta: string, trend: FactTrend): string => {\n const arrow = trend === \"up\" ? \"↑\" : trend === \"down\" ? \"↓\" : \"→\";\n const text =\n trend === \"up\"\n ? delta.replace(/^\\+/, \"\")\n : trend === \"down\"\n ? delta.replace(/^[-\\u2212]/, \"\")\n : delta;\n return `${arrow} ${text}`;\n};\n\nexport const isNumericTableFormat = (format: unknown): boolean =>\n isTableFormat(format) && format.kind !== \"date\";\n\nexport const formatValue = (value: unknown, format: unknown): string => {\n const raw = toRawText(value);\n try {\n if (!isTableFormat(format)) return raw;\n\n if (format.kind === \"date\") {\n const date = dateFromValue(value);\n return date === undefined\n ? raw\n : new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n ...(typeof value === \"string\" && DATE_ONLY_PATTERN.test(value)\n ? { timeZone: \"UTC\" }\n : {}),\n }).format(date);\n }\n\n if (typeof value !== \"number\") return raw;\n\n const decimals = fractionDigits(format.decimals);\n const digitOptions =\n decimals === undefined\n ? {}\n : { minimumFractionDigits: decimals, maximumFractionDigits: decimals };\n if (format.kind === \"currency\") {\n if (typeof format.currency !== \"string\") return raw;\n return new Intl.NumberFormat(\"en-US\", {\n ...digitOptions,\n style: \"currency\",\n currency: format.currency,\n }).format(value);\n }\n return new Intl.NumberFormat(\"en-US\", {\n ...digitOptions,\n ...(format.kind === \"percent\" ? { style: \"percent\" } : {}),\n }).format(value);\n } catch {\n return raw;\n }\n};\n"],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare const iconVocabulary: {
4
4
  description: string;
5
5
  properties: z.ZodObject<{
6
6
  name: z.ZodEnum<{
7
+ search: "search";
7
8
  sun: "sun";
8
9
  moon: "moon";
9
10
  cloud: "cloud";
@@ -26,7 +27,6 @@ export declare const iconVocabulary: {
26
27
  truck: "truck";
27
28
  "credit-card": "credit-card";
28
29
  user: "user";
29
- search: "search";
30
30
  bell: "bell";
31
31
  }>;
32
32
  size: z.ZodOptional<z.ZodEnum<{