@assistant-ui/react-generative-ui 0.0.23 → 0.1.0

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 (338) hide show
  1. package/README.md +2 -0
  2. package/dist/a2ui.d.ts +1 -4
  3. package/dist/a2ui.d.ts.map +1 -1
  4. package/dist/a2ui.js +1 -4
  5. package/dist/index.d.ts +1 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -10
  8. package/dist/index.server.d.ts +1 -2
  9. package/dist/index.server.d.ts.map +1 -1
  10. package/dist/index.server.js +1 -10
  11. package/dist/ir.d.ts +1 -111
  12. package/dist/ir.d.ts.map +1 -1
  13. package/dist/ir.js +1 -175
  14. package/dist/slack.d.ts +1 -4
  15. package/dist/slack.d.ts.map +1 -1
  16. package/dist/slack.js +1 -4
  17. package/dist/teams.d.ts +1 -4
  18. package/dist/teams.d.ts.map +1 -1
  19. package/dist/teams.js +1 -4
  20. package/package.json +5 -5
  21. package/src/a2ui.ts +1 -22
  22. package/src/index.server.ts +1 -2
  23. package/src/index.test.ts +75 -0
  24. package/src/index.ts +1 -2
  25. package/src/ir.ts +1 -279
  26. package/src/slack.ts +1 -39
  27. package/src/teams.ts +1 -35
  28. package/dist/JSONGenerativeUI.client.d.ts +0 -28
  29. package/dist/JSONGenerativeUI.client.d.ts.map +0 -1
  30. package/dist/JSONGenerativeUI.client.js +0 -101
  31. package/dist/JSONGenerativeUI.client.js.map +0 -1
  32. package/dist/JSONGenerativeUI.server.d.ts +0 -21
  33. package/dist/JSONGenerativeUI.server.d.ts.map +0 -1
  34. package/dist/JSONGenerativeUI.server.js +0 -32
  35. package/dist/JSONGenerativeUI.server.js.map +0 -1
  36. package/dist/JSONGenerativeUI.shared.d.ts +0 -63
  37. package/dist/JSONGenerativeUI.shared.d.ts.map +0 -1
  38. package/dist/JSONGenerativeUI.shared.js +0 -31
  39. package/dist/JSONGenerativeUI.shared.js.map +0 -1
  40. package/dist/RadioGroupScope.d.ts +0 -6
  41. package/dist/RadioGroupScope.d.ts.map +0 -1
  42. package/dist/RadioGroupScope.js +0 -25
  43. package/dist/RadioGroupScope.js.map +0 -1
  44. package/dist/a2ui/BindingContext.d.ts +0 -11
  45. package/dist/a2ui/BindingContext.d.ts.map +0 -1
  46. package/dist/a2ui/BindingContext.js +0 -12
  47. package/dist/a2ui/BindingContext.js.map +0 -1
  48. package/dist/a2ui/PresentRenderer.d.ts +0 -11
  49. package/dist/a2ui/PresentRenderer.d.ts.map +0 -1
  50. package/dist/a2ui/PresentRenderer.js +0 -39
  51. package/dist/a2ui/PresentRenderer.js.map +0 -1
  52. package/dist/a2ui/convert.d.ts +0 -15
  53. package/dist/a2ui/convert.d.ts.map +0 -1
  54. package/dist/a2ui/convert.js +0 -728
  55. package/dist/a2ui/convert.js.map +0 -1
  56. package/dist/a2ui/dataModel.d.ts +0 -9
  57. package/dist/a2ui/dataModel.d.ts.map +0 -1
  58. package/dist/a2ui/dataModel.js +0 -44
  59. package/dist/a2ui/dataModel.js.map +0 -1
  60. package/dist/a2ui/reducer.d.ts +0 -8
  61. package/dist/a2ui/reducer.d.ts.map +0 -1
  62. package/dist/a2ui/reducer.js +0 -242
  63. package/dist/a2ui/reducer.js.map +0 -1
  64. package/dist/a2ui/snapshot.d.ts +0 -3
  65. package/dist/a2ui/snapshot.d.ts.map +0 -1
  66. package/dist/a2ui/snapshot.js +0 -33
  67. package/dist/a2ui/snapshot.js.map +0 -1
  68. package/dist/a2ui/types.d.ts +0 -88
  69. package/dist/a2ui/types.d.ts.map +0 -1
  70. package/dist/a2ui/types.js +0 -6
  71. package/dist/a2ui/types.js.map +0 -1
  72. package/dist/a2ui/valueFunctions.d.ts +0 -16
  73. package/dist/a2ui/valueFunctions.d.ts.map +0 -1
  74. package/dist/a2ui/valueFunctions.js +0 -332
  75. package/dist/a2ui/valueFunctions.js.map +0 -1
  76. package/dist/actionRegistry.d.ts +0 -29
  77. package/dist/actionRegistry.d.ts.map +0 -1
  78. package/dist/actionRegistry.js +0 -41
  79. package/dist/actionRegistry.js.map +0 -1
  80. package/dist/answeredValues.d.ts +0 -16
  81. package/dist/answeredValues.d.ts.map +0 -1
  82. package/dist/answeredValues.js +0 -37
  83. package/dist/answeredValues.js.map +0 -1
  84. package/dist/buildPresentParameters.d.ts +0 -21
  85. package/dist/buildPresentParameters.d.ts.map +0 -1
  86. package/dist/buildPresentParameters.js +0 -95
  87. package/dist/buildPresentParameters.js.map +0 -1
  88. package/dist/constants.d.ts +0 -15
  89. package/dist/constants.d.ts.map +0 -1
  90. package/dist/constants.js +0 -19
  91. package/dist/constants.js.map +0 -1
  92. package/dist/convert/boundSpec.d.ts +0 -48
  93. package/dist/convert/boundSpec.d.ts.map +0 -1
  94. package/dist/convert/boundSpec.js +0 -108
  95. package/dist/convert/boundSpec.js.map +0 -1
  96. package/dist/convert/copyBounded.d.ts +0 -25
  97. package/dist/convert/copyBounded.d.ts.map +0 -1
  98. package/dist/convert/copyBounded.js +0 -38
  99. package/dist/convert/copyBounded.js.map +0 -1
  100. package/dist/convert/isElement.d.ts +0 -3
  101. package/dist/convert/isElement.d.ts.map +0 -1
  102. package/dist/convert/isElement.js +0 -6
  103. package/dist/convert/isElement.js.map +0 -1
  104. package/dist/convert/takeRun.d.ts +0 -6
  105. package/dist/convert/takeRun.d.ts.map +0 -1
  106. package/dist/convert/takeRun.js +0 -20
  107. package/dist/convert/takeRun.js.map +0 -1
  108. package/dist/defineGenerativeComponents.d.ts +0 -29
  109. package/dist/defineGenerativeComponents.d.ts.map +0 -1
  110. package/dist/defineGenerativeComponents.js +0 -34
  111. package/dist/defineGenerativeComponents.js.map +0 -1
  112. package/dist/fieldReferences.d.ts +0 -9
  113. package/dist/fieldReferences.d.ts.map +0 -1
  114. package/dist/fieldReferences.js +0 -53
  115. package/dist/fieldReferences.js.map +0 -1
  116. package/dist/generativeUIToJSX.d.ts +0 -18
  117. package/dist/generativeUIToJSX.d.ts.map +0 -1
  118. package/dist/generativeUIToJSX.js +0 -76
  119. package/dist/generativeUIToJSX.js.map +0 -1
  120. package/dist/index.shared.d.ts +0 -15
  121. package/dist/index.shared.d.ts.map +0 -1
  122. package/dist/index.shared.js +0 -9
  123. package/dist/ir.js.map +0 -1
  124. package/dist/renderGenerativeUI.d.ts +0 -14
  125. package/dist/renderGenerativeUI.d.ts.map +0 -1
  126. package/dist/renderGenerativeUI.js +0 -83
  127. package/dist/renderGenerativeUI.js.map +0 -1
  128. package/dist/scopeSchema.d.ts +0 -6
  129. package/dist/scopeSchema.d.ts.map +0 -1
  130. package/dist/scopeSchema.js +0 -56
  131. package/dist/scopeSchema.js.map +0 -1
  132. package/dist/slack/constants.d.ts +0 -93
  133. package/dist/slack/constants.d.ts.map +0 -1
  134. package/dist/slack/constants.js +0 -146
  135. package/dist/slack/constants.js.map +0 -1
  136. package/dist/slack/decodeBlockAction.d.ts +0 -10
  137. package/dist/slack/decodeBlockAction.d.ts.map +0 -1
  138. package/dist/slack/decodeBlockAction.js +0 -129
  139. package/dist/slack/decodeBlockAction.js.map +0 -1
  140. package/dist/slack/fromSlackBlocks.d.ts +0 -27
  141. package/dist/slack/fromSlackBlocks.d.ts.map +0 -1
  142. package/dist/slack/fromSlackBlocks.js +0 -483
  143. package/dist/slack/fromSlackBlocks.js.map +0 -1
  144. package/dist/slack/toSlackBlocks.d.ts +0 -4
  145. package/dist/slack/toSlackBlocks.d.ts.map +0 -1
  146. package/dist/slack/toSlackBlocks.js +0 -901
  147. package/dist/slack/toSlackBlocks.js.map +0 -1
  148. package/dist/slack/types.d.ts +0 -204
  149. package/dist/slack/types.d.ts.map +0 -1
  150. package/dist/slack/types.js +0 -0
  151. package/dist/teams/constants.d.ts +0 -34
  152. package/dist/teams/constants.d.ts.map +0 -1
  153. package/dist/teams/constants.js +0 -68
  154. package/dist/teams/constants.js.map +0 -1
  155. package/dist/teams/decodeSubmitData.d.ts +0 -26
  156. package/dist/teams/decodeSubmitData.d.ts.map +0 -1
  157. package/dist/teams/decodeSubmitData.js +0 -70
  158. package/dist/teams/decodeSubmitData.js.map +0 -1
  159. package/dist/teams/temporalId.d.ts +0 -5
  160. package/dist/teams/temporalId.d.ts.map +0 -1
  161. package/dist/teams/temporalId.js +0 -28
  162. package/dist/teams/temporalId.js.map +0 -1
  163. package/dist/teams/toAdaptiveCard.d.ts +0 -45
  164. package/dist/teams/toAdaptiveCard.d.ts.map +0 -1
  165. package/dist/teams/toAdaptiveCard.js +0 -642
  166. package/dist/teams/toAdaptiveCard.js.map +0 -1
  167. package/dist/teams/toTeamsAttachments.d.ts +0 -10
  168. package/dist/teams/toTeamsAttachments.d.ts.map +0 -1
  169. package/dist/teams/toTeamsAttachments.js +0 -99
  170. package/dist/teams/toTeamsAttachments.js.map +0 -1
  171. package/dist/teams/types.d.ts +0 -224
  172. package/dist/teams/types.d.ts.map +0 -1
  173. package/dist/teams/types.js +0 -0
  174. package/dist/temporal.d.ts +0 -33
  175. package/dist/temporal.d.ts.map +0 -1
  176. package/dist/temporal.js +0 -152
  177. package/dist/temporal.js.map +0 -1
  178. package/dist/types.d.ts +0 -99
  179. package/dist/types.d.ts.map +0 -1
  180. package/dist/types.js +0 -0
  181. package/dist/vocabulary/alert.d.ts +0 -32
  182. package/dist/vocabulary/alert.d.ts.map +0 -1
  183. package/dist/vocabulary/alert.js +0 -160
  184. package/dist/vocabulary/alert.js.map +0 -1
  185. package/dist/vocabulary/collectFormValues.d.ts +0 -23
  186. package/dist/vocabulary/collectFormValues.d.ts.map +0 -1
  187. package/dist/vocabulary/collectFormValues.js +0 -44
  188. package/dist/vocabulary/collectFormValues.js.map +0 -1
  189. package/dist/vocabulary/data.d.ts +0 -66
  190. package/dist/vocabulary/data.d.ts.map +0 -1
  191. package/dist/vocabulary/data.js +0 -503
  192. package/dist/vocabulary/data.js.map +0 -1
  193. package/dist/vocabulary/dispatch.d.ts +0 -9
  194. package/dist/vocabulary/dispatch.d.ts.map +0 -1
  195. package/dist/vocabulary/dispatch.js +0 -50
  196. package/dist/vocabulary/dispatch.js.map +0 -1
  197. package/dist/vocabulary/fact.d.ts +0 -19
  198. package/dist/vocabulary/fact.d.ts.map +0 -1
  199. package/dist/vocabulary/fact.js +0 -51
  200. package/dist/vocabulary/fact.js.map +0 -1
  201. package/dist/vocabulary/form.d.ts +0 -11
  202. package/dist/vocabulary/form.d.ts.map +0 -1
  203. package/dist/vocabulary/form.js +0 -23
  204. package/dist/vocabulary/form.js.map +0 -1
  205. package/dist/vocabulary/formatValue.d.ts +0 -7
  206. package/dist/vocabulary/formatValue.d.ts.map +0 -1
  207. package/dist/vocabulary/formatValue.js +0 -76
  208. package/dist/vocabulary/formatValue.js.map +0 -1
  209. package/dist/vocabulary/icon.d.ts +0 -41
  210. package/dist/vocabulary/icon.d.ts.map +0 -1
  211. package/dist/vocabulary/icon.js +0 -272
  212. package/dist/vocabulary/icon.js.map +0 -1
  213. package/dist/vocabulary/index.d.ts +0 -12
  214. package/dist/vocabulary/index.d.ts.map +0 -1
  215. package/dist/vocabulary/index.js +0 -36
  216. package/dist/vocabulary/index.js.map +0 -1
  217. package/dist/vocabulary/interactive.d.ts +0 -230
  218. package/dist/vocabulary/interactive.d.ts.map +0 -1
  219. package/dist/vocabulary/interactive.js +0 -530
  220. package/dist/vocabulary/interactive.js.map +0 -1
  221. package/dist/vocabulary/layout.d.ts +0 -79
  222. package/dist/vocabulary/layout.d.ts.map +0 -1
  223. package/dist/vocabulary/layout.js +0 -139
  224. package/dist/vocabulary/layout.js.map +0 -1
  225. package/dist/vocabulary/list.d.ts +0 -14
  226. package/dist/vocabulary/list.d.ts.map +0 -1
  227. package/dist/vocabulary/list.js +0 -50
  228. package/dist/vocabulary/list.js.map +0 -1
  229. package/dist/vocabulary/media.d.ts +0 -25
  230. package/dist/vocabulary/media.d.ts.map +0 -1
  231. package/dist/vocabulary/media.js +0 -42
  232. package/dist/vocabulary/media.js.map +0 -1
  233. package/dist/vocabulary/text.d.ts +0 -57
  234. package/dist/vocabulary/text.d.ts.map +0 -1
  235. package/dist/vocabulary/text.js +0 -49
  236. package/dist/vocabulary/text.js.map +0 -1
  237. package/dist/vocabulary/toTextContent.d.ts +0 -2
  238. package/dist/vocabulary/toTextContent.d.ts.map +0 -1
  239. package/dist/vocabulary/toTextContent.js +0 -6
  240. package/dist/vocabulary/toTextContent.js.map +0 -1
  241. package/src/JSONGenerativeUI.client.tsx +0 -168
  242. package/src/JSONGenerativeUI.server.tsx +0 -39
  243. package/src/JSONGenerativeUI.shared.ts +0 -90
  244. package/src/JSONGenerativeUI.test.tsx +0 -1298
  245. package/src/RadioGroupScope.server.test.tsx +0 -24
  246. package/src/RadioGroupScope.tsx +0 -34
  247. package/src/a2ui/BindingContext.ts +0 -26
  248. package/src/a2ui/PresentRenderer.tsx +0 -83
  249. package/src/a2ui/convert.test.ts +0 -2923
  250. package/src/a2ui/convert.ts +0 -1207
  251. package/src/a2ui/dataModel.ts +0 -69
  252. package/src/a2ui/reducer.test.ts +0 -422
  253. package/src/a2ui/reducer.ts +0 -363
  254. package/src/a2ui/snapshot.test.ts +0 -52
  255. package/src/a2ui/snapshot.ts +0 -52
  256. package/src/a2ui/types.ts +0 -114
  257. package/src/a2ui/valueFunctions.test.ts +0 -271
  258. package/src/a2ui/valueFunctions.ts +0 -523
  259. package/src/actionRegistry.test.ts +0 -90
  260. package/src/actionRegistry.ts +0 -88
  261. package/src/answeredValues.test.ts +0 -33
  262. package/src/answeredValues.tsx +0 -70
  263. package/src/buildPresentParameters.test.ts +0 -246
  264. package/src/buildPresentParameters.ts +0 -130
  265. package/src/constants.ts +0 -17
  266. package/src/convert/boundSpec.test.ts +0 -192
  267. package/src/convert/boundSpec.ts +0 -134
  268. package/src/convert/copyBounded.test.ts +0 -131
  269. package/src/convert/copyBounded.ts +0 -38
  270. package/src/convert/isElement.ts +0 -6
  271. package/src/convert/takeRun.test.ts +0 -64
  272. package/src/convert/takeRun.ts +0 -19
  273. package/src/defineGenerativeComponents.ts +0 -38
  274. package/src/fieldReferences.test.ts +0 -66
  275. package/src/fieldReferences.ts +0 -83
  276. package/src/generativeUIToJSX.test.ts +0 -268
  277. package/src/generativeUIToJSX.ts +0 -152
  278. package/src/index.server.test.ts +0 -106
  279. package/src/index.shared.ts +0 -61
  280. package/src/ir.test.ts +0 -203
  281. package/src/renderGenerativeUI.test.tsx +0 -373
  282. package/src/renderGenerativeUI.tsx +0 -165
  283. package/src/scopeSchema.test.ts +0 -72
  284. package/src/scopeSchema.ts +0 -71
  285. package/src/slack/a2uiSlack.test.ts +0 -198
  286. package/src/slack/constants.ts +0 -194
  287. package/src/slack/datePicker.test.ts +0 -612
  288. package/src/slack/decodeBlockAction.test.ts +0 -233
  289. package/src/slack/decodeBlockAction.ts +0 -232
  290. package/src/slack/fromSlackBlocks.test.ts +0 -1465
  291. package/src/slack/fromSlackBlocks.ts +0 -789
  292. package/src/slack/toSlackBlocks.test.ts +0 -3065
  293. package/src/slack/toSlackBlocks.ts +0 -1818
  294. package/src/slack/types.ts +0 -264
  295. package/src/teams/constants.ts +0 -93
  296. package/src/teams/decodeSubmitData.test.ts +0 -397
  297. package/src/teams/decodeSubmitData.ts +0 -110
  298. package/src/teams/temporal.test.ts +0 -766
  299. package/src/teams/temporalId.ts +0 -56
  300. package/src/teams/toAdaptiveCard.test.ts +0 -1897
  301. package/src/teams/toAdaptiveCard.ts +0 -1057
  302. package/src/teams/toTeamsAttachments.test.ts +0 -74
  303. package/src/teams/toTeamsAttachments.ts +0 -133
  304. package/src/teams/types.ts +0 -266
  305. package/src/temporal.test.ts +0 -319
  306. package/src/temporal.ts +0 -259
  307. package/src/types.ts +0 -119
  308. package/src/vocabulary/alert.test.tsx +0 -427
  309. package/src/vocabulary/alert.tsx +0 -217
  310. package/src/vocabulary/collectFormValues.test.ts +0 -389
  311. package/src/vocabulary/collectFormValues.ts +0 -116
  312. package/src/vocabulary/data.test.tsx +0 -858
  313. package/src/vocabulary/data.tsx +0 -819
  314. package/src/vocabulary/datepicker.dom.test.tsx +0 -1148
  315. package/src/vocabulary/dispatch.ts +0 -83
  316. package/src/vocabulary/fact.test.tsx +0 -94
  317. package/src/vocabulary/fact.tsx +0 -54
  318. package/src/vocabulary/form.test.tsx +0 -113
  319. package/src/vocabulary/form.tsx +0 -39
  320. package/src/vocabulary/formatValue.test.ts +0 -72
  321. package/src/vocabulary/formatValue.ts +0 -127
  322. package/src/vocabulary/icon.test.tsx +0 -64
  323. package/src/vocabulary/icon.tsx +0 -174
  324. package/src/vocabulary/index.test.ts +0 -65
  325. package/src/vocabulary/index.ts +0 -33
  326. package/src/vocabulary/interactive.dispatch.test.tsx +0 -454
  327. package/src/vocabulary/interactive.dom.test.tsx +0 -1747
  328. package/src/vocabulary/interactive.test.tsx +0 -377
  329. package/src/vocabulary/interactive.tsx +0 -1048
  330. package/src/vocabulary/layout.test.tsx +0 -323
  331. package/src/vocabulary/layout.tsx +0 -247
  332. package/src/vocabulary/list.test.tsx +0 -222
  333. package/src/vocabulary/list.tsx +0 -50
  334. package/src/vocabulary/media.test.tsx +0 -85
  335. package/src/vocabulary/media.tsx +0 -56
  336. package/src/vocabulary/text.test.tsx +0 -102
  337. package/src/vocabulary/text.tsx +0 -60
  338. package/src/vocabulary/toTextContent.ts +0 -2
@@ -1,530 +0,0 @@
1
- import { useRadioGroupName } from "../RadioGroupScope.js";
2
- import { CHECKBOX_GROUP_ATTR, FIELD_NAME_ATTR, FIELD_VALUE_ATTR, GENERATED_NAME_ATTR } from "../constants.js";
3
- import { BUTTON_STYLES } from "../ir.js";
4
- import { A2uiBindingContext, useA2uiBinding } from "../a2ui/BindingContext.js";
5
- import { classifyTemporal, fromLocalDateTime, getTemporalInputStep, normalizeTemporalInputValue, toLocalDateTime, toPickerLocalDateTime } from "../temporal.js";
6
- import { useAnsweredValue } from "../answeredValues.js";
7
- import { toTextContent } from "./toTextContent.js";
8
- import { actionAttr, fire } from "./dispatch.js";
9
- import * as React from "react";
10
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
- import { z } from "zod";
12
- //#region src/vocabulary/interactive.tsx
13
- const optionSchema = z.object({
14
- label: z.string(),
15
- value: z.string()
16
- });
17
- const describedOptionSchema = optionSchema.extend({ description: z.string().optional() });
18
- const isOption = (option) => option !== null && typeof option === "object" && "label" in option && typeof option.label === "string" && (!("description" in option) || typeof option.description === "string") && "value" in option && typeof option.value === "string";
19
- const mapOptions = (options, render) => {
20
- const occurrences = /* @__PURE__ */ new Map();
21
- return (Array.isArray(options) ? options : []).map((option) => {
22
- if (!isOption(option)) return null;
23
- const occurrence = occurrences.get(option.value) ?? 0;
24
- occurrences.set(option.value, occurrence + 1);
25
- return render(option, JSON.stringify([option.value, occurrence]));
26
- });
27
- };
28
- function RadioGroupRender({ value, options, name, label, defaultValue, children, $action, $dispatch }) {
29
- const groupName = useRadioGroupName(name);
30
- const answeredValue = useAnsweredValue(name);
31
- const updateBinding = useA2uiBinding(name);
32
- const isBound = updateBinding !== void 0;
33
- const initialValue = typeof answeredValue === "string" ? answeredValue : defaultValue;
34
- return /* @__PURE__ */ jsxs("fieldset", {
35
- "data-aui": "radiogroup",
36
- "data-aui-action": actionAttr($action),
37
- "aria-label": label,
38
- children: [mapOptions(options, (option, key) => /* @__PURE__ */ jsxs("label", {
39
- "data-aui": "radiogroup-option",
40
- children: [/* @__PURE__ */ jsx("input", {
41
- type: "radio",
42
- name: groupName,
43
- [FIELD_NAME_ATTR]: name,
44
- ...name == null ? { [GENERATED_NAME_ATTR]: "" } : {},
45
- value: option.value,
46
- ...isBound ? { checked: (answeredValue ?? value) === option.value } : { defaultChecked: initialValue === option.value },
47
- onChange: (e) => {
48
- updateBinding?.(option.value);
49
- fire($action, $dispatch, option.value, e.currentTarget);
50
- }
51
- }), option.description ? /* @__PURE__ */ jsxs("span", {
52
- "data-aui": "option-content",
53
- children: [/* @__PURE__ */ jsx("span", {
54
- "data-aui": "option-label",
55
- children: option.label
56
- }), /* @__PURE__ */ jsx("span", {
57
- "data-aui": "option-description",
58
- children: option.description
59
- })]
60
- }) : option.label]
61
- }, key)), children]
62
- }, initialValue);
63
- }
64
- const checkedGroupValues = (input) => Array.from(input.closest("fieldset")?.querySelectorAll(`:scope > label > input[data-aui-checkbox-group]:checked`) ?? [], (checkbox) => checkbox.value);
65
- function CheckboxGroupRender({ value, options, name, label, defaultValue, children, $action, $dispatch }) {
66
- const generatedName = React.useId();
67
- const fieldName = name ?? generatedName;
68
- const answeredValue = useAnsweredValue(name);
69
- const updateBinding = useA2uiBinding(name);
70
- const isBound = updateBinding !== void 0;
71
- const checkedValues = Array.isArray(answeredValue) && answeredValue.every((value) => typeof value === "string") ? answeredValue : Array.isArray(defaultValue) ? defaultValue : [];
72
- return /* @__PURE__ */ jsxs("fieldset", {
73
- "data-aui": "checkboxgroup",
74
- "data-aui-action": actionAttr($action),
75
- "aria-label": label,
76
- children: [mapOptions(options, (option, key) => /* @__PURE__ */ jsxs("label", {
77
- "data-aui": "checkboxgroup-option",
78
- children: [/* @__PURE__ */ jsx("input", {
79
- type: "checkbox",
80
- name: fieldName,
81
- [CHECKBOX_GROUP_ATTR]: "",
82
- ...name == null ? { [GENERATED_NAME_ATTR]: "" } : {},
83
- value: option.value,
84
- ...isBound ? { checked: (Array.isArray(answeredValue) ? checkedValues : value ?? []).includes(option.value) } : { defaultChecked: checkedValues.includes(option.value) },
85
- onChange: (e) => {
86
- const selected = checkedGroupValues(e.currentTarget);
87
- updateBinding?.(selected);
88
- fire($action, $dispatch, selected, e.currentTarget);
89
- }
90
- }), option.description ? /* @__PURE__ */ jsxs("span", {
91
- "data-aui": "option-content",
92
- children: [/* @__PURE__ */ jsx("span", {
93
- "data-aui": "option-label",
94
- children: option.label
95
- }), /* @__PURE__ */ jsx("span", {
96
- "data-aui": "option-description",
97
- children: option.description
98
- })]
99
- }) : option.label]
100
- }, key)), children]
101
- }, JSON.stringify(checkedValues));
102
- }
103
- function SelectRender({ value, options, placeholder, label, name, defaultValue, $action, $dispatch, children }) {
104
- const answeredValue = useAnsweredValue(name);
105
- const updateBinding = useA2uiBinding(name);
106
- const isBound = updateBinding !== void 0;
107
- const placeholderText = toTextContent(placeholder);
108
- const initialValue = typeof answeredValue === "string" ? answeredValue : typeof defaultValue === "string" ? defaultValue : "";
109
- return /* @__PURE__ */ jsxs("select", {
110
- "data-aui": "select",
111
- "data-aui-action": actionAttr($action),
112
- name,
113
- "aria-label": label,
114
- ...isBound ? { value: typeof answeredValue === "string" ? answeredValue : value ?? "" } : { defaultValue: initialValue },
115
- onChange: (e) => {
116
- updateBinding?.(e.currentTarget.value);
117
- fire($action, $dispatch, e.currentTarget.value, e.currentTarget);
118
- },
119
- children: [
120
- placeholderText ? /* @__PURE__ */ jsx("option", {
121
- value: "",
122
- disabled: true,
123
- children: placeholderText
124
- }) : null,
125
- mapOptions(options, (option, key) => /* @__PURE__ */ jsx("option", {
126
- value: option.value,
127
- children: option.label
128
- }, key)),
129
- children
130
- ]
131
- }, initialValue);
132
- }
133
- function InputRender({ value, inputType, placeholder, multiline, label, name, defaultValue, $action, $dispatch }) {
134
- const answeredValue = useAnsweredValue(name);
135
- const updateBinding = useA2uiBinding(name);
136
- const isBound = updateBinding !== void 0;
137
- const initialValue = typeof answeredValue === "string" ? answeredValue : defaultValue;
138
- const submit = (control) => fire($action, $dispatch, control.value, control);
139
- return multiline && (inputType === void 0 || inputType === "text") ? /* @__PURE__ */ jsx("textarea", {
140
- "data-aui": "input",
141
- "data-aui-multiline": true,
142
- "data-aui-action": actionAttr($action),
143
- name,
144
- "aria-label": label,
145
- placeholder,
146
- ...isBound ? { value: typeof answeredValue === "string" ? answeredValue : value ?? "" } : { defaultValue: initialValue },
147
- onChange: updateBinding ? (e) => updateBinding(e.currentTarget.value) : void 0,
148
- onKeyDown: (e) => {
149
- if (e.key !== "Enter" || !(e.ctrlKey || e.metaKey) || e.nativeEvent.isComposing) return;
150
- if (e.currentTarget.form) {
151
- e.preventDefault();
152
- HTMLFormElement.prototype.requestSubmit.call(e.currentTarget.form);
153
- } else submit(e.currentTarget);
154
- }
155
- }, initialValue) : /* @__PURE__ */ jsx("input", {
156
- type: inputType,
157
- step: inputType === "number" ? "any" : void 0,
158
- "data-aui": "input",
159
- "data-aui-action": actionAttr($action),
160
- name,
161
- "aria-label": label,
162
- placeholder,
163
- ...isBound ? { value: typeof answeredValue === "string" ? answeredValue : value ?? "" } : { defaultValue: initialValue },
164
- onChange: updateBinding ? (e) => updateBinding(e.currentTarget.value) : void 0,
165
- onKeyDown: (e) => {
166
- if (e.key === "Enter" && !e.nativeEvent.isComposing && !e.currentTarget.form) submit(e.currentTarget);
167
- }
168
- }, initialValue);
169
- }
170
- const subscribeToHydration = () => () => {};
171
- const clientHydrationSnapshot = () => true;
172
- const serverHydrationSnapshot = () => false;
173
- function DatePickerRender({ inputType = "date", value, min, max, label, name, $action, $dispatch }) {
174
- const answeredValue = useAnsweredValue(name);
175
- const updateBinding = useA2uiBinding(name);
176
- const isBound = updateBinding !== void 0;
177
- const initialValue = typeof answeredValue === "string" ? answeredValue : value;
178
- const [selection, setSelection] = React.useState({
179
- initialValue,
180
- value: initialValue,
181
- anchor: initialValue
182
- });
183
- if (selection.initialValue !== initialValue) setSelection({
184
- initialValue,
185
- value: initialValue,
186
- anchor: isBound && initialValue === selection.value ? selection.anchor : initialValue
187
- });
188
- const currentValue = isBound ? initialValue : selection.value;
189
- const temporal = classifyTemporal(currentValue ?? "");
190
- const anchor = classifyTemporal(selection.anchor ?? "");
191
- const hasInstantAnchor = inputType === "datetime" && anchor.kind === "instant";
192
- const canonicalFieldValue = (value) => {
193
- const current = value ?? "";
194
- const kind = classifyTemporal(current).kind;
195
- if (inputType === "time") return kind === "time" && normalizeTemporalInputValue(current) !== current ? value : void 0;
196
- if (inputType !== "datetime") return void 0;
197
- if (kind === "instant") return value;
198
- if (hasInstantAnchor) return selection.anchor;
199
- return kind === "floating" && normalizeTemporalInputValue(current) !== current ? value : void 0;
200
- };
201
- const minimum = classifyTemporal(min ?? "");
202
- const maximum = classifyTemporal(max ?? "");
203
- const hydrated = React.useSyncExternalStore(subscribeToHydration, clientHydrationSnapshot, serverHydrationSnapshot);
204
- const showRawValue = inputType === "datetime" && temporal.kind === "instant" && !hydrated;
205
- const displayValue = currentValue === void 0 ? void 0 : inputType === "datetime" && hydrated ? toPickerLocalDateTime(currentValue) : normalizeTemporalInputValue(currentValue);
206
- return /* @__PURE__ */ jsx("input", {
207
- type: showRawValue ? "text" : inputType === "datetime" ? "datetime-local" : inputType,
208
- readOnly: showRawValue || void 0,
209
- "data-aui": "datepicker",
210
- "data-aui-action": actionAttr($action),
211
- [FIELD_VALUE_ATTR]: canonicalFieldValue(currentValue),
212
- name,
213
- "aria-label": label,
214
- ...isBound || inputType === "datetime" ? { value: displayValue ?? "" } : { defaultValue: displayValue },
215
- min: inputType === "datetime" && hydrated && min !== void 0 ? normalizeTemporalInputValue(toLocalDateTime(min, minimum.kind === "instant" ? minimum.precision : void 0)) : min === void 0 ? void 0 : normalizeTemporalInputValue(min),
216
- max: inputType === "datetime" && hydrated && max !== void 0 ? normalizeTemporalInputValue(toLocalDateTime(max, maximum.kind === "instant" ? maximum.precision : void 0)) : max === void 0 ? void 0 : normalizeTemporalInputValue(max),
217
- step: inputType !== "date" ? getTemporalInputStep(selection.anchor, currentValue, min, max) : void 0,
218
- onChange: (e) => {
219
- const inputValue = normalizeTemporalInputValue(e.currentTarget.value);
220
- const nextValue = inputType === "datetime" ? fromLocalDateTime(inputValue, selection.anchor) : inputValue;
221
- const canonical = canonicalFieldValue(nextValue);
222
- if (canonical !== void 0) e.currentTarget.setAttribute(FIELD_VALUE_ATTR, canonical);
223
- else e.currentTarget.removeAttribute(FIELD_VALUE_ATTR);
224
- setSelection({
225
- initialValue,
226
- value: nextValue,
227
- anchor: selection.anchor
228
- });
229
- updateBinding?.(nextValue);
230
- fire($action, $dispatch, nextValue, e.currentTarget);
231
- }
232
- }, isBound ? void 0 : initialValue);
233
- }
234
- function CheckboxRender({ checked, label, name, defaultChecked, variant = "checkbox", $action, $dispatch }) {
235
- const answeredValue = useAnsweredValue(name);
236
- const updateBinding = useA2uiBinding(name);
237
- const isBound = updateBinding !== void 0;
238
- const initialChecked = typeof answeredValue === "boolean" ? answeredValue : defaultChecked;
239
- return /* @__PURE__ */ jsxs("label", {
240
- "data-aui": "checkbox",
241
- "data-aui-variant": variant === "switch" ? variant : void 0,
242
- children: [/* @__PURE__ */ jsx("input", {
243
- type: "checkbox",
244
- role: variant === "switch" ? "switch" : void 0,
245
- "data-aui-action": actionAttr($action),
246
- name,
247
- ...isBound ? { checked: typeof answeredValue === "boolean" ? answeredValue : checked === true } : { defaultChecked: initialChecked },
248
- onChange: (e) => {
249
- updateBinding?.(e.currentTarget.checked);
250
- fire($action, $dispatch, e.currentTarget.checked, e.currentTarget);
251
- }
252
- }, String(initialChecked)), /* @__PURE__ */ jsx("span", {
253
- "data-aui": "checkbox-label",
254
- children: toTextContent(label)
255
- })]
256
- });
257
- }
258
- const finiteNumber = (value) => typeof value === "number" && Number.isFinite(value);
259
- const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
260
- function SliderControl({ controlledValue, name, label, min, max, step, initialValue, unit, $action, $dispatch }) {
261
- const updateBinding = useA2uiBinding(name);
262
- const [localValue, setValue] = React.useState(initialValue);
263
- const value = controlledValue ?? localValue;
264
- const pointerActive = React.useRef(false);
265
- const keyboardActive = React.useRef(false);
266
- const lastCommitted = React.useRef(initialValue);
267
- const currentValue = (input) => clamp(Number(input.value), min, max);
268
- const commit = (input) => {
269
- if (controlledValue !== void 0) return;
270
- const nextValue = currentValue(input);
271
- setValue(nextValue);
272
- if (lastCommitted.current === nextValue) return;
273
- lastCommitted.current = nextValue;
274
- fire($action, $dispatch, nextValue, input);
275
- };
276
- return /* @__PURE__ */ jsxs("label", {
277
- "data-aui": "slider-field",
278
- children: [
279
- label ? /* @__PURE__ */ jsx("span", {
280
- "data-aui": "slider-label",
281
- children: label
282
- }) : null,
283
- /* @__PURE__ */ jsx("input", {
284
- type: "range",
285
- "data-aui": "slider",
286
- "data-aui-action": actionAttr($action),
287
- name,
288
- "aria-label": label,
289
- "aria-valuetext": unit ? `${value} ${unit}` : String(value),
290
- min,
291
- max,
292
- step,
293
- ...controlledValue !== void 0 ? { value } : { defaultValue: initialValue },
294
- onInput: (e) => {
295
- const nextValue = currentValue(e.currentTarget);
296
- if (controlledValue !== void 0) updateBinding?.(nextValue);
297
- else setValue(nextValue);
298
- },
299
- onPointerDown: () => {
300
- pointerActive.current = true;
301
- },
302
- onPointerUp: (e) => {
303
- pointerActive.current = false;
304
- commit(e.currentTarget);
305
- },
306
- onKeyDown: (e) => {
307
- keyboardActive.current = [
308
- "ArrowDown",
309
- "ArrowLeft",
310
- "ArrowRight",
311
- "ArrowUp",
312
- "End",
313
- "Home",
314
- "PageDown",
315
- "PageUp"
316
- ].includes(e.key);
317
- },
318
- onKeyUp: (e) => {
319
- if (!keyboardActive.current) return;
320
- keyboardActive.current = false;
321
- commit(e.currentTarget);
322
- },
323
- onChange: (e) => {
324
- if (!pointerActive.current && !keyboardActive.current) commit(e.currentTarget);
325
- }
326
- }),
327
- /* @__PURE__ */ jsxs("output", {
328
- "data-aui": "slider-value",
329
- children: [value, unit ? ` ${unit}` : ""]
330
- })
331
- ]
332
- });
333
- }
334
- function SliderRender({ value, name, label, min, max, step, defaultValue, unit, $action, $dispatch }) {
335
- const answeredValue = useAnsweredValue(name);
336
- const isBound = useA2uiBinding(name) !== void 0;
337
- const safeMin = finiteNumber(min) ? min : 0;
338
- const safeMax = finiteNumber(max) ? Math.max(max, safeMin) : safeMin + 100;
339
- const safeStep = finiteNumber(step) && step > 0 ? step : 1;
340
- const defaultNumber = finiteNumber(isBound ? value : defaultValue) ? isBound ? value : defaultValue : safeMin;
341
- const initialValue = clamp(finiteNumber(answeredValue) ? answeredValue : defaultNumber, safeMin, safeMax);
342
- return /* @__PURE__ */ jsx(SliderControl, {
343
- ...isBound ? { controlledValue: initialValue } : {},
344
- min: safeMin,
345
- max: safeMax,
346
- step: safeStep,
347
- initialValue,
348
- ...name !== void 0 ? { name } : {},
349
- ...label !== void 0 ? { label } : {},
350
- ...unit !== void 0 ? { unit } : {},
351
- ...$action !== void 0 ? { $action } : {},
352
- ...$dispatch !== void 0 ? { $dispatch } : {}
353
- }, `${safeMin}:${safeMax}:${safeStep}:${isBound ? "bound" : initialValue}`);
354
- }
355
- const UNDO_WINDOW_SECONDS = 5;
356
- function ButtonRender({ label, buttonStyle, block, submit, undoable, children, $action, $dispatch }) {
357
- const bindings = React.useContext(A2uiBindingContext)?.fields;
358
- const bindingsRef = React.useRef(bindings);
359
- bindingsRef.current = bindings;
360
- const [remaining, setRemaining] = React.useState(void 0);
361
- const labelText = String(toTextContent(label) ?? "");
362
- const undoLabel = labelText.trim();
363
- const pendingAction = React.useRef(void 0);
364
- const canUndo = undoable && !submit && $action !== void 0 && $dispatch !== void 0;
365
- React.useEffect(() => {
366
- if (remaining === void 0) return;
367
- const timer = setTimeout(() => {
368
- if (remaining > 1) {
369
- setRemaining(remaining - 1);
370
- return;
371
- }
372
- const action = pendingAction.current;
373
- pendingAction.current = void 0;
374
- setRemaining(void 0);
375
- if (action) fire(action.$action, action.$dispatch, void 0, action.source, bindingsRef.current);
376
- }, 1e3);
377
- return () => clearTimeout(timer);
378
- }, [remaining]);
379
- const cancelUndo = () => {
380
- pendingAction.current = void 0;
381
- setRemaining(void 0);
382
- };
383
- return /* @__PURE__ */ jsx("button", {
384
- type: submit ? "submit" : "button",
385
- "data-aui": "button",
386
- "data-aui-style": buttonStyle,
387
- "data-aui-block": block || void 0,
388
- "data-aui-submit": submit || void 0,
389
- "data-aui-state": remaining === void 0 ? void 0 : "pending",
390
- "data-aui-action": actionAttr($action),
391
- "aria-label": remaining === void 0 ? void 0 : undoLabel ? `Undo ${undoLabel}` : "Undo",
392
- onClick: submit ? void 0 : canUndo ? (e) => {
393
- if (remaining !== void 0) {
394
- cancelUndo();
395
- return;
396
- }
397
- pendingAction.current = {
398
- $action,
399
- $dispatch,
400
- source: e.currentTarget
401
- };
402
- setRemaining(UNDO_WINDOW_SECONDS);
403
- } : (e) => fire($action, $dispatch, void 0, e.currentTarget, bindings),
404
- onKeyDown: canUndo ? (e) => {
405
- if (e.key !== "Escape" || remaining === void 0) return;
406
- e.preventDefault();
407
- cancelUndo();
408
- } : void 0,
409
- children: remaining === void 0 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [labelText, children] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
410
- "Undo ",
411
- /* @__PURE__ */ jsx("span", {
412
- "data-aui": "button-countdown",
413
- children: remaining
414
- }),
415
- /* @__PURE__ */ jsxs("span", {
416
- "data-aui": "button-undo-status",
417
- role: "status",
418
- children: [
419
- labelText,
420
- " in ",
421
- UNDO_WINDOW_SECONDS,
422
- " seconds"
423
- ]
424
- })
425
- ] })
426
- });
427
- }
428
- const interactiveVocabulary = {
429
- Button: {
430
- description: "A clickable button. Carries `$action` describing the side effect or resume value. Set `submit` to submit an ancestor Form/Card instead of firing `$action` on click.",
431
- properties: z.object({
432
- label: z.string().describe("Button label."),
433
- buttonStyle: z.enum(BUTTON_STYLES).optional().describe("Visual style."),
434
- block: z.boolean().optional().describe("Whether the button spans the full width."),
435
- submit: z.boolean().optional().describe("Render as a submit button for an ancestor Form/Card instead of a click button."),
436
- undoable: z.boolean().optional().describe("Delay the action with an undo control, for sends and other hard-to-reverse actions.")
437
- }),
438
- render: ButtonRender
439
- },
440
- Select: {
441
- description: "A dropdown selector. Carries `$action` describing the on-select behavior.",
442
- properties: z.object({
443
- options: z.array(optionSchema).describe("Selectable options."),
444
- placeholder: z.string().optional().describe("Placeholder shown when nothing is selected."),
445
- label: z.string().optional().describe("Accessible label for the control."),
446
- name: z.string().optional().describe("Field name used inside a Form."),
447
- defaultValue: z.string().optional().describe("Initially selected value.")
448
- }),
449
- render: SelectRender
450
- },
451
- Input: {
452
- description: "A text input. Carries `$action` describing the on-submit behavior.",
453
- properties: z.object({
454
- inputType: z.enum([
455
- "text",
456
- "password",
457
- "number"
458
- ]).optional().describe("Single-line input type. Values remain strings."),
459
- placeholder: z.string().optional().describe("Placeholder text."),
460
- multiline: z.boolean().optional().describe("Render a textarea instead of a single-line input; ignored when `inputType` is `\"password\"` or `\"number\"`."),
461
- label: z.string().optional().describe("Accessible label for the control."),
462
- name: z.string().optional().describe("Field name used inside a Form."),
463
- defaultValue: z.string().optional().describe("Initial text.")
464
- }),
465
- render: InputRender
466
- },
467
- DatePicker: {
468
- description: "A date, datetime, or time input. Carries `$action` describing the on-select behavior.",
469
- properties: z.object({
470
- inputType: z.enum([
471
- "date",
472
- "datetime",
473
- "time"
474
- ]).optional().describe("Temporal input type. Defaults to \"date\". Values remain strings."),
475
- value: z.string().optional().describe("Initial value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. A datetime with Z or ±HH:mm is an instant, displayed in the viewer's time zone and submitted with the same offset and precision. A datetime without an offset is local and submitted unchanged. An empty datetime submits with the viewer's offset and seconds."),
476
- min: z.string().optional().describe("Minimum value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. Datetimes with Z or ±HH:mm are converted to the viewer's time zone."),
477
- max: z.string().optional().describe("Maximum value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. Datetimes with Z or ±HH:mm are converted to the viewer's time zone."),
478
- label: z.string().optional().describe("Accessible label for the control."),
479
- name: z.string().optional().describe("Field name used inside a Form.")
480
- }),
481
- render: DatePickerRender
482
- },
483
- Checkbox: {
484
- description: "A checkbox with a label. Carries `$action` describing the on-change behavior.",
485
- properties: z.object({
486
- label: z.string().describe("Label text next to the checkbox."),
487
- name: z.string().optional().describe("Field name used inside a Form."),
488
- defaultChecked: z.boolean().optional().describe("Whether the checkbox starts checked."),
489
- variant: z.enum(["checkbox", "switch"]).optional().describe("Whether to render a checkbox or switch.")
490
- }),
491
- render: CheckboxRender
492
- },
493
- Slider: {
494
- description: "A numeric range control. Carries `$action` describing the committed value.",
495
- properties: z.object({
496
- name: z.string().optional().describe("Field name used inside a Form."),
497
- label: z.string().optional().describe("Accessible label for the control."),
498
- min: z.number().describe("Minimum value."),
499
- max: z.number().describe("Maximum value."),
500
- step: z.number().optional().describe("Value increment. Defaults to 1."),
501
- defaultValue: z.number().optional().describe("Initial value."),
502
- unit: z.string().optional().describe("Unit shown with the value.")
503
- }),
504
- render: SliderRender
505
- },
506
- RadioGroup: {
507
- description: "A group of mutually exclusive radio options. Carries `$action` describing the on-change behavior.",
508
- properties: z.object({
509
- options: z.array(describedOptionSchema).describe("Selectable options."),
510
- name: z.string().optional().describe("Field name used inside a Form."),
511
- label: z.string().optional().describe("Accessible name for the group."),
512
- defaultValue: z.string().optional().describe("Initially selected value.")
513
- }),
514
- render: RadioGroupRender
515
- },
516
- CheckboxGroup: {
517
- description: "A group of checkbox options where any number can be checked. Carries `$action` describing the on-change behavior.",
518
- properties: z.object({
519
- options: z.array(describedOptionSchema).describe("Selectable options."),
520
- name: z.string().optional().describe("Field name used inside a Form."),
521
- label: z.string().optional().describe("Accessible name for the group."),
522
- defaultValue: z.array(z.string()).optional().describe("Initially checked values.")
523
- }),
524
- render: CheckboxGroupRender
525
- }
526
- };
527
- //#endregion
528
- export { interactiveVocabulary };
529
-
530
- //# sourceMappingURL=interactive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interactive.js","names":[],"sources":["../../src/vocabulary/interactive.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { z } from \"zod\";\nimport {\n CHECKBOX_GROUP_ATTR,\n FIELD_NAME_ATTR,\n FIELD_VALUE_ATTR,\n GENERATED_NAME_ATTR,\n} from \"../constants\";\nimport type { Action } from \"../ir\";\nimport { BUTTON_STYLES } from \"../ir\";\nimport type {\n GenerativeUIDispatch,\n GenerativeUILibrary,\n GenerativeUIStatus,\n} from \"../types\";\nimport { A2uiBindingContext, useA2uiBinding } from \"../a2ui/BindingContext\";\nimport { useAnsweredValue } from \"../answeredValues\";\nimport { actionAttr, fire } from \"./dispatch\";\nimport { toTextContent } from \"./toTextContent\";\nimport { useRadioGroupName } from \"../RadioGroupScope\";\nimport {\n classifyTemporal,\n fromLocalDateTime,\n getTemporalInputStep,\n normalizeTemporalInputValue,\n toLocalDateTime,\n toPickerLocalDateTime,\n} from \"../temporal\";\n\nconst optionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\nconst describedOptionSchema = optionSchema.extend({\n description: z.string().optional(),\n});\n\ntype Option = { label: string; description?: string; value: string };\n\nconst isOption = (option: unknown): option is Option =>\n option !== null &&\n typeof option === \"object\" &&\n \"label\" in option &&\n typeof option.label === \"string\" &&\n (!(\"description\" in option) || typeof option.description === \"string\") &&\n \"value\" in option &&\n typeof option.value === \"string\";\n\nconst mapOptions = (\n options: unknown,\n render: (option: Option, key: string) => React.ReactNode,\n) => {\n const occurrences = new Map<string, number>();\n return (Array.isArray(options) ? options : []).map((option) => {\n if (!isOption(option)) return null;\n const occurrence = occurrences.get(option.value) ?? 0;\n occurrences.set(option.value, occurrence + 1);\n return render(option, JSON.stringify([option.value, occurrence]));\n });\n};\n\ntype RadioGroupRenderProps = {\n value?: string;\n options: Option[];\n name?: string;\n label?: string;\n defaultValue?: string;\n children?: React.ReactNode;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction RadioGroupRender({\n value,\n options,\n name,\n label,\n defaultValue,\n children,\n $action,\n $dispatch,\n}: RadioGroupRenderProps) {\n const groupName = useRadioGroupName(name);\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const initialValue =\n typeof answeredValue === \"string\" ? answeredValue : defaultValue;\n return (\n <fieldset\n key={initialValue}\n data-aui=\"radiogroup\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n >\n {mapOptions(options, (option, key) => (\n <label key={key} data-aui=\"radiogroup-option\">\n <input\n type=\"radio\"\n name={groupName}\n {...{ [FIELD_NAME_ATTR]: name }}\n {...(name == null ? { [GENERATED_NAME_ATTR]: \"\" } : {})}\n value={option.value}\n {...(isBound\n ? { checked: (answeredValue ?? value) === option.value }\n : { defaultChecked: initialValue === option.value })}\n onChange={(e) => {\n updateBinding?.(option.value);\n fire($action, $dispatch, option.value, e.currentTarget);\n }}\n />\n {option.description ? (\n <span data-aui=\"option-content\">\n <span data-aui=\"option-label\">{option.label}</span>\n <span data-aui=\"option-description\">{option.description}</span>\n </span>\n ) : (\n option.label\n )}\n </label>\n ))}\n {children}\n </fieldset>\n );\n}\n\ntype CheckboxGroupRenderProps = {\n value?: string[];\n options: Option[];\n name?: string;\n label?: string;\n defaultValue?: string[];\n children?: React.ReactNode;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nconst checkedGroupValues = (input: HTMLInputElement): string[] =>\n Array.from(\n input\n .closest(\"fieldset\")\n ?.querySelectorAll<HTMLInputElement>(\n `:scope > label > input[${CHECKBOX_GROUP_ATTR}]:checked`,\n ) ?? [],\n (checkbox) => checkbox.value,\n );\n\nfunction CheckboxGroupRender({\n value,\n options,\n name,\n label,\n defaultValue,\n children,\n $action,\n $dispatch,\n}: CheckboxGroupRenderProps) {\n const generatedName = React.useId();\n const fieldName = name ?? generatedName;\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const checkedValues =\n Array.isArray(answeredValue) &&\n answeredValue.every((value): value is string => typeof value === \"string\")\n ? answeredValue\n : Array.isArray(defaultValue)\n ? defaultValue\n : [];\n return (\n <fieldset\n key={JSON.stringify(checkedValues)}\n data-aui=\"checkboxgroup\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n >\n {mapOptions(options, (option, key) => (\n <label key={key} data-aui=\"checkboxgroup-option\">\n <input\n type=\"checkbox\"\n name={fieldName}\n {...{ [CHECKBOX_GROUP_ATTR]: \"\" }}\n {...(name == null ? { [GENERATED_NAME_ATTR]: \"\" } : {})}\n value={option.value}\n {...(isBound\n ? {\n checked: (Array.isArray(answeredValue)\n ? checkedValues\n : (value ?? [])\n ).includes(option.value),\n }\n : { defaultChecked: checkedValues.includes(option.value) })}\n onChange={(e) => {\n const selected = checkedGroupValues(e.currentTarget);\n updateBinding?.(selected);\n fire($action, $dispatch, selected, e.currentTarget);\n }}\n />\n {option.description ? (\n <span data-aui=\"option-content\">\n <span data-aui=\"option-label\">{option.label}</span>\n <span data-aui=\"option-description\">{option.description}</span>\n </span>\n ) : (\n option.label\n )}\n </label>\n ))}\n {children}\n </fieldset>\n );\n}\n\ntype SelectRenderProps = {\n value?: string;\n options: Option[];\n placeholder?: string;\n label?: string;\n name?: string;\n defaultValue?: string;\n children?: React.ReactNode;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction SelectRender({\n value,\n options,\n placeholder,\n label,\n name,\n defaultValue,\n $action,\n $dispatch,\n children,\n}: SelectRenderProps) {\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const placeholderText = toTextContent(placeholder);\n const initialValue =\n typeof answeredValue === \"string\"\n ? answeredValue\n : typeof defaultValue === \"string\"\n ? defaultValue\n : \"\";\n return (\n <select\n key={initialValue}\n data-aui=\"select\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n {...(isBound\n ? {\n value:\n typeof answeredValue === \"string\" ? answeredValue : (value ?? \"\"),\n }\n : { defaultValue: initialValue })}\n onChange={(e) => {\n updateBinding?.(e.currentTarget.value);\n fire($action, $dispatch, e.currentTarget.value, e.currentTarget);\n }}\n >\n {placeholderText ? (\n <option value=\"\" disabled>\n {placeholderText}\n </option>\n ) : null}\n {mapOptions(options, (option, key) => (\n <option key={key} value={option.value}>\n {option.label}\n </option>\n ))}\n {children}\n </select>\n );\n}\n\ntype InputRenderProps = {\n value?: string;\n inputType?: \"text\" | \"password\" | \"number\";\n placeholder?: string;\n multiline?: boolean;\n label?: string;\n name?: string;\n defaultValue?: string;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction InputRender({\n value,\n inputType,\n placeholder,\n multiline,\n label,\n name,\n defaultValue,\n $action,\n $dispatch,\n}: InputRenderProps) {\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const initialValue =\n typeof answeredValue === \"string\" ? answeredValue : defaultValue;\n const submit = (control: HTMLInputElement | HTMLTextAreaElement) =>\n fire($action, $dispatch, control.value, control);\n return multiline && (inputType === undefined || inputType === \"text\") ? (\n <textarea\n key={initialValue}\n data-aui=\"input\"\n data-aui-multiline\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n placeholder={placeholder}\n {...(isBound\n ? {\n value:\n typeof answeredValue === \"string\" ? answeredValue : (value ?? \"\"),\n }\n : { defaultValue: initialValue })}\n onChange={\n updateBinding ? (e) => updateBinding(e.currentTarget.value) : undefined\n }\n onKeyDown={(e) => {\n if (\n e.key !== \"Enter\" ||\n !(e.ctrlKey || e.metaKey) ||\n e.nativeEvent.isComposing\n )\n return;\n if (e.currentTarget.form) {\n e.preventDefault();\n HTMLFormElement.prototype.requestSubmit.call(e.currentTarget.form);\n } else {\n submit(e.currentTarget);\n }\n }}\n />\n ) : (\n <input\n key={initialValue}\n type={inputType}\n step={inputType === \"number\" ? \"any\" : undefined}\n data-aui=\"input\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n placeholder={placeholder}\n {...(isBound\n ? {\n value:\n typeof answeredValue === \"string\" ? answeredValue : (value ?? \"\"),\n }\n : { defaultValue: initialValue })}\n onChange={\n updateBinding ? (e) => updateBinding(e.currentTarget.value) : undefined\n }\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !e.nativeEvent.isComposing &&\n !e.currentTarget.form\n )\n submit(e.currentTarget);\n }}\n />\n );\n}\n\ntype DatePickerRenderProps = {\n inputType?: \"date\" | \"datetime\" | \"time\";\n value?: string;\n min?: string;\n max?: string;\n label?: string;\n name?: string;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nconst subscribeToHydration = () => () => {};\nconst clientHydrationSnapshot = () => true;\nconst serverHydrationSnapshot = () => false;\n\nfunction DatePickerRender({\n inputType = \"date\",\n value,\n min,\n max,\n label,\n name,\n $action,\n $dispatch,\n}: DatePickerRenderProps) {\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const initialValue =\n typeof answeredValue === \"string\" ? answeredValue : value;\n const [selection, setSelection] = React.useState({\n initialValue,\n value: initialValue,\n anchor: initialValue,\n });\n if (selection.initialValue !== initialValue) {\n setSelection({\n initialValue,\n value: initialValue,\n anchor:\n isBound && initialValue === selection.value\n ? selection.anchor\n : initialValue,\n });\n }\n const currentValue = isBound ? initialValue : selection.value;\n const temporal = classifyTemporal(currentValue ?? \"\");\n const anchor = classifyTemporal(selection.anchor ?? \"\");\n const hasInstantAnchor =\n inputType === \"datetime\" && anchor.kind === \"instant\";\n const canonicalFieldValue = (value: string | undefined) => {\n const current = value ?? \"\";\n const kind = classifyTemporal(current).kind;\n if (inputType === \"time\")\n return kind === \"time\" && normalizeTemporalInputValue(current) !== current\n ? value\n : undefined;\n if (inputType !== \"datetime\") return undefined;\n if (kind === \"instant\") return value;\n if (hasInstantAnchor) return selection.anchor;\n return kind === \"floating\" &&\n normalizeTemporalInputValue(current) !== current\n ? value\n : undefined;\n };\n const minimum = classifyTemporal(min ?? \"\");\n const maximum = classifyTemporal(max ?? \"\");\n const hydrated = React.useSyncExternalStore(\n subscribeToHydration,\n clientHydrationSnapshot,\n serverHydrationSnapshot,\n );\n const showRawValue =\n inputType === \"datetime\" && temporal.kind === \"instant\" && !hydrated;\n const displayValue =\n currentValue === undefined\n ? undefined\n : inputType === \"datetime\" && hydrated\n ? toPickerLocalDateTime(currentValue)\n : normalizeTemporalInputValue(currentValue);\n return (\n <input\n key={isBound ? undefined : initialValue}\n type={\n showRawValue\n ? \"text\"\n : inputType === \"datetime\"\n ? \"datetime-local\"\n : inputType\n }\n readOnly={showRawValue || undefined}\n data-aui=\"datepicker\"\n data-aui-action={actionAttr($action)}\n {...{\n [FIELD_VALUE_ATTR]: canonicalFieldValue(currentValue),\n }}\n name={name}\n aria-label={label}\n {...(isBound || inputType === \"datetime\"\n ? { value: displayValue ?? \"\" }\n : { defaultValue: displayValue })}\n min={\n inputType === \"datetime\" && hydrated && min !== undefined\n ? normalizeTemporalInputValue(\n toLocalDateTime(\n min,\n minimum.kind === \"instant\" ? minimum.precision : undefined,\n ),\n )\n : min === undefined\n ? undefined\n : normalizeTemporalInputValue(min)\n }\n max={\n inputType === \"datetime\" && hydrated && max !== undefined\n ? normalizeTemporalInputValue(\n toLocalDateTime(\n max,\n maximum.kind === \"instant\" ? maximum.precision : undefined,\n ),\n )\n : max === undefined\n ? undefined\n : normalizeTemporalInputValue(max)\n }\n step={\n inputType !== \"date\"\n ? getTemporalInputStep(selection.anchor, currentValue, min, max)\n : undefined\n }\n onChange={(e) => {\n const inputValue = normalizeTemporalInputValue(e.currentTarget.value);\n const nextValue =\n inputType === \"datetime\"\n ? fromLocalDateTime(inputValue, selection.anchor)\n : inputValue;\n const canonical = canonicalFieldValue(nextValue);\n if (canonical !== undefined) {\n e.currentTarget.setAttribute(FIELD_VALUE_ATTR, canonical);\n } else {\n e.currentTarget.removeAttribute(FIELD_VALUE_ATTR);\n }\n setSelection({\n initialValue,\n value: nextValue,\n anchor: selection.anchor,\n });\n updateBinding?.(nextValue);\n fire($action, $dispatch, nextValue, e.currentTarget);\n }}\n />\n );\n}\n\ntype CheckboxRenderProps = {\n checked?: boolean;\n label: string;\n name?: string;\n defaultChecked?: boolean;\n variant?: \"checkbox\" | \"switch\";\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction CheckboxRender({\n checked,\n label,\n name,\n defaultChecked,\n variant = \"checkbox\",\n $action,\n $dispatch,\n}: CheckboxRenderProps) {\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const initialChecked =\n typeof answeredValue === \"boolean\" ? answeredValue : defaultChecked;\n return (\n <label\n data-aui=\"checkbox\"\n data-aui-variant={variant === \"switch\" ? variant : undefined}\n >\n <input\n key={String(initialChecked)}\n type=\"checkbox\"\n role={variant === \"switch\" ? \"switch\" : undefined}\n data-aui-action={actionAttr($action)}\n name={name}\n {...(isBound\n ? {\n checked:\n typeof answeredValue === \"boolean\"\n ? answeredValue\n : checked === true,\n }\n : { defaultChecked: initialChecked })}\n onChange={(e) => {\n updateBinding?.(e.currentTarget.checked);\n fire($action, $dispatch, e.currentTarget.checked, e.currentTarget);\n }}\n />\n <span data-aui=\"checkbox-label\">{toTextContent(label)}</span>\n </label>\n );\n}\n\nconst finiteNumber = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(Math.max(value, min), max);\n\ntype SliderRenderProps = {\n value?: number;\n name?: string;\n label?: string;\n min: number;\n max: number;\n step?: number;\n defaultValue?: number;\n unit?: string;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\ntype SliderControlProps = {\n controlledValue?: number;\n name?: string;\n label?: string;\n min: number;\n max: number;\n step: number;\n initialValue: number;\n unit?: string;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction SliderControl({\n controlledValue,\n name,\n label,\n min,\n max,\n step,\n initialValue,\n unit,\n $action,\n $dispatch,\n}: SliderControlProps) {\n const updateBinding = useA2uiBinding(name);\n const [localValue, setValue] = React.useState(initialValue);\n const value = controlledValue ?? localValue;\n const pointerActive = React.useRef(false);\n const keyboardActive = React.useRef(false);\n const lastCommitted = React.useRef(initialValue);\n const currentValue = (input: HTMLInputElement) =>\n clamp(Number(input.value), min, max);\n const commit = (input: HTMLInputElement) => {\n if (controlledValue !== undefined) return;\n const nextValue = currentValue(input);\n setValue(nextValue);\n if (lastCommitted.current === nextValue) return;\n lastCommitted.current = nextValue;\n fire($action, $dispatch, nextValue, input);\n };\n\n return (\n <label data-aui=\"slider-field\">\n {label ? <span data-aui=\"slider-label\">{label}</span> : null}\n <input\n type=\"range\"\n data-aui=\"slider\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n aria-valuetext={unit ? `${value} ${unit}` : String(value)}\n min={min}\n max={max}\n step={step}\n {...(controlledValue !== undefined\n ? { value }\n : { defaultValue: initialValue })}\n onInput={(e) => {\n const nextValue = currentValue(e.currentTarget);\n if (controlledValue !== undefined) updateBinding?.(nextValue);\n else setValue(nextValue);\n }}\n onPointerDown={() => {\n pointerActive.current = true;\n }}\n onPointerUp={(e) => {\n pointerActive.current = false;\n commit(e.currentTarget);\n }}\n onKeyDown={(e) => {\n keyboardActive.current = [\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"End\",\n \"Home\",\n \"PageDown\",\n \"PageUp\",\n ].includes(e.key);\n }}\n onKeyUp={(e) => {\n if (!keyboardActive.current) return;\n keyboardActive.current = false;\n commit(e.currentTarget);\n }}\n onChange={(e) => {\n if (!pointerActive.current && !keyboardActive.current)\n commit(e.currentTarget);\n }}\n />\n <output data-aui=\"slider-value\">\n {value}\n {unit ? ` ${unit}` : \"\"}\n </output>\n </label>\n );\n}\n\nfunction SliderRender({\n value,\n name,\n label,\n min,\n max,\n step,\n defaultValue,\n unit,\n $action,\n $dispatch,\n}: SliderRenderProps) {\n const answeredValue = useAnsweredValue(name);\n const updateBinding = useA2uiBinding(name);\n const isBound = updateBinding !== undefined;\n const safeMin = finiteNumber(min) ? min : 0;\n const safeMax = finiteNumber(max) ? Math.max(max, safeMin) : safeMin + 100;\n const safeStep = finiteNumber(step) && step > 0 ? step : 1;\n const defaultNumber = finiteNumber(isBound ? value : defaultValue)\n ? isBound\n ? value!\n : defaultValue!\n : safeMin;\n const initialValue = clamp(\n finiteNumber(answeredValue) ? answeredValue : defaultNumber,\n safeMin,\n safeMax,\n );\n return (\n <SliderControl\n key={`${safeMin}:${safeMax}:${safeStep}:${isBound ? \"bound\" : initialValue}`}\n {...(isBound ? { controlledValue: initialValue } : {})}\n min={safeMin}\n max={safeMax}\n step={safeStep}\n initialValue={initialValue}\n {...(name !== undefined ? { name } : {})}\n {...(label !== undefined ? { label } : {})}\n {...(unit !== undefined ? { unit } : {})}\n {...($action !== undefined ? { $action } : {})}\n {...($dispatch !== undefined ? { $dispatch } : {})}\n />\n );\n}\n\nconst UNDO_WINDOW_SECONDS = 5;\n\ntype ButtonRenderProps = {\n label: string;\n buttonStyle?: (typeof BUTTON_STYLES)[number];\n block?: boolean;\n submit?: boolean;\n undoable?: boolean;\n children?: React.ReactNode;\n $status: GenerativeUIStatus;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction ButtonRender({\n label,\n buttonStyle,\n block,\n submit,\n undoable,\n children,\n $action,\n $dispatch,\n}: ButtonRenderProps) {\n const bindings = React.useContext(A2uiBindingContext!)?.fields;\n const bindingsRef = React.useRef(bindings);\n bindingsRef.current = bindings;\n const [remaining, setRemaining] = React.useState<number | undefined>(\n undefined,\n );\n const labelText = String(toTextContent(label) ?? \"\");\n const undoLabel = labelText.trim();\n const pendingAction = React.useRef<\n | {\n $action: Action;\n $dispatch: GenerativeUIDispatch;\n source: HTMLButtonElement;\n }\n | undefined\n >(undefined);\n const canUndo =\n undoable && !submit && $action !== undefined && $dispatch !== undefined;\n\n React.useEffect(() => {\n if (remaining === undefined) return;\n const timer = setTimeout(() => {\n if (remaining > 1) {\n setRemaining(remaining - 1);\n return;\n }\n const action = pendingAction.current;\n pendingAction.current = undefined;\n setRemaining(undefined);\n if (action)\n fire(\n action.$action,\n action.$dispatch,\n undefined,\n action.source,\n bindingsRef.current,\n );\n }, 1_000);\n return () => clearTimeout(timer);\n }, [remaining]);\n\n const cancelUndo = () => {\n pendingAction.current = undefined;\n setRemaining(undefined);\n };\n\n return (\n <button\n type={submit ? \"submit\" : \"button\"}\n data-aui=\"button\"\n data-aui-style={buttonStyle}\n data-aui-block={block || undefined}\n data-aui-submit={submit || undefined}\n data-aui-state={remaining === undefined ? undefined : \"pending\"}\n data-aui-action={actionAttr($action)}\n aria-label={\n remaining === undefined\n ? undefined\n : undoLabel\n ? `Undo ${undoLabel}`\n : \"Undo\"\n }\n onClick={\n submit\n ? undefined\n : canUndo\n ? (e) => {\n if (remaining !== undefined) {\n cancelUndo();\n return;\n }\n pendingAction.current = {\n $action,\n $dispatch,\n source: e.currentTarget,\n };\n setRemaining(UNDO_WINDOW_SECONDS);\n }\n : (e) =>\n fire($action, $dispatch, undefined, e.currentTarget, bindings)\n }\n onKeyDown={\n canUndo\n ? (e) => {\n if (e.key !== \"Escape\" || remaining === undefined) return;\n e.preventDefault();\n cancelUndo();\n }\n : undefined\n }\n >\n {remaining === undefined ? (\n <>\n {labelText}\n {children}\n </>\n ) : (\n <>\n Undo <span data-aui=\"button-countdown\">{remaining}</span>\n <span data-aui=\"button-undo-status\" role=\"status\">\n {labelText} in {UNDO_WINDOW_SECONDS} seconds\n </span>\n </>\n )}\n </button>\n );\n}\n\nexport const interactiveVocabulary = {\n Button: {\n description:\n \"A clickable button. Carries `$action` describing the side effect or resume value. Set `submit` to submit an ancestor Form/Card instead of firing `$action` on click.\",\n properties: z.object({\n label: z.string().describe(\"Button label.\"),\n buttonStyle: z.enum(BUTTON_STYLES).optional().describe(\"Visual style.\"),\n block: z\n .boolean()\n .optional()\n .describe(\"Whether the button spans the full width.\"),\n submit: z\n .boolean()\n .optional()\n .describe(\n \"Render as a submit button for an ancestor Form/Card instead of a click button.\",\n ),\n undoable: z\n .boolean()\n .optional()\n .describe(\n \"Delay the action with an undo control, for sends and other hard-to-reverse actions.\",\n ),\n }),\n render: ButtonRender,\n },\n Select: {\n description:\n \"A dropdown selector. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n options: z.array(optionSchema).describe(\"Selectable options.\"),\n placeholder: z\n .string()\n .optional()\n .describe(\"Placeholder shown when nothing is selected.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n defaultValue: z.string().optional().describe(\"Initially selected value.\"),\n }),\n render: SelectRender,\n },\n Input: {\n description:\n \"A text input. Carries `$action` describing the on-submit behavior.\",\n properties: z.object({\n inputType: z\n .enum([\"text\", \"password\", \"number\"])\n .optional()\n .describe(\"Single-line input type. Values remain strings.\"),\n placeholder: z.string().optional().describe(\"Placeholder text.\"),\n multiline: z\n .boolean()\n .optional()\n .describe(\n 'Render a textarea instead of a single-line input; ignored when `inputType` is `\"password\"` or `\"number\"`.',\n ),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n defaultValue: z.string().optional().describe(\"Initial text.\"),\n }),\n render: InputRender,\n },\n DatePicker: {\n description:\n \"A date, datetime, or time input. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n inputType: z\n .enum([\"date\", \"datetime\", \"time\"])\n .optional()\n .describe(\n 'Temporal input type. Defaults to \"date\". Values remain strings.',\n ),\n value: z\n .string()\n .optional()\n .describe(\n \"Initial value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. A datetime with Z or ±HH:mm is an instant, displayed in the viewer's time zone and submitted with the same offset and precision. A datetime without an offset is local and submitted unchanged. An empty datetime submits with the viewer's offset and seconds.\",\n ),\n min: z\n .string()\n .optional()\n .describe(\n \"Minimum value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. Datetimes with Z or ±HH:mm are converted to the viewer's time zone.\",\n ),\n max: z\n .string()\n .optional()\n .describe(\n \"Maximum value: YYYY-MM-DD for date, HH:mm or HH:mm:ss with optional fraction of at most 9 digits for time, YYYY-MM-DDTHH:mm with optional :ss and fraction of at most 9 digits for datetime. Datetimes with Z or ±HH:mm are converted to the viewer's time zone.\",\n ),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n }),\n render: DatePickerRender,\n },\n Checkbox: {\n description:\n \"A checkbox with a label. Carries `$action` describing the on-change behavior.\",\n properties: z.object({\n label: z.string().describe(\"Label text next to the checkbox.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n defaultChecked: z\n .boolean()\n .optional()\n .describe(\"Whether the checkbox starts checked.\"),\n variant: z\n .enum([\"checkbox\", \"switch\"])\n .optional()\n .describe(\"Whether to render a checkbox or switch.\"),\n }),\n render: CheckboxRender,\n },\n Slider: {\n description:\n \"A numeric range control. Carries `$action` describing the committed value.\",\n properties: z.object({\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n min: z.number().describe(\"Minimum value.\"),\n max: z.number().describe(\"Maximum value.\"),\n step: z.number().optional().describe(\"Value increment. Defaults to 1.\"),\n defaultValue: z.number().optional().describe(\"Initial value.\"),\n unit: z.string().optional().describe(\"Unit shown with the value.\"),\n }),\n render: SliderRender,\n },\n RadioGroup: {\n description:\n \"A group of mutually exclusive radio options. Carries `$action` describing the on-change behavior.\",\n properties: z.object({\n options: z.array(describedOptionSchema).describe(\"Selectable options.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n label: z.string().optional().describe(\"Accessible name for the group.\"),\n defaultValue: z.string().optional().describe(\"Initially selected value.\"),\n }),\n render: RadioGroupRender,\n },\n CheckboxGroup: {\n description:\n \"A group of checkbox options where any number can be checked. Carries `$action` describing the on-change behavior.\",\n properties: z.object({\n options: z.array(describedOptionSchema).describe(\"Selectable options.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n label: z.string().optional().describe(\"Accessible name for the group.\"),\n defaultValue: z\n .array(z.string())\n .optional()\n .describe(\"Initially checked values.\"),\n }),\n render: CheckboxGroupRender,\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}