@kitn.ai/ui 0.26.0 → 0.27.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 (474) hide show
  1. package/README.md +16 -5
  2. package/bin/mcp.js +16 -3
  3. package/bin/route.js +23 -0
  4. package/bin/route.test.js +58 -0
  5. package/dist/{elements/chunks/Icon--Y8vsFal.js → Icon-BnFKqqtY.js} +1 -1
  6. package/dist/action-icons-CBskfBMz.js +1 -0
  7. package/dist/arrow-down-Br0qtpsz.js +1 -0
  8. package/dist/arrow-left-Dj7xgE12.js +1 -0
  9. package/dist/artifact-CvXEm1lS.js +1 -0
  10. package/dist/assets/dev-5XzXYR21.js +91 -0
  11. package/dist/attachments-C43ZegEq.js +1 -0
  12. package/dist/{elements/chunks/audio-visualizer-D7lB6mvR.js → audio-visualizer-B-79y1Tj.js} +1 -1
  13. package/dist/badge-BpUbq8c0.js +1 -0
  14. package/dist/bash-InADTalH.js +1 -6
  15. package/dist/bell-sn17Ip9v.js +1 -0
  16. package/dist/{elements/chunks/button-flUbeufF.js → button-BH6rN0U-.js} +1 -1
  17. package/dist/card-renderer-Cb1gQmth.js +1 -0
  18. package/dist/card-routing-DifQgS7n.js +1 -0
  19. package/dist/check-DPeeMUYx.js +1 -0
  20. package/dist/checkbox-Dc9Yov_B.js +1 -0
  21. package/dist/checkbox-group-B1kDLLYk.js +1 -0
  22. package/dist/chevron-down-CHSWk7ZT.js +1 -0
  23. package/dist/chevron-right-B7l_fMgx.js +1 -0
  24. package/dist/choice-card-BT3c1S8g.js +1 -0
  25. package/dist/circle-Bb0yOpqM.js +1 -0
  26. package/dist/circle-check-BGZpCiz7.js +1 -0
  27. package/dist/circle-x-wobWkoSx.js +1 -0
  28. package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
  29. package/dist/{elements/chunks/code-block-BdLiTitd.js → code-block-CUQ5mtv0.js} +1 -1
  30. package/dist/{elements/chunks/collapsible-BzbXpPzr.js → collapsible-CPJbf6FM.js} +1 -1
  31. package/dist/components/attachment-types.d.ts +7 -0
  32. package/dist/components/audio-visualizer/fit-scale.d.ts +1 -1
  33. package/dist/components/card-renderer.d.ts +13 -0
  34. package/dist/components/card.d.ts +4 -0
  35. package/dist/components/chat-thread.d.ts +46 -1
  36. package/dist/components/conversation-item.d.ts +19 -7
  37. package/dist/components/conversation-list.d.ts +17 -5
  38. package/dist/components/form-widgets.d.ts +67 -2
  39. package/dist/components/form.d.ts +48 -1
  40. package/dist/components/message.d.ts +25 -3
  41. package/dist/components/reasoning.d.ts +6 -0
  42. package/dist/components/scroll-button.d.ts +11 -0
  43. package/dist/components/thread.d.ts +5 -0
  44. package/dist/components/tool-types.d.ts +9 -0
  45. package/dist/composer-CjngLzal.js +106 -0
  46. package/dist/confirm-card-DCx_A4bU.js +1 -0
  47. package/dist/construct-cli.es.js +1169 -0
  48. package/dist/{elements/chunks/context-VLIL3sJ-.js → context-BY8V-Nlp.js} +1 -1
  49. package/dist/controllable-D43BKmtX.js +1 -0
  50. package/dist/conversation-list-D4lLU_yS.js +1 -0
  51. package/dist/copy-B6DO4PqB.js +1 -0
  52. package/dist/core-AYMC6_lb.js +12 -5874
  53. package/dist/{create-tween-CQED4T0g.js → create-tween-BPzaefTp.js} +1 -1
  54. package/dist/{create-tween-BFT6c-Y8.js → create-tween-CnMHviKB.js} +1 -1
  55. package/dist/{create-tween-CJNlzoaO.js → create-tween-D1aiGZZh.js} +1 -1
  56. package/dist/{elements/chunks/create-tween-c4Z8TDYz.js → create-tween-DUSQUKpr.js} +2 -2
  57. package/dist/css-M7EaDHN_.js +1 -6
  58. package/dist/custom-elements.json +1400 -218
  59. package/dist/default-input-CucQEOqH.js +1 -0
  60. package/dist/define-CGGX-7Vg.js +1 -0
  61. package/dist/define.d.ts +4 -0
  62. package/dist/define.js +510 -0
  63. package/dist/define.server.d.ts +5 -0
  64. package/dist/define.server.js +506 -0
  65. package/dist/{elements/chunks/disclosure-CcNbyLy0.js → disclosure-CbLtajUQ.js} +1 -1
  66. package/dist/{elements/chunks/dropdown-BgWTthUx.js → dropdown-BwhViJFd.js} +1 -1
  67. package/dist/elements/agent-card.js +1 -1
  68. package/dist/elements/artifact.js +1 -1
  69. package/dist/elements/attachments.js +1 -1
  70. package/dist/elements/audio-visualizer.js +1 -1
  71. package/dist/elements/autoloader.js +1 -1
  72. package/dist/elements/avatar.js +1 -1
  73. package/dist/elements/badge.js +1 -1
  74. package/dist/elements/button.js +1 -1
  75. package/dist/elements/card.js +1 -1
  76. package/dist/elements/cards.js +1 -1
  77. package/dist/elements/chain-of-thought.js +1 -1
  78. package/dist/elements/chat-scope-picker.js +1 -1
  79. package/dist/elements/chat-workspace.js +1 -1
  80. package/dist/elements/chat.js +1 -1
  81. package/dist/elements/checkbox-group.d.ts +1 -0
  82. package/dist/elements/checkbox-group.js +1 -0
  83. package/dist/elements/checkbox.d.ts +1 -0
  84. package/dist/elements/checkbox.js +1 -0
  85. package/dist/elements/checkpoint.js +1 -1
  86. package/dist/elements/choice.js +1 -1
  87. package/dist/elements/coachmark.js +1 -1
  88. package/dist/elements/code-block.js +1 -1
  89. package/dist/elements/command.js +1 -1
  90. package/dist/elements/compare.js +1 -1
  91. package/dist/elements/composer.js +1 -1
  92. package/dist/elements/confirm-card.js +1 -1
  93. package/dist/elements/context-meter.js +1 -1
  94. package/dist/elements/conversation-item.js +1 -1
  95. package/dist/elements/conversation-list.js +1 -1
  96. package/dist/elements/define-entry.d.ts +12 -0
  97. package/dist/elements/dialog.js +1 -1
  98. package/dist/elements/dock.js +101 -7
  99. package/dist/elements/dropdown.js +1 -1
  100. package/dist/elements/editable-label.js +1 -1
  101. package/dist/elements/element-data-types.d.ts +37 -0
  102. package/dist/elements/embed.js +1 -1
  103. package/dist/elements/empty.js +1 -1
  104. package/dist/elements/feedback-bar.js +1 -1
  105. package/dist/elements/file-tree.js +1 -1
  106. package/dist/elements/file-upload.js +1 -1
  107. package/dist/elements/form.js +1 -1
  108. package/dist/elements/hover-card.js +1 -1
  109. package/dist/elements/icon.js +1 -1
  110. package/dist/elements/image.js +1 -1
  111. package/dist/elements/input.js +1 -1
  112. package/dist/elements/kbd.js +1 -1
  113. package/dist/elements/link-preview.js +1 -1
  114. package/dist/elements/loader.js +1 -1
  115. package/dist/elements/markdown.js +1 -1
  116. package/dist/elements/menu.js +1 -1
  117. package/dist/elements/message-skills.js +1 -1
  118. package/dist/elements/message.js +1 -1
  119. package/dist/elements/model-switcher.js +1 -1
  120. package/dist/elements/nav.js +1 -1
  121. package/dist/elements/notice.js +1 -1
  122. package/dist/elements/pane-grid.d.ts +1 -0
  123. package/dist/elements/pane-grid.js +1 -0
  124. package/dist/elements/pane-group.js +1 -1
  125. package/dist/elements/pane.js +1 -1
  126. package/dist/elements/popover.js +1 -1
  127. package/dist/elements/progress-bar.js +1 -1
  128. package/dist/elements/prompt-dock.js +1 -1
  129. package/dist/elements/prompt-input.js +1 -1
  130. package/dist/elements/prompt-suggestions.js +1 -1
  131. package/dist/elements/radio-group.d.ts +1 -0
  132. package/dist/elements/radio-group.js +1 -0
  133. package/dist/elements/reasoning.js +1 -1
  134. package/dist/elements/remote.js +1 -1
  135. package/dist/elements/resizable.js +1 -1
  136. package/dist/elements/response-stream.js +2 -2
  137. package/dist/elements/screen.js +1 -1
  138. package/dist/elements/scroll-area.js +1 -1
  139. package/dist/elements/scroll-button.js +1 -1
  140. package/dist/elements/search.js +1 -1
  141. package/dist/elements/segmented.js +1 -1
  142. package/dist/elements/select.d.ts +1 -0
  143. package/dist/elements/select.js +1 -0
  144. package/dist/elements/separator.js +1 -1
  145. package/dist/elements/setting-item.js +1 -1
  146. package/dist/elements/settings-group.js +1 -1
  147. package/dist/elements/skeleton.js +1 -1
  148. package/dist/elements/slider.d.ts +1 -0
  149. package/dist/elements/slider.js +1 -0
  150. package/dist/elements/slots.d.ts +1 -1
  151. package/dist/elements/source.js +1 -1
  152. package/dist/elements/status.js +1 -1
  153. package/dist/elements/switch.js +1 -1
  154. package/dist/elements/tabs.js +1 -1
  155. package/dist/elements/tasks.js +1 -1
  156. package/dist/elements/text-shimmer.js +1 -1
  157. package/dist/elements/thinking-bar.js +1 -1
  158. package/dist/elements/thread.js +1 -1
  159. package/dist/elements/toast.js +1 -1
  160. package/dist/elements/tool.js +1 -1
  161. package/dist/elements/tooltip.js +1 -1
  162. package/dist/elements/voice-input.js +1 -1
  163. package/dist/elements/voice-output.js +1 -1
  164. package/dist/elements.d.ts +362 -24
  165. package/dist/{elements/chunks/ellipsis-7gU33mL2.js → ellipsis-DFr4Vqr3.js} +1 -1
  166. package/dist/embed-5s_vU4J0.js +1 -0
  167. package/dist/engine-javascript-vq0WuIJl.js +14 -2516
  168. package/dist/{elements/chunks/external-link-CSOEsNlx.js → external-link-u9d85ORQ.js} +1 -1
  169. package/dist/file-text-CX7_x42o.js +1 -0
  170. package/dist/{elements/chunks/file-tree-zvB2i7P9.js → file-tree-D3kBjXI5.js} +1 -1
  171. package/dist/folder-V-YdIL8f.js +1 -0
  172. package/dist/form-BRNUMCN2.js +1 -0
  173. package/dist/github-dark-dimmed-DUshB20C.js +1 -4
  174. package/dist/github-light-JYsPkUQd.js +1 -4
  175. package/dist/hover-card-DaeiYrTA.js +1 -0
  176. package/dist/html-CPZ3oZQ7.js +1 -10
  177. package/dist/icon-BpixdZNq.js +1 -0
  178. package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
  179. package/dist/index.d.ts +1 -1
  180. package/dist/index.js +7330 -5852
  181. package/dist/index.server.js +5823 -4759
  182. package/dist/info-8mFsIjS3.js +1 -0
  183. package/dist/input-d1Yuu-hz.js +1 -0
  184. package/dist/javascript-C25yR2R2.js +1 -6
  185. package/dist/json-DxJze_jm.js +1 -6
  186. package/dist/kai.es.js +1 -1
  187. package/dist/kbd-961zMPFB.js +1 -0
  188. package/dist/link-DlZZBGaR.js +1 -0
  189. package/dist/{elements/chunks/link-preview-OQ9IEq0f.js → link-preview-DIIbV2Sd.js} +1 -1
  190. package/dist/loader-YQszHFaW.js +1 -0
  191. package/dist/{elements/chunks/markdown-DgBFaGAz.js → markdown-CVk1MPsj.js} +1 -1
  192. package/dist/mcp.es.js +1285 -79
  193. package/dist/message-CwKVEdZg.js +1 -0
  194. package/dist/message-DS8lzHc1.js +1 -0
  195. package/dist/message-circle-Xf8Q-vZp.js +1 -0
  196. package/dist/message-square-Cxnwgkns.js +1 -0
  197. package/dist/{elements/chunks/minimize-2-DPIUKTrT.js → minimize-2-UEZmP2QT.js} +1 -1
  198. package/dist/{elements/chunks/model-switcher-DsT8tFB0.js → model-switcher-Kk1jEQ5t.js} +1 -1
  199. package/dist/{elements/chunks/overlay-DuiwdXjm.js → overlay-C1od6LOz.js} +1 -1
  200. package/dist/panel-right-ryET0yyn.js +1 -0
  201. package/dist/paperclip-BDNoZFJP.js +1 -0
  202. package/dist/play-OFIvYXUQ.js +1 -0
  203. package/dist/primitives/card-data-types.d.ts +49 -0
  204. package/dist/primitives/card-routing.d.ts +1 -33
  205. package/dist/primitives/card-validate.d.ts +2 -2
  206. package/dist/primitives/chat-config.d.ts +29 -2
  207. package/dist/primitives/field-mask.d.ts +96 -0
  208. package/dist/primitives/field-semantics.d.ts +36 -0
  209. package/dist/primitives/input-mask.d.ts +46 -0
  210. package/dist/primitives/url-scheme-policy.d.ts +34 -0
  211. package/dist/primitives/use-resize-observer.d.ts +2 -2
  212. package/dist/progress-bar-BvYX0aoy.js +1 -0
  213. package/dist/prompt-suggestion-BRFu2lcu.js +1 -0
  214. package/dist/radio-DcL23cNJ.js +1 -0
  215. package/dist/react/index.d.ts +193 -19
  216. package/dist/react.js +216 -180
  217. package/dist/reasoning-Cackq4Rh.js +1 -0
  218. package/dist/register-impl-C7rENvPK.js +424 -0
  219. package/dist/{elements/chunks/resizable-D181b4fM.js → resizable-Cp9HUYih.js} +1 -1
  220. package/dist/rotate-ccw-0DLRDHH5.js +1 -0
  221. package/dist/rotate-cw-DOB9IGcU.js +1 -0
  222. package/dist/schemas/form.schema.json +21 -1
  223. package/dist/schemas/tool-defs.d.ts +11 -1
  224. package/dist/schemas.js +81 -81
  225. package/dist/scroll-area-emVmWP4K.js +1 -0
  226. package/dist/scroll-button-CeP_gv1x.js +1 -0
  227. package/dist/select-CWmu00tS.js +1 -0
  228. package/dist/{elements/chunks/separator-CeJHQqLW.js → separator-CE6vly6z.js} +1 -1
  229. package/dist/{elements/chunks/settings-CqaHgJF9.js → settings-CE-78SvZ.js} +1 -1
  230. package/dist/{elements/chunks/settings-group-CjqjLCOn.js → settings-group-ZFWNxFQR.js} +1 -1
  231. package/dist/{elements/chunks/skeleton-D8akBnKS.js → skeleton-BebdP4mf.js} +1 -1
  232. package/dist/slider-BAKRYUlz.js +1 -0
  233. package/dist/{solid-BtdqNZI7.js → solid-BE5ui6sy.js} +8727 -7212
  234. package/dist/{solid-CnavwBye.js → solid-DFhsce3O.js} +7015 -5886
  235. package/dist/solid.d.ts +10 -0
  236. package/dist/solid.js +240 -234
  237. package/dist/solid.server.js +240 -234
  238. package/dist/source-B0FlguSx.js +1 -0
  239. package/dist/star-CBMZvLuN.js +1 -0
  240. package/dist/state/index.d.ts +1 -1
  241. package/dist/state/mock.d.ts +32 -2
  242. package/dist/state.js +133 -108
  243. package/dist/{elements/chunks/store-Cjq0qwYN.js → store-7eoadydQ.js} +1 -1
  244. package/dist/svelte--5p79yCD.js +1 -15
  245. package/dist/switch-CViARZCy.js +1 -0
  246. package/dist/tasks-card-MjCcOhR_.js +1 -0
  247. package/dist/text-shimmer-DKlwRF2G.js +1 -0
  248. package/dist/textarea-3ay2Me2-.js +1 -0
  249. package/dist/theme.tokens.css +82 -13
  250. package/dist/{elements/chunks/thumbs-up-DX2Ijk3H.js → thumbs-up-DQcu2HMO.js} +1 -1
  251. package/dist/toast-store-C6yKOhbk.js +1 -0
  252. package/dist/{elements/chunks/tool-DKQ2D1DP.js → tool-BCYNlfKy.js} +1 -1
  253. package/dist/{elements/chunks/tooltip-B0G99y8w.js → tooltip-05zI4hjs.js} +1 -1
  254. package/dist/trash-2-BR1RxGky.js +1 -0
  255. package/dist/{elements/chunks/triangle-alert-F9cyUEyy.js → triangle-alert-DHohDOCy.js} +1 -1
  256. package/dist/tsx-B8rCNbgL.js +1 -6
  257. package/dist/typescript-RycA9KXf.js +1 -6
  258. package/dist/ui/checkbox-group.d.ts +83 -0
  259. package/dist/ui/checkbox.d.ts +40 -0
  260. package/dist/ui/dock.d.ts +22 -0
  261. package/dist/ui/icon.d.ts +3 -0
  262. package/dist/ui/input.d.ts +48 -2
  263. package/dist/ui/radio.d.ts +85 -0
  264. package/dist/ui/select.d.ts +71 -0
  265. package/dist/ui/slider.d.ts +65 -0
  266. package/dist/ui/switch.d.ts +9 -2
  267. package/dist/upload-BbGW6A_u.js +1 -0
  268. package/dist/url-scheme-policy-DHpoTJwB.js +1 -0
  269. package/dist/use-card-resolution-CJW4grFa.js +1 -0
  270. package/dist/{variant-aurora-B8II3-I1.js → variant-aurora-BUOVgPOB.js} +2 -2
  271. package/dist/{variant-aurora-CMNWOSJR.js → variant-aurora-CUsUJvFI.js} +2 -2
  272. package/dist/{variant-aurora-CcuDMWwQ.js → variant-aurora-CW2i4bfr.js} +1 -1
  273. package/dist/{elements/chunks/variant-aurora-qt6Zct8M.js → variant-aurora-xiMPty8f.js} +1 -1
  274. package/dist/{variant-custom-L16JLLZy.js → variant-custom-BQtOnmeO.js} +1 -1
  275. package/dist/{variant-custom-C714mqKl.js → variant-custom-CAm9L-E5.js} +2 -2
  276. package/dist/{variant-custom-BdvYC7af.js → variant-custom-CAnzzppW.js} +2 -2
  277. package/dist/{elements/chunks/variant-custom-tJp22_BQ.js → variant-custom-D91HjAKz.js} +1 -1
  278. package/dist/{variant-wave-ecwykeyL.js → variant-wave-Ca1Ls4_y.js} +2 -2
  279. package/dist/{variant-wave-D7ruiA1W.js → variant-wave-CxX39DKd.js} +2 -2
  280. package/dist/{elements/chunks/variant-wave-CaQ5ti39.js → variant-wave-DYyzIIZv.js} +1 -1
  281. package/dist/{variant-wave-2S4La2Ka.js → variant-wave-uY5crU_K.js} +1 -1
  282. package/dist/vue-BmIZj4XD.js +1 -33
  283. package/dist/x-C5m1JFgi.js +1 -0
  284. package/frameworks/react/index.tsx +198 -20
  285. package/llms-full.txt +1178 -21
  286. package/llms.txt +6 -3
  287. package/package.json +17 -4
  288. package/src/agent-tooling/catalog/invariants.ts +1 -1
  289. package/src/agent-tooling/catalog/surfaces.ts +72 -0
  290. package/src/agent-tooling/construct/cli-entry.ts +8 -0
  291. package/src/agent-tooling/construct/cli.ts +131 -0
  292. package/src/agent-tooling/construct/codegen.ts +1353 -0
  293. package/src/agent-tooling/construct/construct.v1.schema.json +250 -0
  294. package/src/agent-tooling/construct/dev.ts +148 -0
  295. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
  296. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
  297. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +23 -0
  298. package/src/agent-tooling/construct/schema.ts +371 -0
  299. package/src/agent-tooling/mcp/server.ts +2 -1
  300. package/src/agent-tooling/mcp/tools/construct.ts +130 -0
  301. package/src/agent-tooling/mcp/tools/debug.ts +126 -4
  302. package/src/agent-tooling/mcp/tools/reference.ts +104 -3
  303. package/src/agent-tooling/recipes/composed-thread.ts +714 -0
  304. package/src/agent-tooling/recipes/index.ts +22 -0
  305. package/src/agent-tooling/recipes/types.ts +32 -0
  306. package/src/agent-tooling/registry.ts +5 -0
  307. package/src/components/attachment-types.ts +7 -0
  308. package/src/components/audio-visualizer/fit-scale.ts +1 -1
  309. package/src/components/card-renderer.tsx +39 -8
  310. package/src/components/card.tsx +10 -2
  311. package/src/components/chat-scope-picker.tsx +2 -2
  312. package/src/components/chat-thread.tsx +72 -9
  313. package/src/components/choice-card.tsx +102 -37
  314. package/src/components/coachmark.tsx +1 -1
  315. package/src/components/code-block.tsx +2 -2
  316. package/src/components/composer.tsx +89 -15
  317. package/src/components/confirm-card.tsx +20 -4
  318. package/src/components/conversation-item.tsx +33 -9
  319. package/src/components/conversation-list.tsx +25 -10
  320. package/src/components/empty.tsx +14 -3
  321. package/src/components/file-tree.tsx +5 -1
  322. package/src/components/form-widgets.tsx +257 -195
  323. package/src/components/form.tsx +297 -9
  324. package/src/components/loader.tsx +12 -5
  325. package/src/components/message-skills.tsx +1 -1
  326. package/src/components/message.tsx +71 -11
  327. package/src/components/prompt-input.tsx +7 -1
  328. package/src/components/prompt-suggestion.tsx +4 -1
  329. package/src/components/reasoning.tsx +30 -3
  330. package/src/components/response-compare.tsx +2 -2
  331. package/src/components/scroll-button.tsx +56 -4
  332. package/src/components/source.tsx +6 -1
  333. package/src/components/tasks-card.tsx +58 -16
  334. package/src/components/thread.tsx +10 -1
  335. package/src/components/toast.tsx +1 -1
  336. package/src/components/tool-types.ts +9 -0
  337. package/src/elements/attachments.tsx +3 -1
  338. package/src/elements/chat-workspace.tsx +1 -1
  339. package/src/elements/chat.tsx +22 -4
  340. package/src/elements/checkbox-group.tsx +164 -0
  341. package/src/elements/checkbox.tsx +134 -0
  342. package/src/elements/compiled.css +1 -1
  343. package/src/elements/composer.tsx +12 -1
  344. package/src/elements/conversation-item.tsx +62 -22
  345. package/src/elements/conversation-list.tsx +2 -2
  346. package/src/elements/define-entry.ts +12 -0
  347. package/src/elements/dock.tsx +11 -0
  348. package/src/elements/element-data-types.ts +40 -0
  349. package/src/elements/element-manifest.json +24 -0
  350. package/src/elements/element-meta.json +736 -46
  351. package/src/elements/element-nonscalar.json +15 -0
  352. package/src/elements/element-types.d.ts +362 -24
  353. package/src/elements/feedback-bar.tsx +5 -0
  354. package/src/elements/icon-names.json +29 -0
  355. package/src/elements/input.tsx +312 -23
  356. package/src/elements/message.tsx +2 -0
  357. package/src/elements/pane-grid.tsx +111 -0
  358. package/src/elements/prompt-input.tsx +8 -2
  359. package/src/elements/radio-group.tsx +129 -0
  360. package/src/elements/register-impl.ts +6 -0
  361. package/src/elements/scroll-button.tsx +54 -6
  362. package/src/elements/select.tsx +165 -0
  363. package/src/elements/slider.tsx +171 -0
  364. package/src/elements/slots.ts +1 -1
  365. package/src/elements/styles.css +89 -3
  366. package/src/elements/thread.tsx +2 -0
  367. package/src/elements/toast.tsx +14 -1
  368. package/src/index.ts +2 -1
  369. package/src/primitives/card-data-types.ts +49 -0
  370. package/src/primitives/card-host.tsx +4 -2
  371. package/src/primitives/card-routing.ts +7 -56
  372. package/src/primitives/card-schemas/form.schema.json +21 -1
  373. package/src/primitives/card-validate.ts +10 -2
  374. package/src/primitives/chat-config.tsx +33 -6
  375. package/src/primitives/field-mask.ts +256 -0
  376. package/src/primitives/field-semantics.ts +115 -0
  377. package/src/primitives/input-mask.ts +853 -0
  378. package/src/primitives/toast-store.ts +66 -4
  379. package/src/primitives/url-scheme-policy.ts +70 -0
  380. package/src/primitives/use-resize-observer.ts +2 -2
  381. package/src/schemas/tool-defs.ts +12 -2
  382. package/src/solid.ts +10 -0
  383. package/src/state/index.ts +1 -1
  384. package/src/state/mock.ts +92 -6
  385. package/src/ui/agent-card.tsx +2 -2
  386. package/src/ui/avatar.tsx +1 -1
  387. package/src/ui/checkbox-group.tsx +153 -0
  388. package/src/ui/checkbox.tsx +63 -0
  389. package/src/ui/dock.tsx +145 -6
  390. package/src/ui/icon.tsx +53 -0
  391. package/src/ui/input.tsx +249 -9
  392. package/src/ui/kbd.tsx +1 -1
  393. package/src/ui/nav.tsx +1 -1
  394. package/src/ui/pane-group.tsx +2 -2
  395. package/src/ui/radio.tsx +150 -0
  396. package/src/ui/select.tsx +168 -0
  397. package/src/ui/slider.tsx +178 -0
  398. package/src/ui/switch.tsx +49 -18
  399. package/src/utils/cn.ts +11 -5
  400. package/theme.css +84 -13
  401. package/dist/elements/chunks/action-icons-D9u3OzYW.js +0 -1
  402. package/dist/elements/chunks/arrow-left-CVh1TeN7.js +0 -1
  403. package/dist/elements/chunks/artifact-BkYcfIlZ.js +0 -1
  404. package/dist/elements/chunks/attachments-DwfNlubq.js +0 -1
  405. package/dist/elements/chunks/badge-Q0-Cmwzz.js +0 -1
  406. package/dist/elements/chunks/bash-InADTalH.js +0 -1
  407. package/dist/elements/chunks/card-renderer-3Dyl-FpN.js +0 -1
  408. package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
  409. package/dist/elements/chunks/check-B5kBPKeo.js +0 -1
  410. package/dist/elements/chunks/chevron-down-DZ1GS39h.js +0 -1
  411. package/dist/elements/chunks/chevron-right-CvP7OUd2.js +0 -1
  412. package/dist/elements/chunks/choice-card-D4QUIOWZ.js +0 -1
  413. package/dist/elements/chunks/circle-CDf9g6MQ.js +0 -1
  414. package/dist/elements/chunks/circle-check-CA47Nqbz.js +0 -1
  415. package/dist/elements/chunks/circle-x-CJ_HVbC8.js +0 -1
  416. package/dist/elements/chunks/composer-Byve-n8K.js +0 -69
  417. package/dist/elements/chunks/confirm-card-B0flE3MN.js +0 -1
  418. package/dist/elements/chunks/controllable-DTwTIlwp.js +0 -1
  419. package/dist/elements/chunks/conversation-item-BDztezOG.js +0 -1
  420. package/dist/elements/chunks/copy-Nf-kqxXH.js +0 -1
  421. package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
  422. package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
  423. package/dist/elements/chunks/default-input-C2iLFq0b.js +0 -1
  424. package/dist/elements/chunks/define-wjHR1MkU.js +0 -1
  425. package/dist/elements/chunks/download-C4V7tBdb.js +0 -1
  426. package/dist/elements/chunks/embed-D3KewsIJ.js +0 -1
  427. package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
  428. package/dist/elements/chunks/file-text-D1G8khle.js +0 -1
  429. package/dist/elements/chunks/folder-WW2LGLid.js +0 -1
  430. package/dist/elements/chunks/form-CQirdC4W.js +0 -1
  431. package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
  432. package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
  433. package/dist/elements/chunks/hover-card-CJJkfHTK.js +0 -1
  434. package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
  435. package/dist/elements/chunks/icon-Cfgmf4fa.js +0 -1
  436. package/dist/elements/chunks/info-DX3YMOt6.js +0 -1
  437. package/dist/elements/chunks/input-BtW9U6Sq.js +0 -1
  438. package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
  439. package/dist/elements/chunks/json-DxJze_jm.js +0 -1
  440. package/dist/elements/chunks/kbd-LGXwuT_V.js +0 -1
  441. package/dist/elements/chunks/link-2My69BqT.js +0 -1
  442. package/dist/elements/chunks/loader-iOxc_Tu-.js +0 -1
  443. package/dist/elements/chunks/message-VMZohrXx.js +0 -1
  444. package/dist/elements/chunks/message-circle-CpXMM-_n.js +0 -1
  445. package/dist/elements/chunks/message-square-DxcWtETQ.js +0 -1
  446. package/dist/elements/chunks/message-tZmV2A3p.js +0 -1
  447. package/dist/elements/chunks/paperclip-CRZVp4z_.js +0 -1
  448. package/dist/elements/chunks/progress-bar-DNy66e_E.js +0 -1
  449. package/dist/elements/chunks/prompt-suggestion-Bn64Nl7L.js +0 -1
  450. package/dist/elements/chunks/reasoning-Emn9N4-T.js +0 -1
  451. package/dist/elements/chunks/rotate-cw-CPWe37D9.js +0 -1
  452. package/dist/elements/chunks/scroll-area-ClZkZxIk.js +0 -1
  453. package/dist/elements/chunks/scroll-button-DPE-t3x_.js +0 -1
  454. package/dist/elements/chunks/share-CyfnNEqp.js +0 -1
  455. package/dist/elements/chunks/source-UWCvmVak.js +0 -1
  456. package/dist/elements/chunks/star-DoHFAikQ.js +0 -1
  457. package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
  458. package/dist/elements/chunks/tasks-card-CmZ5xh6v.js +0 -1
  459. package/dist/elements/chunks/text-shimmer-DYn09zrz.js +0 -1
  460. package/dist/elements/chunks/textarea-skiGHURM.js +0 -1
  461. package/dist/elements/chunks/toast-store-CFnQpThX.js +0 -1
  462. package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
  463. package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
  464. package/dist/elements/chunks/use-card-resolution-DoA2f_EU.js +0 -1
  465. package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
  466. package/dist/elements/chunks/x-B6UnOiLw.js +0 -1
  467. package/dist/llms/llms-full.txt +0 -2949
  468. package/dist/llms/llms.txt +0 -156
  469. package/dist/register-impl-DpE7icIb.js +0 -293
  470. package/dist/ui/stat.d.ts +0 -16
  471. package/src/ui/stat.tsx +0 -41
  472. /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
  473. /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
  474. /package/dist/{elements/chunks/slots-DaNjX0rc.js → slots-DaNjX0rc.js} +0 -0
@@ -378,7 +378,7 @@
378
378
  "type": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
379
379
  "optional": true,
380
380
  "scalar": false,
381
- "description": "The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array).",
381
+ "description": "The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews here but the wire encoders (`toOpenAIMessages`/`toAnthropicMessages`) refuse it.",
382
382
  "typeName": "AttachmentData[]",
383
383
  "typeShape": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
384
384
  "default": "[]",
@@ -1183,14 +1183,14 @@
1183
1183
  },
1184
1184
  {
1185
1185
  "name": "policy",
1186
- "type": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1186
+ "type": "undefined | { onSubmit?: undefined | ((cardId: string, data: unknown) => void); onAction?: undefined | ((cardId: string, action: string, payload?: unknown) => void); onSendPrompt?: undefined | ((text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void); onOpen?: undefined | ((url: string, target: \"tab\" | \"artifact\") => void); onState?: undefined | ((cardId: string, patch: unknown) => void); onDismiss?: undefined | ((cardId: string) => void); onReopen?: undefined | ((cardId: string) => void); onError?: undefined | ((cardId: string, message: string) => void); maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1187
1187
  "optional": true,
1188
1188
  "scalar": false,
1189
1189
  "description": "Optional CardPolicy handling child events. Property: `el.policy`.",
1190
1190
  "typeName": "CardPolicy",
1191
- "typeShape": "{ onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1191
+ "typeShape": "{ onSubmit?: undefined | ((cardId: string, data: unknown) => void); onAction?: undefined | ((cardId: string, action: string, payload?: unknown) => void); onSendPrompt?: undefined | ((text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void); onOpen?: undefined | ((url: string, target: \"tab\" | \"artifact\") => void); onState?: undefined | ((cardId: string, patch: unknown) => void); onDismiss?: undefined | ((cardId: string) => void); onReopen?: undefined | ((cardId: string) => void); onError?: undefined | ((cardId: string, message: string) => void); maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1192
1192
  "typeImport": "CardPolicy",
1193
- "displayType": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }"
1193
+ "displayType": "undefined | { onSubmit?: undefined | ((cardId: string, data: unknown) => void); onAction?: undefined | ((cardId: string, action: string, payload?: unknown) => void); onSendPrompt?: undefined | ((text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void); onOpen?: undefined | ((url: string, target: \"tab\" | \"artifact\") => void); onState?: undefined | ((cardId: string, patch: unknown) => void); onDismiss?: undefined | ((cardId: string) => void); onReopen?: undefined | ((cardId: string) => void); onError?: undefined | ((cardId: string, message: string) => void); maxSendPromptMode?: undefined | \"compose\" | \"send\" }"
1194
1194
  },
1195
1195
  {
1196
1196
  "name": "validateCards",
@@ -1433,6 +1433,22 @@
1433
1433
  "default": "true",
1434
1434
  "displayType": "undefined | false | true"
1435
1435
  },
1436
+ {
1437
+ "name": "reasoning",
1438
+ "type": "undefined | \"full\" | \"compact\" | \"off\"",
1439
+ "optional": true,
1440
+ "scalar": true,
1441
+ "description": "How `reasoning` parts render across the thread. `'full'` (default) is the current collapsible-disclosure behavior; `'compact'` shows only a shimmer loader while a reasoning part streams and nothing once it settles (no expandable detail); `'off'` renders reasoning parts not at all. Forwarded to every `MessageBody` as `reasoningMode`.",
1442
+ "displayType": "undefined | \"full\" | \"compact\" | \"off\""
1443
+ },
1444
+ {
1445
+ "name": "reasoningOpen",
1446
+ "type": "undefined | false | true",
1447
+ "optional": true,
1448
+ "scalar": true,
1449
+ "description": "Seeds the reasoning disclosure open AND keeps it tracking the stream (open while streaming, closes when it settles): the pre-Task-19f `full` behavior. Default false/absent: the panel starts closed (just the \"Thinking\" shimmer chip) and only opens on click, the current default (owner ruling, 2026-08-26). Meaningless when `reasoning` is `'compact'` or `'off'`. Forwarded to every `MessageBody` as `reasoningDefaultOpen`.",
1450
+ "displayType": "undefined | false | true"
1451
+ },
1436
1452
  {
1437
1453
  "name": "chatTitle",
1438
1454
  "type": "undefined | string",
@@ -1544,6 +1560,15 @@
1544
1560
  "description": "INJECT: footer row below the composer (disclaimers, token meter, …).",
1545
1561
  "displayType": "undefined | false | true"
1546
1562
  },
1563
+ {
1564
+ "name": "attach",
1565
+ "type": "undefined | false | true",
1566
+ "optional": true,
1567
+ "scalar": true,
1568
+ "description": "When `false`, hides the built-in paperclip attach button. Defaults to `true` (undeclared keeps today's behavior: attach visible), matching `DefaultPromptInput`'s own default: only an explicit `false` hides it.",
1569
+ "default": "true",
1570
+ "displayType": "undefined | false | true"
1571
+ },
1547
1572
  {
1548
1573
  "name": "webSearch",
1549
1574
  "type": "undefined | false | true",
@@ -1788,6 +1813,202 @@
1788
1813
  }
1789
1814
  ]
1790
1815
  },
1816
+ {
1817
+ "tag": "kai-checkbox",
1818
+ "className": "KaiCheckboxElement",
1819
+ "displayName": "Checkbox",
1820
+ "props": [
1821
+ {
1822
+ "name": "theme",
1823
+ "type": "\"light\" | \"dark\" | \"auto\"",
1824
+ "optional": true,
1825
+ "scalar": true,
1826
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1827
+ "default": "'auto'",
1828
+ "universal": true,
1829
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1830
+ },
1831
+ {
1832
+ "name": "checked",
1833
+ "type": "undefined | false | true",
1834
+ "optional": true,
1835
+ "scalar": true,
1836
+ "description": "Controlled checked state. Settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-checkbox checked>`) drives it; ticking the box updates it and fires `kai-change`. Read `el.checked` for live state.",
1837
+ "displayType": "undefined | false | true"
1838
+ },
1839
+ {
1840
+ "name": "defaultChecked",
1841
+ "type": "undefined | false | true",
1842
+ "optional": true,
1843
+ "scalar": true,
1844
+ "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on.",
1845
+ "displayType": "undefined | false | true"
1846
+ },
1847
+ {
1848
+ "name": "indeterminate",
1849
+ "type": "undefined | false | true",
1850
+ "optional": true,
1851
+ "scalar": true,
1852
+ "description": "The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`.",
1853
+ "displayType": "undefined | false | true"
1854
+ },
1855
+ {
1856
+ "name": "disabled",
1857
+ "type": "undefined | false | true",
1858
+ "optional": true,
1859
+ "scalar": true,
1860
+ "description": "Disable interaction.",
1861
+ "displayType": "undefined | false | true"
1862
+ },
1863
+ {
1864
+ "name": "required",
1865
+ "type": "undefined | false | true",
1866
+ "optional": true,
1867
+ "scalar": true,
1868
+ "description": "Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's.",
1869
+ "displayType": "undefined | false | true"
1870
+ },
1871
+ {
1872
+ "name": "label",
1873
+ "type": "undefined | string",
1874
+ "optional": true,
1875
+ "scalar": true,
1876
+ "description": "Accessible label. The visible text beside the box is the consumer's to render.",
1877
+ "displayType": "undefined | string"
1878
+ },
1879
+ {
1880
+ "name": "name",
1881
+ "type": "undefined | string",
1882
+ "optional": true,
1883
+ "scalar": true,
1884
+ "description": "Form-control name (paired with `value`).",
1885
+ "displayType": "undefined | string"
1886
+ },
1887
+ {
1888
+ "name": "value",
1889
+ "type": "undefined | string",
1890
+ "optional": true,
1891
+ "scalar": true,
1892
+ "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`.",
1893
+ "displayType": "undefined | string"
1894
+ }
1895
+ ],
1896
+ "events": [
1897
+ {
1898
+ "name": "kai-change",
1899
+ "detail": "{ checked: false | true }",
1900
+ "description": "The box was ticked or unticked.",
1901
+ "displayDetail": "{ checked: false | true }"
1902
+ }
1903
+ ],
1904
+ "methods": [
1905
+ {
1906
+ "name": "toggle",
1907
+ "params": "",
1908
+ "returns": "void",
1909
+ "description": "Flip the box and fire `kai-change` (no-op while disabled)."
1910
+ },
1911
+ {
1912
+ "name": "focus",
1913
+ "params": "options?: FocusOptions",
1914
+ "returns": "void",
1915
+ "description": "Focus the inner input (the host element can't reach it)."
1916
+ }
1917
+ ],
1918
+ "composedFrom": [
1919
+ {
1920
+ "name": "Checkbox",
1921
+ "group": "UI",
1922
+ "storyId": "solid-advanced-primitives-checkbox--docs"
1923
+ }
1924
+ ],
1925
+ "tokens": []
1926
+ },
1927
+ {
1928
+ "tag": "kai-checkbox-group",
1929
+ "className": "KaiCheckboxGroupElement",
1930
+ "displayName": "CheckboxGroup",
1931
+ "props": [
1932
+ {
1933
+ "name": "theme",
1934
+ "type": "\"light\" | \"dark\" | \"auto\"",
1935
+ "optional": true,
1936
+ "scalar": true,
1937
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1938
+ "default": "'auto'",
1939
+ "universal": true,
1940
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1941
+ },
1942
+ {
1943
+ "name": "options",
1944
+ "type": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]",
1945
+ "optional": false,
1946
+ "scalar": false,
1947
+ "description": "The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them.",
1948
+ "typeName": "KaiCheckboxOption[]",
1949
+ "typeShape": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]",
1950
+ "default": "[]",
1951
+ "typeImport": "KaiCheckboxOption",
1952
+ "displayType": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]"
1953
+ },
1954
+ {
1955
+ "name": "value",
1956
+ "type": "undefined | string",
1957
+ "optional": true,
1958
+ "scalar": true,
1959
+ "description": "The FIRST selected value. Settable and reflected to the `value` attribute, so `:host([value])` and `el.value` see live state, and a seed can be written in markup. Writing it makes that the whole selection; to read or drive the rest, use `el.values`.",
1960
+ "displayType": "undefined | string"
1961
+ },
1962
+ {
1963
+ "name": "name",
1964
+ "type": "undefined | string",
1965
+ "optional": true,
1966
+ "scalar": true,
1967
+ "description": "The shared form-control name every box carries, so `FormData.getAll(name)` reads the whole selection back under one key. NO DEFAULT, unlike `<kai-radio-group>`. A radio set needs a shared `name` for the browser to make it exclusive and arrow-navigable, so one is generated when none is given; checkboxes are independent controls and behave correctly with no name at all. Generating one here would submit the selection under a random key, which is worse than submitting nothing. The element is NOT form-associated (no `ElementInternals`, no `setFormValue()`), the same known gap `<kai-input>` records: the boxes live in a shadow root, so a surrounding `<form>` collects nothing from them whether or not `name` is set. Read `el.values`. The name still lands on every inner input, so it is right the day form association arrives.",
1968
+ "displayType": "undefined | string"
1969
+ },
1970
+ {
1971
+ "name": "disabled",
1972
+ "type": "undefined | false | true",
1973
+ "optional": true,
1974
+ "scalar": true,
1975
+ "description": "Disable every row. Individual rows carry their own `disabled`.",
1976
+ "displayType": "undefined | false | true"
1977
+ },
1978
+ {
1979
+ "name": "label",
1980
+ "type": "undefined | string",
1981
+ "optional": true,
1982
+ "scalar": true,
1983
+ "description": "Accessible name for the group.",
1984
+ "displayType": "undefined | string"
1985
+ }
1986
+ ],
1987
+ "events": [
1988
+ {
1989
+ "name": "kai-change",
1990
+ "detail": "{ value: string; values: string[] }",
1991
+ "description": "A row was ticked or unticked. `values` is the whole selection after the change, which is what a multi-select control needs; `value` is the first of them (empty when nothing is selected). Both are always present, so neither shape silently loses the other. This is `<kai-select>`'s detail, deliberately.",
1992
+ "displayDetail": "{ value: string; values: string[] }"
1993
+ }
1994
+ ],
1995
+ "methods": [
1996
+ {
1997
+ "name": "focus",
1998
+ "params": "options?: FocusOptions",
1999
+ "returns": "void",
2000
+ "description": "Focus the group's first box. Not \"the first ticked one\", which is `<kai-radio-group>`'s rule: a radio group is ONE tab stop that lands on the selection, while every checkbox here is its own tab stop, so the entry point is simply the top of the list."
2001
+ }
2002
+ ],
2003
+ "composedFrom": [
2004
+ {
2005
+ "name": "CheckboxGroup",
2006
+ "group": "UI",
2007
+ "storyId": "solid-advanced-primitives-checkboxgroup--docs"
2008
+ }
2009
+ ],
2010
+ "tokens": []
2011
+ },
1791
2012
  {
1792
2013
  "tag": "kai-checkpoint",
1793
2014
  "className": "KaiCheckpointElement",
@@ -2577,7 +2798,7 @@
2577
2798
  {
2578
2799
  "name": "kai-submit",
2579
2800
  "detail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }",
2580
- "description": "The user submitted the composer (Enter or programmatic submit).",
2801
+ "description": "The user submitted the composer (Enter or programmatic submit). Note the detail carries no `attachments`; `<kai-composer>` is the bare editing surface: no send button, toolbar, or attachments. For a drop-in composer row with all three, reach for `<kai-prompt-input>`, which is built on this.",
2581
2802
  "displayDetail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }"
2582
2803
  },
2583
2804
  {
@@ -2874,7 +3095,7 @@
2874
3095
  "type": "undefined | string",
2875
3096
  "optional": true,
2876
3097
  "scalar": true,
2877
- "description": "The row's identity, handed to the container's selection contract. In the element this is the `conversation-id` attribute (host `id` is the fallback).",
3098
+ "description": "The row's identity: the `conversation-id` attribute (host `id` is the fallback). Inside `<kai-conversations>` it is handed to the container's selection contract (`kai-conversation-select`); standalone it is the `id` in this element's own `kai-select` detail.",
2878
3099
  "displayType": "undefined | string"
2879
3100
  },
2880
3101
  {
@@ -2882,7 +3103,7 @@
2882
3103
  "type": "undefined | false | true",
2883
3104
  "optional": true,
2884
3105
  "scalar": true,
2885
- "description": "Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; the container drives it from its `activeId`.",
3106
+ "description": "Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; inside a container the container drives it from its `activeId`, standalone you set it yourself.",
2886
3107
  "displayType": "undefined | false | true"
2887
3108
  },
2888
3109
  {
@@ -2894,7 +3115,14 @@
2894
3115
  "displayType": "undefined | false | true"
2895
3116
  }
2896
3117
  ],
2897
- "events": [],
3118
+ "events": [
3119
+ {
3120
+ "name": "kai-select",
3121
+ "detail": "{ id: string }",
3122
+ "description": "STANDALONE activation only: the row was activated (click, Enter or Space on its body) while the item is NOT a direct child of `<kai-conversations>`. `id` is the row's identity: the `conversation-id` attribute, else the host `id`. Inside a container this never fires: activation surfaces once, as `kai-conversation-select` on the container.",
3123
+ "displayDetail": "{ id: string }"
3124
+ }
3125
+ ],
2898
3126
  "methods": [],
2899
3127
  "composedFrom": [
2900
3128
  {
@@ -3125,7 +3353,7 @@
3125
3353
  "id"
3126
3354
  ],
3127
3355
  "text": true,
3128
- "description": "Parse a single light-DOM `<kai-conversation>` element into a `ConversationSummary`. Attribute mapping: - `id` → ConversationSummary.id - `group-id` → ConversationSummary.groupId (optional) - textContent → ConversationSummary.title Fields not expressible as HTML attributes are NOT fabricated (F-10): the optional `scope` and `lastMessageAt` stay absent, and the required `messageCount`/`updatedAt` get honest defaults — zero messages, and an empty `updatedAt` from which no trailing relative time is derived (the epoch it used to fabricate rendered a bogus \"many days ago\" on every declarative row)."
3356
+ "description": "Parse a single light-DOM `<kai-conversation>` element into a `ConversationSummary`. Attribute mapping: - `id` → ConversationSummary.id - `group-id` → ConversationSummary.groupId (optional) - textContent → ConversationSummary.title Fields not expressible as HTML attributes are NOT fabricated: the optional `scope` and `lastMessageAt` stay absent, and the required `messageCount`/`updatedAt` get honest defaults — zero messages, and an empty `updatedAt` from which no trailing relative time is derived (the epoch it used to fabricate rendered a bogus \"many days ago\" on every declarative row)."
3129
3357
  }
3130
3358
  ],
3131
3359
  "slots": [
@@ -3372,6 +3600,14 @@
3372
3600
  "description": "Disable the launcher; `show()` and `toggle()` are gated on it.",
3373
3601
  "displayType": "undefined | false | true"
3374
3602
  },
3603
+ {
3604
+ "name": "hideClose",
3605
+ "type": "undefined | false | true",
3606
+ "optional": true,
3607
+ "scalar": true,
3608
+ "description": "Suppress the dock's own built-in mobile close X. Set this when your slotted panel content supplies its own close affordance (e.g. a `<kai-chat slot=\"header-end\">` close button), otherwise the two stack. TRADEOFF: the mobile panel reserves a padding band above its content so the built-in X never paints over slotted content; that band stays reserved unless you set this true, so only set it once your own control is actually in place. Attribute: `hide-close`.",
3609
+ "displayType": "undefined | false | true"
3610
+ },
3375
3611
  {
3376
3612
  "name": "focusOnOpen",
3377
3613
  "type": "undefined | \"content\" | \"panel\" | \"none\"",
@@ -4141,14 +4377,14 @@
4141
4377
  },
4142
4378
  {
4143
4379
  "name": "data",
4144
- "type": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
4380
+ "type": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number; \"x-kai-format\"?: undefined | \"tel\" | \"ssn\" | \"credit-card\" | \"custom\"; \"x-kai-mask\"?: undefined | string; \"x-kai-mask-guide\"?: undefined | string }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
4145
4381
  "optional": true,
4146
4382
  "scalar": false,
4147
4383
  "description": "The form definition: a JSON Schema (`type:'object'`) + `x-kai-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitn.ai/ui` for the full shape. It IS self-referential (`FormField.properties` is another `FormField` map), and the generated `element-types.d.ts` inlines every named type, so the shipped declaration bottoms out in a `Record<string, unknown>` placeholder one level down rather than carrying the recursion. That is why `FormDefinition` is a `type` alias: an interface gets no implicit index signature, so it would not be assignable to that placeholder.",
4148
4384
  "typeName": "FormDefinition",
4149
- "typeShape": "{ type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
4385
+ "typeShape": "{ type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number; \"x-kai-format\"?: undefined | \"tel\" | \"ssn\" | \"credit-card\" | \"custom\"; \"x-kai-mask\"?: undefined | string; \"x-kai-mask-guide\"?: undefined | string }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
4150
4386
  "typeImport": "FormDefinition",
4151
- "displayType": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }"
4387
+ "displayType": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number; \"x-kai-format\"?: undefined | \"tel\" | \"ssn\" | \"credit-card\" | \"custom\"; \"x-kai-mask\"?: undefined | string; \"x-kai-mask-guide\"?: undefined | string }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }"
4152
4388
  },
4153
4389
  {
4154
4390
  "name": "cardId",
@@ -4513,7 +4749,7 @@
4513
4749
  "type": "undefined | string",
4514
4750
  "optional": true,
4515
4751
  "scalar": true,
4516
- "description": "Controlled value. Settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state.",
4752
+ "description": "Controlled value, and always the CANONICAL one when a mask is active: digits for `tel` / `ssn` / `credit-card`, the formatted text for `custom`. Settable and reflected to the `value` attribute. `el.value = '5551234567'` drives it (no event) and is re-fitted to the mask on the way in, so the field shows `555-123-4567`. Read `el.value` for live state; the formatted text rides along on every `kai-input` / `kai-change` detail as `formattedValue`.",
4517
4753
  "displayType": "undefined | string"
4518
4754
  },
4519
4755
  {
@@ -4612,20 +4848,66 @@
4612
4848
  "scalar": true,
4613
4849
  "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`).",
4614
4850
  "displayType": "undefined | string"
4851
+ },
4852
+ {
4853
+ "name": "format",
4854
+ "type": "undefined | string",
4855
+ "optional": true,
4856
+ "scalar": true,
4857
+ "description": "Mask pattern: `#` a digit, `@` a letter or digit, `*` an obscurable letter or digit, and every other character a positional literal (`@@@-####` → `CHG-4821`). The literal `default` is the opt-in sentinel: it resolves to the default format of `semantic` (`tel` → `###-###-####`). A bare `semantic` never starts masking on its own, so an opt-in token is what turns tier 2 on.",
4858
+ "displayType": "undefined | string"
4859
+ },
4860
+ {
4861
+ "name": "guide",
4862
+ "type": "undefined | string",
4863
+ "optional": true,
4864
+ "scalar": true,
4865
+ "description": "Placeholder guide shown at unfilled positions, aligned position for position with `format`: `mm/dd/yyyy` against `##/##/####`. Spaces are a valid guide character, so a guide of blanks and separators is how a phone field shows its shape without showing letters. Without a guide the field shows only up to the last typed character. A guide is a visual aid, never an accessible name: keep the `hint` text as well.",
4866
+ "displayType": "undefined | string"
4867
+ },
4868
+ {
4869
+ "name": "semantic",
4870
+ "type": "undefined | \"credit-card\" | \"custom\" | \"ssn\" | \"tel\"",
4871
+ "optional": true,
4872
+ "scalar": true,
4873
+ "description": "Semantic field type: `tel` · `ssn` · `credit-card` · `custom`. On its own it sets `inputmode` / `autocomplete` / `spellcheck` / `autocorrect` / `autocapitalize` and decides the canonical value; it never starts masking by itself.",
4874
+ "displayType": "undefined | \"credit-card\" | \"custom\" | \"ssn\" | \"tel\""
4875
+ },
4876
+ {
4877
+ "name": "caseMode",
4878
+ "type": "undefined | \"preserve\" | \"upper\" | \"lower\"",
4879
+ "optional": true,
4880
+ "scalar": true,
4881
+ "description": "Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`.",
4882
+ "displayType": "undefined | \"preserve\" | \"upper\" | \"lower\""
4883
+ },
4884
+ {
4885
+ "name": "copyPolicy",
4886
+ "type": "undefined | \"formatted\" | \"canonical\" | \"obscured\" | \"blocked\"",
4887
+ "optional": true,
4888
+ "scalar": true,
4889
+ "description": "What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`.",
4890
+ "displayType": "undefined | \"formatted\" | \"canonical\" | \"obscured\" | \"blocked\""
4615
4891
  }
4616
4892
  ],
4617
4893
  "events": [
4618
4894
  {
4619
4895
  "name": "kai-change",
4620
- "detail": "{ value: string }",
4621
- "description": "The value was committed (blur).",
4622
- "displayDetail": "{ value: string }"
4896
+ "detail": "{ value: string; formattedValue: string }",
4897
+ "description": "The value was committed (blur). Same detail shape as `kai-input`.",
4898
+ "displayDetail": "{ value: string; formattedValue: string }"
4623
4899
  },
4624
4900
  {
4625
4901
  "name": "kai-input",
4626
- "detail": "{ value: string }",
4627
- "description": "The value changed per keystroke.",
4628
- "displayDetail": "{ value: string }"
4902
+ "detail": "{ value: string; formattedValue: string }",
4903
+ "description": "The value changed per keystroke. `value` is the canonical value (what a backend wants); `formattedValue` is the text on screen. With no mask the two are equal.",
4904
+ "displayDetail": "{ value: string; formattedValue: string }"
4905
+ },
4906
+ {
4907
+ "name": "kai-input-rejected",
4908
+ "detail": "{ reason: \"full\" | \"wrong-class\" | \"over-capacity\" | \"format-change-clipped\"; data: string }",
4909
+ "description": "A mask refused, or partly refused, some content. The reasons are `full` (no free position left), `wrong-class` (a letter into a digit position), `over-capacity` (a paste longer than the mask holds; what fits was kept), and `format-change-clipped` (the `format` changed under a value that no longer fits). `data` is the content that was refused. The first three are USER-INPUT errors, and are the ones worth announcing in a polite live region. `format-change-clipped` is not one: it follows the app changing its own configuration, so it reports and nothing more. None of the four touches validity, so `invalid` and `error` stay the consumer decision.",
4910
+ "displayDetail": "{ reason: \"full\" | \"wrong-class\" | \"over-capacity\" | \"format-change-clipped\"; data: string }"
4629
4911
  }
4630
4912
  ],
4631
4913
  "methods": [
@@ -4641,11 +4923,23 @@
4641
4923
  "returns": "void",
4642
4924
  "description": "Select the inner input's text."
4643
4925
  },
4926
+ {
4927
+ "name": "getRawValue",
4928
+ "params": "",
4929
+ "returns": "string",
4930
+ "description": "The canonical value: digits for `tel` / `ssn` / `credit-card`, the formatted text for `custom`, and the field text when no mask is on. Identical to reading `el.value`, under the name backends use for the submitted form of a masked field. The mask engine has a third, narrower notion of raw (the fill characters with no literals at all) and that one is internal: it is not what any backend wants and it is not exposed here."
4931
+ },
4932
+ {
4933
+ "name": "getFormattedValue",
4934
+ "params": "",
4935
+ "returns": "string",
4936
+ "description": "The text on screen, literals and guide included. The counterpart to `formattedValue` on the `kai-input` / `kai-change` details, for a consumer that needs it outside an event."
4937
+ },
4644
4938
  {
4645
4939
  "name": "clear",
4646
4940
  "params": "",
4647
4941
  "returns": "void",
4648
- "description": "Empty the value and fire `kai-change` with `''`."
4942
+ "description": "Empty the value and fire `kai-change` with `''`. On a masked field this resets the mask itself, not just the text on screen, so the next character starts over."
4649
4943
  }
4650
4944
  ],
4651
4945
  "composedFrom": [
@@ -5843,9 +6137,9 @@
5843
6137
  ]
5844
6138
  },
5845
6139
  {
5846
- "tag": "kai-pane-group",
5847
- "className": "KaiPaneGroupElement",
5848
- "displayName": "PaneGroup",
6140
+ "tag": "kai-pane-grid",
6141
+ "className": "KaiPaneGridElement",
6142
+ "displayName": "PaneGrid",
5849
6143
  "props": [
5850
6144
  {
5851
6145
  "name": "theme",
@@ -5858,31 +6152,98 @@
5858
6152
  "displayType": "\"light\" | \"dark\" | \"auto\""
5859
6153
  },
5860
6154
  {
5861
- "name": "tabs",
5862
- "type": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
6155
+ "name": "minPaneWidth",
6156
+ "type": "undefined | number",
5863
6157
  "optional": true,
5864
- "scalar": false,
5865
- "description": "The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute).",
5866
- "typeName": "PaneTab[]",
5867
- "typeShape": "{ id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
5868
- "typeImport": "PaneTab",
5869
- "displayType": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]"
6158
+ "scalar": true,
6159
+ "description": "Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`.",
6160
+ "displayType": "undefined | number"
5870
6161
  },
5871
6162
  {
5872
- "name": "active",
5873
- "type": "undefined | string",
6163
+ "name": "minPaneHeight",
6164
+ "type": "undefined | number",
5874
6165
  "optional": true,
5875
6166
  "scalar": true,
5876
- "description": "The active tab id (controlled, and reflected to the `active` ATTRIBUTE so `::part`/`[active]` selectors and the per-tab named slot follow it). Set it as the `active` attribute or drive it from `kai-tab-change`; omit for uncontrolled (the first tab).",
5877
- "displayType": "undefined | string"
6167
+ "description": "Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`.",
6168
+ "displayType": "undefined | number"
5878
6169
  },
5879
6170
  {
5880
- "name": "focused",
5881
- "type": "undefined | false | true",
6171
+ "name": "maxColumns",
6172
+ "type": "undefined | number",
5882
6173
  "optional": true,
5883
6174
  "scalar": true,
5884
- "description": "Highlight the frame as the ACTIVE group in a multi-group layout. Attribute: `focused`.",
5885
- "default": "false",
6175
+ "description": "Column cap when the container is wide (default `3`). Attribute: `max-columns`.",
6176
+ "displayType": "undefined | number"
6177
+ },
6178
+ {
6179
+ "name": "gap",
6180
+ "type": "undefined | string",
6181
+ "optional": true,
6182
+ "scalar": true,
6183
+ "description": "Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`.",
6184
+ "displayType": "undefined | string"
6185
+ },
6186
+ {
6187
+ "name": "maximizedIndex",
6188
+ "type": "undefined | number | null",
6189
+ "optional": true,
6190
+ "scalar": false,
6191
+ "description": "When set to a valid child index, render ONLY that pane full-bleed: a simple maximize hook the consumer drives (pair it with `<kai-pane>`'s `kai-maximize` event). Clear it (or point out of range) for the full tiled grid. Attribute: `maximized-index`.",
6192
+ "displayType": "undefined | number | null"
6193
+ }
6194
+ ],
6195
+ "events": [],
6196
+ "methods": [],
6197
+ "composedFrom": [
6198
+ {
6199
+ "name": "PaneGrid",
6200
+ "group": "UI",
6201
+ "storyId": "solid-advanced-primitives-panegrid--docs"
6202
+ }
6203
+ ],
6204
+ "tokens": []
6205
+ },
6206
+ {
6207
+ "tag": "kai-pane-group",
6208
+ "className": "KaiPaneGroupElement",
6209
+ "displayName": "PaneGroup",
6210
+ "props": [
6211
+ {
6212
+ "name": "theme",
6213
+ "type": "\"light\" | \"dark\" | \"auto\"",
6214
+ "optional": true,
6215
+ "scalar": true,
6216
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6217
+ "default": "'auto'",
6218
+ "universal": true,
6219
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6220
+ },
6221
+ {
6222
+ "name": "tabs",
6223
+ "type": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
6224
+ "optional": true,
6225
+ "scalar": false,
6226
+ "description": "The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute).",
6227
+ "typeName": "PaneTab[]",
6228
+ "typeShape": "{ id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
6229
+ "typeImport": "PaneTab",
6230
+ "displayType": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]"
6231
+ },
6232
+ {
6233
+ "name": "active",
6234
+ "type": "undefined | string",
6235
+ "optional": true,
6236
+ "scalar": true,
6237
+ "description": "The active tab id (controlled, and reflected to the `active` ATTRIBUTE so `::part`/`[active]` selectors and the per-tab named slot follow it). Set it as the `active` attribute or drive it from `kai-tab-change`; omit for uncontrolled (the first tab).",
6238
+ "displayType": "undefined | string"
6239
+ },
6240
+ {
6241
+ "name": "focused",
6242
+ "type": "undefined | false | true",
6243
+ "optional": true,
6244
+ "scalar": true,
6245
+ "description": "Highlight the frame as the ACTIVE group in a multi-group layout. Attribute: `focused`.",
6246
+ "default": "false",
5886
6247
  "displayType": "undefined | false | true"
5887
6248
  }
5888
6249
  ],
@@ -6338,7 +6699,7 @@
6338
6699
  "type": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
6339
6700
  "optional": true,
6340
6701
  "scalar": false,
6341
- "description": "Attachments to seed the input with (so a consumer can pre-populate staged files without an upload). Set as a JS property; the element then manages its own attachment state from there (add via the paperclip, remove per chip).",
6702
+ "description": "Attachments to seed the input with (so a consumer can pre-populate staged files without an upload). Set as a JS property; the element then manages its own attachment state from there (add via the paperclip, remove per chip). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews perfectly and is meaningless outside this tab, so `toOpenAIMessages`/`toAnthropicMessages` refuse it. (The built-in paperclip already stages files as `data:` URIs.)",
6342
6703
  "typeName": "AttachmentData[]",
6343
6704
  "typeShape": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
6344
6705
  "typeImport": "AttachmentData",
@@ -6380,7 +6741,7 @@
6380
6741
  {
6381
6742
  "name": "kai-submit",
6382
6743
  "detail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[]; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
6383
- "description": "The user submitted the prompt (Enter or send button). `value` is the flattened text (back-compat); `doc` is the structured document and `entities` the inserted pills (skills/agents) for downstream expansion.",
6744
+ "description": "The user submitted the prompt (Enter or send button). `value` is the flattened text (back-compat); `doc` is the structured document and `entities` the inserted pills (skills/agents) for downstream expansion. `<kai-prompt-input>` is the batteries-included composer row (send button, toolbar, attachment staging) built on `<kai-composer>`, the bare editor.",
6384
6745
  "displayDetail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[]; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
6385
6746
  },
6386
6747
  {
@@ -6536,6 +6897,91 @@
6536
6897
  }
6537
6898
  ]
6538
6899
  },
6900
+ {
6901
+ "tag": "kai-radio-group",
6902
+ "className": "KaiRadioGroupElement",
6903
+ "displayName": "RadioGroup",
6904
+ "props": [
6905
+ {
6906
+ "name": "theme",
6907
+ "type": "\"light\" | \"dark\" | \"auto\"",
6908
+ "optional": true,
6909
+ "scalar": true,
6910
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6911
+ "default": "'auto'",
6912
+ "universal": true,
6913
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6914
+ },
6915
+ {
6916
+ "name": "options",
6917
+ "type": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]",
6918
+ "optional": false,
6919
+ "scalar": false,
6920
+ "description": "The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute.",
6921
+ "typeName": "KaiRadioOption[]",
6922
+ "typeShape": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]",
6923
+ "default": "[]",
6924
+ "typeImport": "KaiRadioOption",
6925
+ "displayType": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]"
6926
+ },
6927
+ {
6928
+ "name": "value",
6929
+ "type": "undefined | string",
6930
+ "optional": true,
6931
+ "scalar": true,
6932
+ "description": "Controlled selected `value`. Settable and reflected to the `value` attribute. `el.value = 'degraded'` drives it; choosing a row updates it and fires `kai-change`. Read `el.value` for live state.",
6933
+ "displayType": "undefined | string"
6934
+ },
6935
+ {
6936
+ "name": "name",
6937
+ "type": "undefined | string",
6938
+ "optional": true,
6939
+ "scalar": true,
6940
+ "description": "Shared form-control name for every radio in the group. Defaults to a generated id, so the group is exclusive and keyboard-navigable even when nothing is submitted.",
6941
+ "displayType": "undefined | string"
6942
+ },
6943
+ {
6944
+ "name": "disabled",
6945
+ "type": "undefined | false | true",
6946
+ "optional": true,
6947
+ "scalar": true,
6948
+ "description": "Disable every row. Individual rows carry their own `disabled`.",
6949
+ "displayType": "undefined | false | true"
6950
+ },
6951
+ {
6952
+ "name": "label",
6953
+ "type": "undefined | string",
6954
+ "optional": true,
6955
+ "scalar": true,
6956
+ "description": "Accessible name for the group.",
6957
+ "displayType": "undefined | string"
6958
+ }
6959
+ ],
6960
+ "events": [
6961
+ {
6962
+ "name": "kai-change",
6963
+ "detail": "{ value: string }",
6964
+ "description": "A row was chosen.",
6965
+ "displayDetail": "{ value: string }"
6966
+ }
6967
+ ],
6968
+ "methods": [
6969
+ {
6970
+ "name": "focus",
6971
+ "params": "options?: FocusOptions",
6972
+ "returns": "void",
6973
+ "description": "Focus the group's tab stop. That is the selected radio, or the first row when nothing is selected yet."
6974
+ }
6975
+ ],
6976
+ "composedFrom": [
6977
+ {
6978
+ "name": "RadioGroup",
6979
+ "group": "UI",
6980
+ "storyId": "solid-advanced-primitives-radiogroup--docs"
6981
+ }
6982
+ ],
6983
+ "tokens": []
6984
+ },
6539
6985
  {
6540
6986
  "tag": "kai-reasoning",
6541
6987
  "className": "KaiReasoningElement",
@@ -7322,6 +7768,22 @@
7322
7768
  "description": "Button size token. Defaults to `'icon'` (square).",
7323
7769
  "default": "'icon'",
7324
7770
  "displayType": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
7771
+ },
7772
+ {
7773
+ "name": "label",
7774
+ "type": "undefined | string",
7775
+ "optional": true,
7776
+ "scalar": true,
7777
+ "description": "The button's accessible name. It is announced whether or not the label is visible, so the text is always localisable. Defaults to `'Scroll to bottom'`.",
7778
+ "displayType": "undefined | string"
7779
+ },
7780
+ {
7781
+ "name": "showLabel",
7782
+ "type": "undefined | false | true",
7783
+ "optional": true,
7784
+ "scalar": true,
7785
+ "description": "Also render `label` visibly beside the icon. Defaults to `false`, which is the icon-only button. When the text is visible it IS the accessible name, so nothing gets announced twice.",
7786
+ "displayType": "undefined | false | true"
7325
7787
  }
7326
7788
  ],
7327
7789
  "events": [
@@ -7555,6 +8017,123 @@
7555
8017
  }
7556
8018
  ]
7557
8019
  },
8020
+ {
8021
+ "tag": "kai-select",
8022
+ "className": "KaiSelectElement",
8023
+ "displayName": "Select",
8024
+ "props": [
8025
+ {
8026
+ "name": "theme",
8027
+ "type": "\"light\" | \"dark\" | \"auto\"",
8028
+ "optional": true,
8029
+ "scalar": true,
8030
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8031
+ "default": "'auto'",
8032
+ "universal": true,
8033
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8034
+ },
8035
+ {
8036
+ "name": "options",
8037
+ "type": "{ value: string; label?: undefined | string; disabled?: undefined | false | true }[]",
8038
+ "optional": false,
8039
+ "scalar": false,
8040
+ "description": "The choices, in display order. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them.",
8041
+ "typeName": "KaiSelectOption[]",
8042
+ "typeShape": "{ value: string; label?: undefined | string; disabled?: undefined | false | true }[]",
8043
+ "default": "[]",
8044
+ "typeImport": "KaiSelectOption",
8045
+ "displayType": "{ value: string; label?: undefined | string; disabled?: undefined | false | true }[]"
8046
+ },
8047
+ {
8048
+ "name": "value",
8049
+ "type": "undefined | string",
8050
+ "optional": true,
8051
+ "scalar": true,
8052
+ "description": "Controlled selected value. Settable and reflected to the `value` attribute. `el.value = 'high'` drives it; choosing an option updates it and fires `kai-change`. Read `el.value` for live state; for a `multiple` select read `el.values` instead.",
8053
+ "displayType": "undefined | string"
8054
+ },
8055
+ {
8056
+ "name": "placeholder",
8057
+ "type": "undefined | string",
8058
+ "optional": true,
8059
+ "scalar": true,
8060
+ "description": "Text for a leading, disabled, empty option: the \"nothing chosen yet\" row. Omitted means no such row at all; there is no default wording, because inventing one would put words in your UI.",
8061
+ "displayType": "undefined | string"
8062
+ },
8063
+ {
8064
+ "name": "multiple",
8065
+ "type": "undefined | false | true",
8066
+ "optional": true,
8067
+ "scalar": true,
8068
+ "description": "Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn.",
8069
+ "displayType": "undefined | false | true"
8070
+ },
8071
+ {
8072
+ "name": "invalid",
8073
+ "type": "undefined | false | true",
8074
+ "optional": true,
8075
+ "scalar": true,
8076
+ "description": "Force the invalid (destructive-border) state.",
8077
+ "displayType": "undefined | false | true"
8078
+ },
8079
+ {
8080
+ "name": "disabled",
8081
+ "type": "undefined | false | true",
8082
+ "optional": true,
8083
+ "scalar": true,
8084
+ "description": "Disable interaction.",
8085
+ "displayType": "undefined | false | true"
8086
+ },
8087
+ {
8088
+ "name": "required",
8089
+ "type": "undefined | false | true",
8090
+ "optional": true,
8091
+ "scalar": true,
8092
+ "description": "Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's.",
8093
+ "displayType": "undefined | false | true"
8094
+ },
8095
+ {
8096
+ "name": "label",
8097
+ "type": "undefined | string",
8098
+ "optional": true,
8099
+ "scalar": true,
8100
+ "description": "Accessible label for the control.",
8101
+ "displayType": "undefined | string"
8102
+ },
8103
+ {
8104
+ "name": "name",
8105
+ "type": "undefined | string",
8106
+ "optional": true,
8107
+ "scalar": true,
8108
+ "description": "Form-control name, for a native form submit.",
8109
+ "displayType": "undefined | string"
8110
+ }
8111
+ ],
8112
+ "events": [
8113
+ {
8114
+ "name": "kai-change",
8115
+ "detail": "{ value: string; values: string[] }",
8116
+ "description": "A choice was made. `value` is the first selected option (empty when nothing is selected); `values` is every selected option, which is what a `multiple` select needs. Both are always present, so neither shape silently loses the other.",
8117
+ "displayDetail": "{ value: string; values: string[] }"
8118
+ }
8119
+ ],
8120
+ "methods": [
8121
+ {
8122
+ "name": "focus",
8123
+ "params": "options?: FocusOptions",
8124
+ "returns": "void",
8125
+ "description": "Focus the inner select (the host element can't reach it)."
8126
+ }
8127
+ ],
8128
+ "composedFrom": [
8129
+ {
8130
+ "name": "Select",
8131
+ "group": "UI",
8132
+ "storyId": "solid-advanced-primitives-select--docs"
8133
+ }
8134
+ ],
8135
+ "tokens": []
8136
+ },
7558
8137
  {
7559
8138
  "tag": "kai-separator",
7560
8139
  "className": "KaiSeparatorElement",
@@ -7840,6 +8419,117 @@
7840
8419
  }
7841
8420
  ]
7842
8421
  },
8422
+ {
8423
+ "tag": "kai-slider",
8424
+ "className": "KaiSliderElement",
8425
+ "displayName": "Slider",
8426
+ "props": [
8427
+ {
8428
+ "name": "theme",
8429
+ "type": "\"light\" | \"dark\" | \"auto\"",
8430
+ "optional": true,
8431
+ "scalar": true,
8432
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8433
+ "default": "'auto'",
8434
+ "universal": true,
8435
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8436
+ },
8437
+ {
8438
+ "name": "min",
8439
+ "type": "undefined | number",
8440
+ "optional": true,
8441
+ "scalar": true,
8442
+ "description": "Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means.",
8443
+ "displayType": "undefined | number"
8444
+ },
8445
+ {
8446
+ "name": "max",
8447
+ "type": "undefined | number",
8448
+ "optional": true,
8449
+ "scalar": true,
8450
+ "description": "Highest selectable value. Required, for the same reason as `min`.",
8451
+ "displayType": "undefined | number"
8452
+ },
8453
+ {
8454
+ "name": "step",
8455
+ "type": "undefined | number | \"any\"",
8456
+ "optional": true,
8457
+ "scalar": true,
8458
+ "description": "Granularity. Omitted means the native default of 1; `any` means continuous.",
8459
+ "displayType": "undefined | number | \"any\""
8460
+ },
8461
+ {
8462
+ "name": "value",
8463
+ "type": "undefined | number",
8464
+ "optional": true,
8465
+ "scalar": true,
8466
+ "description": "Controlled value. Settable and reflected to the `value` attribute. `el.value = 40` drives it; dragging updates it and fires `kai-input` per step, `kai-change` on release. Read `el.value` for live state.",
8467
+ "displayType": "undefined | number"
8468
+ },
8469
+ {
8470
+ "name": "disabled",
8471
+ "type": "undefined | false | true",
8472
+ "optional": true,
8473
+ "scalar": true,
8474
+ "description": "Disable interaction.",
8475
+ "displayType": "undefined | false | true"
8476
+ },
8477
+ {
8478
+ "name": "label",
8479
+ "type": "undefined | string",
8480
+ "optional": true,
8481
+ "scalar": true,
8482
+ "description": "Accessible label for the slider.",
8483
+ "displayType": "undefined | string"
8484
+ },
8485
+ {
8486
+ "name": "name",
8487
+ "type": "undefined | string",
8488
+ "optional": true,
8489
+ "scalar": true,
8490
+ "description": "Form-control name, for a native form submit.",
8491
+ "displayType": "undefined | string"
8492
+ },
8493
+ {
8494
+ "name": "valueLabel",
8495
+ "type": "undefined | false | true | ((value: number) => string)",
8496
+ "optional": true,
8497
+ "scalar": false,
8498
+ "description": "Show the current value beside the track. Off by default. Two ways in, because one of them is not a scalar. As a bare ATTRIBUTE (`<kai-slider value-label>`) it renders the raw number. As a JS PROPERTY it also accepts a formatter function (`el.valueLabel = (v) => v + '%'`), for a slider that is not counting bare numbers. A function cannot survive an attribute, so that half is property-only. The readout is hidden from assistive tech: the slider already reports the same number, and an exposed copy would be announced twice.",
8499
+ "displayType": "undefined | false | true | ((value: number) => string)"
8500
+ }
8501
+ ],
8502
+ "events": [
8503
+ {
8504
+ "name": "kai-change",
8505
+ "detail": "{ value: number }",
8506
+ "description": "The value was committed: pointer released, or a key press finished.",
8507
+ "displayDetail": "{ value: number }"
8508
+ },
8509
+ {
8510
+ "name": "kai-input",
8511
+ "detail": "{ value: number }",
8512
+ "description": "The thumb moved. Fires per step during a drag or a key press.",
8513
+ "displayDetail": "{ value: number }"
8514
+ }
8515
+ ],
8516
+ "methods": [
8517
+ {
8518
+ "name": "focus",
8519
+ "params": "options?: FocusOptions",
8520
+ "returns": "void",
8521
+ "description": "Focus the inner range input (the host element can't reach it)."
8522
+ }
8523
+ ],
8524
+ "composedFrom": [
8525
+ {
8526
+ "name": "Slider",
8527
+ "group": "UI",
8528
+ "storyId": "solid-advanced-primitives-slider--docs"
8529
+ }
8530
+ ],
8531
+ "tokens": []
8532
+ },
7843
8533
  {
7844
8534
  "tag": "kai-source",
7845
8535
  "className": "KaiSourceElement",
@@ -8806,7 +9496,7 @@
8806
9496
  "type": "undefined | { id: string; message: string; variant?: undefined | \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
8807
9497
  "optional": true,
8808
9498
  "scalar": false,
8809
- "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts.",
9499
+ "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts. Note the handover: the first `toast()` call ADOPTS a region you placed in markup (no second region mounts) and binds the imperative store to this property, replacing any array you set. Drive a region as data OR via `toast()`, not both at once.",
8810
9500
  "typeName": "ToastItem[]",
8811
9501
  "typeShape": "{ id: string; message: string; variant?: undefined | \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
8812
9502
  "default": "[]",
@@ -9118,11 +9808,11 @@
9118
9808
  },
9119
9809
  {
9120
9810
  "name": "transcribe",
9121
- "type": "undefined | (audio: Blob) => Promise<string>",
9811
+ "type": "undefined | ((audio: Blob) => Promise<string>)",
9122
9812
  "optional": true,
9123
9813
  "scalar": false,
9124
9814
  "description": "Transcriber the host supplies: records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event.",
9125
- "displayType": "undefined | (audio: Blob) => Promise<string>"
9815
+ "displayType": "undefined | ((audio: Blob) => Promise<string>)"
9126
9816
  },
9127
9817
  {
9128
9818
  "name": "disabled",
@@ -9241,11 +9931,11 @@
9241
9931
  },
9242
9932
  {
9243
9933
  "name": "synthesize",
9244
- "type": "undefined | (text: string) => Promise<Blob>",
9934
+ "type": "undefined | ((text: string) => Promise<Blob>)",
9245
9935
  "optional": true,
9246
9936
  "scalar": false,
9247
9937
  "description": "TTS model seam the host supplies: given text, returns an audio `Blob` to play. This is a **function-valued property** (`el.synthesize = async text => blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be modelled as a fire-and-forget event, hence a property.",
9248
- "displayType": "undefined | (text: string) => Promise<Blob>"
9938
+ "displayType": "undefined | ((text: string) => Promise<Blob>)"
9249
9939
  },
9250
9940
  {
9251
9941
  "name": "disabled",