@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
@@ -618,7 +618,7 @@
618
618
  "type": {
619
619
  "text": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]"
620
620
  },
621
- "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).",
621
+ "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.",
622
622
  "privacy": "public"
623
623
  },
624
624
  {
@@ -1761,7 +1761,7 @@
1761
1761
  "kind": "field",
1762
1762
  "name": "policy",
1763
1763
  "type": {
1764
- "text": "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\" }"
1764
+ "text": "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\" }"
1765
1765
  },
1766
1766
  "description": "Optional CardPolicy handling child events. Property: `el.policy`.",
1767
1767
  "privacy": "public"
@@ -2095,6 +2095,24 @@
2095
2095
  "description": "Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true.",
2096
2096
  "privacy": "public"
2097
2097
  },
2098
+ {
2099
+ "kind": "field",
2100
+ "name": "reasoning",
2101
+ "type": {
2102
+ "text": "undefined | \"full\" | \"compact\" | \"off\""
2103
+ },
2104
+ "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`.",
2105
+ "privacy": "public"
2106
+ },
2107
+ {
2108
+ "kind": "field",
2109
+ "name": "reasoningOpen",
2110
+ "type": {
2111
+ "text": "undefined | false | true"
2112
+ },
2113
+ "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`.",
2114
+ "privacy": "public"
2115
+ },
2098
2116
  {
2099
2117
  "kind": "field",
2100
2118
  "name": "chatTitle",
@@ -2212,6 +2230,15 @@
2212
2230
  "description": "INJECT: footer row below the composer (disclaimers, token meter, …).",
2213
2231
  "privacy": "public"
2214
2232
  },
2233
+ {
2234
+ "kind": "field",
2235
+ "name": "attach",
2236
+ "type": {
2237
+ "text": "undefined | false | true"
2238
+ },
2239
+ "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.",
2240
+ "privacy": "public"
2241
+ },
2215
2242
  {
2216
2243
  "kind": "field",
2217
2244
  "name": "webSearch",
@@ -2424,6 +2451,22 @@
2424
2451
  },
2425
2452
  "description": "Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true."
2426
2453
  },
2454
+ {
2455
+ "name": "reasoning",
2456
+ "fieldName": "reasoning",
2457
+ "type": {
2458
+ "text": "undefined | \"full\" | \"compact\" | \"off\""
2459
+ },
2460
+ "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`."
2461
+ },
2462
+ {
2463
+ "name": "reasoning-open",
2464
+ "fieldName": "reasoningOpen",
2465
+ "type": {
2466
+ "text": "undefined | false | true"
2467
+ },
2468
+ "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`."
2469
+ },
2427
2470
  {
2428
2471
  "name": "chat-title",
2429
2472
  "fieldName": "chatTitle",
@@ -2512,6 +2555,14 @@
2512
2555
  },
2513
2556
  "description": "INJECT: footer row below the composer (disclaimers, token meter, …)."
2514
2557
  },
2558
+ {
2559
+ "name": "attach",
2560
+ "fieldName": "attach",
2561
+ "type": {
2562
+ "text": "undefined | false | true"
2563
+ },
2564
+ "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."
2565
+ },
2515
2566
  {
2516
2567
  "name": "web-search",
2517
2568
  "fieldName": "webSearch",
@@ -2668,8 +2719,8 @@
2668
2719
  {
2669
2720
  "kind": "class",
2670
2721
  "customElement": true,
2671
- "tagName": "kai-checkpoint",
2672
- "name": "KaiCheckpointElement",
2722
+ "tagName": "kai-checkbox",
2723
+ "name": "KaiCheckboxElement",
2673
2724
  "description": "",
2674
2725
  "members": [
2675
2726
  {
@@ -2683,38 +2734,101 @@
2683
2734
  },
2684
2735
  {
2685
2736
  "kind": "field",
2686
- "name": "label",
2737
+ "name": "checked",
2687
2738
  "type": {
2688
- "text": "undefined | string"
2739
+ "text": "undefined | false | true"
2689
2740
  },
2690
- "description": "Optional text beside the icon.",
2741
+ "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.",
2691
2742
  "privacy": "public"
2692
2743
  },
2693
2744
  {
2694
2745
  "kind": "field",
2695
- "name": "tooltip",
2746
+ "name": "defaultChecked",
2747
+ "type": {
2748
+ "text": "undefined | false | true"
2749
+ },
2750
+ "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on.",
2751
+ "privacy": "public"
2752
+ },
2753
+ {
2754
+ "kind": "field",
2755
+ "name": "indeterminate",
2756
+ "type": {
2757
+ "text": "undefined | false | true"
2758
+ },
2759
+ "description": "The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`.",
2760
+ "privacy": "public"
2761
+ },
2762
+ {
2763
+ "kind": "field",
2764
+ "name": "disabled",
2765
+ "type": {
2766
+ "text": "undefined | false | true"
2767
+ },
2768
+ "description": "Disable interaction.",
2769
+ "privacy": "public"
2770
+ },
2771
+ {
2772
+ "kind": "field",
2773
+ "name": "required",
2774
+ "type": {
2775
+ "text": "undefined | false | true"
2776
+ },
2777
+ "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.",
2778
+ "privacy": "public"
2779
+ },
2780
+ {
2781
+ "kind": "field",
2782
+ "name": "label",
2696
2783
  "type": {
2697
2784
  "text": "undefined | string"
2698
2785
  },
2699
- "description": "Tooltip on hover.",
2786
+ "description": "Accessible label. The visible text beside the box is the consumer's to render.",
2700
2787
  "privacy": "public"
2701
2788
  },
2702
2789
  {
2703
2790
  "kind": "field",
2704
- "name": "variant",
2791
+ "name": "name",
2705
2792
  "type": {
2706
- "text": "undefined | \"ghost\" | \"default\" | \"outline\""
2793
+ "text": "undefined | string"
2707
2794
  },
2708
- "description": "Visual button style.",
2795
+ "description": "Form-control name (paired with `value`).",
2709
2796
  "privacy": "public"
2710
2797
  },
2711
2798
  {
2712
2799
  "kind": "field",
2713
- "name": "size",
2800
+ "name": "value",
2714
2801
  "type": {
2715
- "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
2802
+ "text": "undefined | string"
2716
2803
  },
2717
- "description": "Button size (use an `icon*` size for an icon-only checkpoint).",
2804
+ "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`.",
2805
+ "privacy": "public"
2806
+ },
2807
+ {
2808
+ "kind": "method",
2809
+ "name": "toggle",
2810
+ "return": {
2811
+ "type": {
2812
+ "text": "void"
2813
+ }
2814
+ },
2815
+ "description": "Flip the box and fire `kai-change` (no-op while disabled).",
2816
+ "privacy": "public"
2817
+ },
2818
+ {
2819
+ "kind": "method",
2820
+ "name": "focus",
2821
+ "parameters": [
2822
+ {
2823
+ "name": "options?: FocusOptions"
2824
+ }
2825
+ ],
2826
+ "return": {
2827
+ "type": {
2828
+ "text": "void"
2829
+ }
2830
+ },
2831
+ "description": "Focus the inner input (the host element can't reach it).",
2718
2832
  "privacy": "public"
2719
2833
  }
2720
2834
  ],
@@ -2728,45 +2842,77 @@
2728
2842
  "description": "Color mode (`auto` follows prefers-color-scheme)."
2729
2843
  },
2730
2844
  {
2731
- "name": "label",
2732
- "fieldName": "label",
2845
+ "name": "checked",
2846
+ "fieldName": "checked",
2733
2847
  "type": {
2734
- "text": "undefined | string"
2848
+ "text": "undefined | false | true"
2735
2849
  },
2736
- "description": "Optional text beside the icon."
2850
+ "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."
2737
2851
  },
2738
2852
  {
2739
- "name": "tooltip",
2740
- "fieldName": "tooltip",
2853
+ "name": "default-checked",
2854
+ "fieldName": "defaultChecked",
2855
+ "type": {
2856
+ "text": "undefined | false | true"
2857
+ },
2858
+ "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on."
2859
+ },
2860
+ {
2861
+ "name": "indeterminate",
2862
+ "fieldName": "indeterminate",
2863
+ "type": {
2864
+ "text": "undefined | false | true"
2865
+ },
2866
+ "description": "The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`."
2867
+ },
2868
+ {
2869
+ "name": "disabled",
2870
+ "fieldName": "disabled",
2871
+ "type": {
2872
+ "text": "undefined | false | true"
2873
+ },
2874
+ "description": "Disable interaction."
2875
+ },
2876
+ {
2877
+ "name": "required",
2878
+ "fieldName": "required",
2879
+ "type": {
2880
+ "text": "undefined | false | true"
2881
+ },
2882
+ "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."
2883
+ },
2884
+ {
2885
+ "name": "label",
2886
+ "fieldName": "label",
2741
2887
  "type": {
2742
2888
  "text": "undefined | string"
2743
2889
  },
2744
- "description": "Tooltip on hover."
2890
+ "description": "Accessible label. The visible text beside the box is the consumer's to render."
2745
2891
  },
2746
2892
  {
2747
- "name": "variant",
2748
- "fieldName": "variant",
2893
+ "name": "name",
2894
+ "fieldName": "name",
2749
2895
  "type": {
2750
- "text": "undefined | \"ghost\" | \"default\" | \"outline\""
2896
+ "text": "undefined | string"
2751
2897
  },
2752
- "description": "Visual button style."
2898
+ "description": "Form-control name (paired with `value`)."
2753
2899
  },
2754
2900
  {
2755
- "name": "size",
2756
- "fieldName": "size",
2901
+ "name": "value",
2902
+ "fieldName": "value",
2757
2903
  "type": {
2758
- "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
2904
+ "text": "undefined | string"
2759
2905
  },
2760
- "description": "Button size (use an `icon*` size for an icon-only checkpoint)."
2906
+ "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`."
2761
2907
  }
2762
2908
  ],
2763
2909
  "events": [
2764
2910
  {
2765
- "name": "kai-select",
2911
+ "name": "kai-change",
2766
2912
  "type": {
2767
- "text": "CustomEvent"
2913
+ "text": "CustomEvent<{ checked: false | true }>"
2768
2914
  },
2769
- "description": "The checkpoint was clicked."
2915
+ "description": "The box was ticked or unticked."
2770
2916
  }
2771
2917
  ],
2772
2918
  "cssProperties": []
@@ -2774,8 +2920,8 @@
2774
2920
  {
2775
2921
  "kind": "class",
2776
2922
  "customElement": true,
2777
- "tagName": "kai-choice",
2778
- "name": "KaiChoiceElement",
2923
+ "tagName": "kai-checkbox-group",
2924
+ "name": "KaiCheckboxGroupElement",
2779
2925
  "description": "",
2780
2926
  "members": [
2781
2927
  {
@@ -2789,65 +2935,47 @@
2789
2935
  },
2790
2936
  {
2791
2937
  "kind": "field",
2792
- "name": "data",
2938
+ "name": "options",
2793
2939
  "type": {
2794
- "text": "undefined | { prompt?: undefined | string; options: { id: string; label: string; description?: undefined | string; media?: undefined | { image?: undefined | string; imageAlt?: undefined | string; icon?: undefined | string }; meta?: undefined | string; recommended?: undefined | false | true; disabled?: undefined | false | true; payload?: unknown }[]; allowOther?: undefined | false | true | { label?: undefined | string; placeholder?: undefined | string }; submitLabel?: undefined | string; dismissible?: undefined | false | true }"
2940
+ "text": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]"
2795
2941
  },
2796
- "description": "The choice definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import `ChoiceCardData` from `@kitn.ai/ui` for the full shape.",
2942
+ "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.",
2797
2943
  "privacy": "public"
2798
2944
  },
2799
2945
  {
2800
2946
  "kind": "field",
2801
- "name": "cardId",
2947
+ "name": "value",
2802
2948
  "type": {
2803
2949
  "text": "undefined | string"
2804
2950
  },
2805
- "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
2951
+ "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`.",
2806
2952
  "privacy": "public"
2807
2953
  },
2808
2954
  {
2809
2955
  "kind": "field",
2810
- "name": "heading",
2956
+ "name": "name",
2811
2957
  "type": {
2812
2958
  "text": "undefined | string"
2813
2959
  },
2814
- "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
2815
- "privacy": "public"
2816
- },
2817
- {
2818
- "kind": "field",
2819
- "name": "resolution",
2820
- "type": {
2821
- "text": "undefined | Record<string, unknown>"
2822
- },
2823
- "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
2960
+ "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.",
2824
2961
  "privacy": "public"
2825
2962
  },
2826
2963
  {
2827
2964
  "kind": "field",
2828
- "name": "value",
2965
+ "name": "disabled",
2829
2966
  "type": {
2830
- "text": "undefined | string"
2967
+ "text": "undefined | false | true"
2831
2968
  },
2832
- "description": "Controlled selection: the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
2969
+ "description": "Disable every row. Individual rows carry their own `disabled`.",
2833
2970
  "privacy": "public"
2834
2971
  },
2835
2972
  {
2836
2973
  "kind": "field",
2837
- "name": "defaultValue",
2974
+ "name": "label",
2838
2975
  "type": {
2839
2976
  "text": "undefined | string"
2840
2977
  },
2841
- "description": "Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`.",
2842
- "privacy": "public"
2843
- },
2844
- {
2845
- "kind": "field",
2846
- "name": "disabled",
2847
- "type": {
2848
- "text": "undefined | false | true"
2849
- },
2850
- "description": "Disable the whole radiogroup + Submit (e.g. while the agent is busy). Attribute: `disabled`.",
2978
+ "description": "Accessible name for the group.",
2851
2979
  "privacy": "public"
2852
2980
  },
2853
2981
  {
@@ -2863,39 +2991,294 @@
2863
2991
  "text": "void"
2864
2992
  }
2865
2993
  },
2866
- "description": "Focus the radiogroup roving tab stop (or the Other input when selected).",
2994
+ "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.",
2867
2995
  "privacy": "public"
2996
+ }
2997
+ ],
2998
+ "attributes": [
2999
+ {
3000
+ "name": "theme",
3001
+ "fieldName": "theme",
3002
+ "type": {
3003
+ "text": "\"light\" | \"dark\" | \"auto\""
3004
+ },
3005
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
2868
3006
  },
2869
3007
  {
2870
- "kind": "method",
2871
- "name": "select",
2872
- "parameters": [
2873
- {
2874
- "name": "optionId: string"
2875
- }
2876
- ],
2877
- "return": {
2878
- "type": {
2879
- "text": "void"
2880
- }
3008
+ "name": "value",
3009
+ "fieldName": "value",
3010
+ "type": {
3011
+ "text": "undefined | string"
2881
3012
  },
2882
- "description": "Select an option by id locally: no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally.",
2883
- "privacy": "public"
3013
+ "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`."
2884
3014
  },
2885
3015
  {
2886
- "kind": "method",
2887
- "name": "send",
2888
- "return": {
2889
- "type": {
2890
- "text": "void"
2891
- }
3016
+ "name": "name",
3017
+ "fieldName": "name",
3018
+ "type": {
3019
+ "text": "undefined | string"
2892
3020
  },
2893
- "description": "Submit the current selection: emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary.",
2894
- "privacy": "public"
3021
+ "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."
2895
3022
  },
2896
3023
  {
2897
- "kind": "method",
2898
- "name": "dismiss",
3024
+ "name": "disabled",
3025
+ "fieldName": "disabled",
3026
+ "type": {
3027
+ "text": "undefined | false | true"
3028
+ },
3029
+ "description": "Disable every row. Individual rows carry their own `disabled`."
3030
+ },
3031
+ {
3032
+ "name": "label",
3033
+ "fieldName": "label",
3034
+ "type": {
3035
+ "text": "undefined | string"
3036
+ },
3037
+ "description": "Accessible name for the group."
3038
+ }
3039
+ ],
3040
+ "events": [
3041
+ {
3042
+ "name": "kai-change",
3043
+ "type": {
3044
+ "text": "CustomEvent<{ value: string; values: string[] }>"
3045
+ },
3046
+ "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."
3047
+ }
3048
+ ],
3049
+ "cssProperties": []
3050
+ },
3051
+ {
3052
+ "kind": "class",
3053
+ "customElement": true,
3054
+ "tagName": "kai-checkpoint",
3055
+ "name": "KaiCheckpointElement",
3056
+ "description": "",
3057
+ "members": [
3058
+ {
3059
+ "kind": "field",
3060
+ "name": "theme",
3061
+ "type": {
3062
+ "text": "\"light\" | \"dark\" | \"auto\""
3063
+ },
3064
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3065
+ "privacy": "public"
3066
+ },
3067
+ {
3068
+ "kind": "field",
3069
+ "name": "label",
3070
+ "type": {
3071
+ "text": "undefined | string"
3072
+ },
3073
+ "description": "Optional text beside the icon.",
3074
+ "privacy": "public"
3075
+ },
3076
+ {
3077
+ "kind": "field",
3078
+ "name": "tooltip",
3079
+ "type": {
3080
+ "text": "undefined | string"
3081
+ },
3082
+ "description": "Tooltip on hover.",
3083
+ "privacy": "public"
3084
+ },
3085
+ {
3086
+ "kind": "field",
3087
+ "name": "variant",
3088
+ "type": {
3089
+ "text": "undefined | \"ghost\" | \"default\" | \"outline\""
3090
+ },
3091
+ "description": "Visual button style.",
3092
+ "privacy": "public"
3093
+ },
3094
+ {
3095
+ "kind": "field",
3096
+ "name": "size",
3097
+ "type": {
3098
+ "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
3099
+ },
3100
+ "description": "Button size (use an `icon*` size for an icon-only checkpoint).",
3101
+ "privacy": "public"
3102
+ }
3103
+ ],
3104
+ "attributes": [
3105
+ {
3106
+ "name": "theme",
3107
+ "fieldName": "theme",
3108
+ "type": {
3109
+ "text": "\"light\" | \"dark\" | \"auto\""
3110
+ },
3111
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
3112
+ },
3113
+ {
3114
+ "name": "label",
3115
+ "fieldName": "label",
3116
+ "type": {
3117
+ "text": "undefined | string"
3118
+ },
3119
+ "description": "Optional text beside the icon."
3120
+ },
3121
+ {
3122
+ "name": "tooltip",
3123
+ "fieldName": "tooltip",
3124
+ "type": {
3125
+ "text": "undefined | string"
3126
+ },
3127
+ "description": "Tooltip on hover."
3128
+ },
3129
+ {
3130
+ "name": "variant",
3131
+ "fieldName": "variant",
3132
+ "type": {
3133
+ "text": "undefined | \"ghost\" | \"default\" | \"outline\""
3134
+ },
3135
+ "description": "Visual button style."
3136
+ },
3137
+ {
3138
+ "name": "size",
3139
+ "fieldName": "size",
3140
+ "type": {
3141
+ "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
3142
+ },
3143
+ "description": "Button size (use an `icon*` size for an icon-only checkpoint)."
3144
+ }
3145
+ ],
3146
+ "events": [
3147
+ {
3148
+ "name": "kai-select",
3149
+ "type": {
3150
+ "text": "CustomEvent"
3151
+ },
3152
+ "description": "The checkpoint was clicked."
3153
+ }
3154
+ ],
3155
+ "cssProperties": []
3156
+ },
3157
+ {
3158
+ "kind": "class",
3159
+ "customElement": true,
3160
+ "tagName": "kai-choice",
3161
+ "name": "KaiChoiceElement",
3162
+ "description": "",
3163
+ "members": [
3164
+ {
3165
+ "kind": "field",
3166
+ "name": "theme",
3167
+ "type": {
3168
+ "text": "\"light\" | \"dark\" | \"auto\""
3169
+ },
3170
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3171
+ "privacy": "public"
3172
+ },
3173
+ {
3174
+ "kind": "field",
3175
+ "name": "data",
3176
+ "type": {
3177
+ "text": "undefined | { prompt?: undefined | string; options: { id: string; label: string; description?: undefined | string; media?: undefined | { image?: undefined | string; imageAlt?: undefined | string; icon?: undefined | string }; meta?: undefined | string; recommended?: undefined | false | true; disabled?: undefined | false | true; payload?: unknown }[]; allowOther?: undefined | false | true | { label?: undefined | string; placeholder?: undefined | string }; submitLabel?: undefined | string; dismissible?: undefined | false | true }"
3178
+ },
3179
+ "description": "The choice definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import `ChoiceCardData` from `@kitn.ai/ui` for the full shape.",
3180
+ "privacy": "public"
3181
+ },
3182
+ {
3183
+ "kind": "field",
3184
+ "name": "cardId",
3185
+ "type": {
3186
+ "text": "undefined | string"
3187
+ },
3188
+ "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
3189
+ "privacy": "public"
3190
+ },
3191
+ {
3192
+ "kind": "field",
3193
+ "name": "heading",
3194
+ "type": {
3195
+ "text": "undefined | string"
3196
+ },
3197
+ "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
3198
+ "privacy": "public"
3199
+ },
3200
+ {
3201
+ "kind": "field",
3202
+ "name": "resolution",
3203
+ "type": {
3204
+ "text": "undefined | Record<string, unknown>"
3205
+ },
3206
+ "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
3207
+ "privacy": "public"
3208
+ },
3209
+ {
3210
+ "kind": "field",
3211
+ "name": "value",
3212
+ "type": {
3213
+ "text": "undefined | string"
3214
+ },
3215
+ "description": "Controlled selection: the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
3216
+ "privacy": "public"
3217
+ },
3218
+ {
3219
+ "kind": "field",
3220
+ "name": "defaultValue",
3221
+ "type": {
3222
+ "text": "undefined | string"
3223
+ },
3224
+ "description": "Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`.",
3225
+ "privacy": "public"
3226
+ },
3227
+ {
3228
+ "kind": "field",
3229
+ "name": "disabled",
3230
+ "type": {
3231
+ "text": "undefined | false | true"
3232
+ },
3233
+ "description": "Disable the whole radiogroup + Submit (e.g. while the agent is busy). Attribute: `disabled`.",
3234
+ "privacy": "public"
3235
+ },
3236
+ {
3237
+ "kind": "method",
3238
+ "name": "focus",
3239
+ "parameters": [
3240
+ {
3241
+ "name": "options?: FocusOptions"
3242
+ }
3243
+ ],
3244
+ "return": {
3245
+ "type": {
3246
+ "text": "void"
3247
+ }
3248
+ },
3249
+ "description": "Focus the radiogroup roving tab stop (or the Other input when selected).",
3250
+ "privacy": "public"
3251
+ },
3252
+ {
3253
+ "kind": "method",
3254
+ "name": "select",
3255
+ "parameters": [
3256
+ {
3257
+ "name": "optionId: string"
3258
+ }
3259
+ ],
3260
+ "return": {
3261
+ "type": {
3262
+ "text": "void"
3263
+ }
3264
+ },
3265
+ "description": "Select an option by id locally: no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally.",
3266
+ "privacy": "public"
3267
+ },
3268
+ {
3269
+ "kind": "method",
3270
+ "name": "send",
3271
+ "return": {
3272
+ "type": {
3273
+ "text": "void"
3274
+ }
3275
+ },
3276
+ "description": "Submit the current selection: emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary.",
3277
+ "privacy": "public"
3278
+ },
3279
+ {
3280
+ "kind": "method",
3281
+ "name": "dismiss",
2899
3282
  "return": {
2900
3283
  "type": {
2901
3284
  "text": "void"
@@ -3928,7 +4311,7 @@
3928
4311
  "type": {
3929
4312
  "text": "CustomEvent<{ 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> }[] }>"
3930
4313
  },
3931
- "description": "The user submitted the composer (Enter or programmatic submit)."
4314
+ "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."
3932
4315
  },
3933
4316
  {
3934
4317
  "name": "kai-trigger",
@@ -4222,7 +4605,7 @@
4222
4605
  "type": {
4223
4606
  "text": "undefined | string"
4224
4607
  },
4225
- "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).",
4608
+ "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.",
4226
4609
  "privacy": "public"
4227
4610
  },
4228
4611
  {
@@ -4231,7 +4614,7 @@
4231
4614
  "type": {
4232
4615
  "text": "undefined | false | true"
4233
4616
  },
4234
- "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`.",
4617
+ "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.",
4235
4618
  "privacy": "public"
4236
4619
  },
4237
4620
  {
@@ -4259,7 +4642,7 @@
4259
4642
  "type": {
4260
4643
  "text": "undefined | string"
4261
4644
  },
4262
- "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)."
4645
+ "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."
4263
4646
  },
4264
4647
  {
4265
4648
  "name": "active",
@@ -4267,7 +4650,7 @@
4267
4650
  "type": {
4268
4651
  "text": "undefined | false | true"
4269
4652
  },
4270
- "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`."
4653
+ "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."
4271
4654
  },
4272
4655
  {
4273
4656
  "name": "compact",
@@ -4278,8 +4661,16 @@
4278
4661
  "description": "Dense single-line row padding."
4279
4662
  }
4280
4663
  ],
4281
- "events": [],
4282
- "cssProperties": [],
4664
+ "events": [
4665
+ {
4666
+ "name": "kai-select",
4667
+ "type": {
4668
+ "text": "CustomEvent<{ id: string }>"
4669
+ },
4670
+ "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."
4671
+ }
4672
+ ],
4673
+ "cssProperties": [],
4283
4674
  "slots": [
4284
4675
  {
4285
4676
  "name": "",
@@ -4574,7 +4965,7 @@
4574
4965
  }
4575
4966
  ],
4576
4967
  "textContent": true,
4577
- "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)."
4968
+ "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)."
4578
4969
  }
4579
4970
  ],
4580
4971
  "slots": [
@@ -4873,6 +5264,15 @@
4873
5264
  "description": "Disable the launcher; `show()` and `toggle()` are gated on it.",
4874
5265
  "privacy": "public"
4875
5266
  },
5267
+ {
5268
+ "kind": "field",
5269
+ "name": "hideClose",
5270
+ "type": {
5271
+ "text": "undefined | false | true"
5272
+ },
5273
+ "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`.",
5274
+ "privacy": "public"
5275
+ },
4876
5276
  {
4877
5277
  "kind": "field",
4878
5278
  "name": "focusOnOpen",
@@ -5005,6 +5405,14 @@
5005
5405
  },
5006
5406
  "description": "Disable the launcher; `show()` and `toggle()` are gated on it."
5007
5407
  },
5408
+ {
5409
+ "name": "hide-close",
5410
+ "fieldName": "hideClose",
5411
+ "type": {
5412
+ "text": "undefined | false | true"
5413
+ },
5414
+ "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`."
5415
+ },
5008
5416
  {
5009
5417
  "name": "focus-on-open",
5010
5418
  "fieldName": "focusOnOpen",
@@ -5971,7 +6379,7 @@
5971
6379
  "kind": "field",
5972
6380
  "name": "data",
5973
6381
  "type": {
5974
- "text": "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\" }[] }"
6382
+ "text": "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\" }[] }"
5975
6383
  },
5976
6384
  "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.",
5977
6385
  "privacy": "public"
@@ -6522,7 +6930,7 @@
6522
6930
  "type": {
6523
6931
  "text": "undefined | string"
6524
6932
  },
6525
- "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.",
6933
+ "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`.",
6526
6934
  "privacy": "public"
6527
6935
  },
6528
6936
  {
@@ -6633,6 +7041,51 @@
6633
7041
  "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`).",
6634
7042
  "privacy": "public"
6635
7043
  },
7044
+ {
7045
+ "kind": "field",
7046
+ "name": "format",
7047
+ "type": {
7048
+ "text": "undefined | string"
7049
+ },
7050
+ "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.",
7051
+ "privacy": "public"
7052
+ },
7053
+ {
7054
+ "kind": "field",
7055
+ "name": "guide",
7056
+ "type": {
7057
+ "text": "undefined | string"
7058
+ },
7059
+ "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.",
7060
+ "privacy": "public"
7061
+ },
7062
+ {
7063
+ "kind": "field",
7064
+ "name": "semantic",
7065
+ "type": {
7066
+ "text": "undefined | \"credit-card\" | \"custom\" | \"ssn\" | \"tel\""
7067
+ },
7068
+ "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.",
7069
+ "privacy": "public"
7070
+ },
7071
+ {
7072
+ "kind": "field",
7073
+ "name": "caseMode",
7074
+ "type": {
7075
+ "text": "undefined | \"preserve\" | \"upper\" | \"lower\""
7076
+ },
7077
+ "description": "Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`.",
7078
+ "privacy": "public"
7079
+ },
7080
+ {
7081
+ "kind": "field",
7082
+ "name": "copyPolicy",
7083
+ "type": {
7084
+ "text": "undefined | \"formatted\" | \"canonical\" | \"obscured\" | \"blocked\""
7085
+ },
7086
+ "description": "What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`.",
7087
+ "privacy": "public"
7088
+ },
6636
7089
  {
6637
7090
  "kind": "method",
6638
7091
  "name": "focus",
@@ -6660,6 +7113,28 @@
6660
7113
  "description": "Select the inner input's text.",
6661
7114
  "privacy": "public"
6662
7115
  },
7116
+ {
7117
+ "kind": "method",
7118
+ "name": "getRawValue",
7119
+ "return": {
7120
+ "type": {
7121
+ "text": "string"
7122
+ }
7123
+ },
7124
+ "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.",
7125
+ "privacy": "public"
7126
+ },
7127
+ {
7128
+ "kind": "method",
7129
+ "name": "getFormattedValue",
7130
+ "return": {
7131
+ "type": {
7132
+ "text": "string"
7133
+ }
7134
+ },
7135
+ "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.",
7136
+ "privacy": "public"
7137
+ },
6663
7138
  {
6664
7139
  "kind": "method",
6665
7140
  "name": "clear",
@@ -6668,7 +7143,7 @@
6668
7143
  "text": "void"
6669
7144
  }
6670
7145
  },
6671
- "description": "Empty the value and fire `kai-change` with `''`.",
7146
+ "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.",
6672
7147
  "privacy": "public"
6673
7148
  }
6674
7149
  ],
@@ -6695,7 +7170,7 @@
6695
7170
  "type": {
6696
7171
  "text": "undefined | string"
6697
7172
  },
6698
- "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."
7173
+ "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`."
6699
7174
  },
6700
7175
  {
6701
7176
  "name": "placeholder",
@@ -6792,22 +7267,69 @@
6792
7267
  "text": "undefined | string"
6793
7268
  },
6794
7269
  "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`)."
7270
+ },
7271
+ {
7272
+ "name": "format",
7273
+ "fieldName": "format",
7274
+ "type": {
7275
+ "text": "undefined | string"
7276
+ },
7277
+ "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."
7278
+ },
7279
+ {
7280
+ "name": "guide",
7281
+ "fieldName": "guide",
7282
+ "type": {
7283
+ "text": "undefined | string"
7284
+ },
7285
+ "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."
7286
+ },
7287
+ {
7288
+ "name": "semantic",
7289
+ "fieldName": "semantic",
7290
+ "type": {
7291
+ "text": "undefined | \"credit-card\" | \"custom\" | \"ssn\" | \"tel\""
7292
+ },
7293
+ "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."
7294
+ },
7295
+ {
7296
+ "name": "case-mode",
7297
+ "fieldName": "caseMode",
7298
+ "type": {
7299
+ "text": "undefined | \"preserve\" | \"upper\" | \"lower\""
7300
+ },
7301
+ "description": "Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`."
7302
+ },
7303
+ {
7304
+ "name": "copy-policy",
7305
+ "fieldName": "copyPolicy",
7306
+ "type": {
7307
+ "text": "undefined | \"formatted\" | \"canonical\" | \"obscured\" | \"blocked\""
7308
+ },
7309
+ "description": "What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`."
6795
7310
  }
6796
7311
  ],
6797
7312
  "events": [
6798
7313
  {
6799
7314
  "name": "kai-change",
6800
7315
  "type": {
6801
- "text": "CustomEvent<{ value: string }>"
7316
+ "text": "CustomEvent<{ value: string; formattedValue: string }>"
6802
7317
  },
6803
- "description": "The value was committed (blur)."
7318
+ "description": "The value was committed (blur). Same detail shape as `kai-input`."
6804
7319
  },
6805
7320
  {
6806
7321
  "name": "kai-input",
6807
7322
  "type": {
6808
- "text": "CustomEvent<{ value: string }>"
7323
+ "text": "CustomEvent<{ value: string; formattedValue: string }>"
7324
+ },
7325
+ "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."
7326
+ },
7327
+ {
7328
+ "name": "kai-input-rejected",
7329
+ "type": {
7330
+ "text": "CustomEvent<{ reason: \"full\" | \"wrong-class\" | \"over-capacity\" | \"format-change-clipped\"; data: string }>"
6809
7331
  },
6810
- "description": "The value changed per keystroke."
7332
+ "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."
6811
7333
  }
6812
7334
  ],
6813
7335
  "cssProperties": [],
@@ -8384,6 +8906,113 @@
8384
8906
  }
8385
8907
  ]
8386
8908
  },
8909
+ {
8910
+ "kind": "class",
8911
+ "customElement": true,
8912
+ "tagName": "kai-pane-grid",
8913
+ "name": "KaiPaneGridElement",
8914
+ "description": "",
8915
+ "members": [
8916
+ {
8917
+ "kind": "field",
8918
+ "name": "theme",
8919
+ "type": {
8920
+ "text": "\"light\" | \"dark\" | \"auto\""
8921
+ },
8922
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8923
+ "privacy": "public"
8924
+ },
8925
+ {
8926
+ "kind": "field",
8927
+ "name": "minPaneWidth",
8928
+ "type": {
8929
+ "text": "undefined | number"
8930
+ },
8931
+ "description": "Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`.",
8932
+ "privacy": "public"
8933
+ },
8934
+ {
8935
+ "kind": "field",
8936
+ "name": "minPaneHeight",
8937
+ "type": {
8938
+ "text": "undefined | number"
8939
+ },
8940
+ "description": "Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`.",
8941
+ "privacy": "public"
8942
+ },
8943
+ {
8944
+ "kind": "field",
8945
+ "name": "maxColumns",
8946
+ "type": {
8947
+ "text": "undefined | number"
8948
+ },
8949
+ "description": "Column cap when the container is wide (default `3`). Attribute: `max-columns`.",
8950
+ "privacy": "public"
8951
+ },
8952
+ {
8953
+ "kind": "field",
8954
+ "name": "gap",
8955
+ "type": {
8956
+ "text": "undefined | string"
8957
+ },
8958
+ "description": "Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`.",
8959
+ "privacy": "public"
8960
+ },
8961
+ {
8962
+ "kind": "field",
8963
+ "name": "maximizedIndex",
8964
+ "type": {
8965
+ "text": "undefined | number | null"
8966
+ },
8967
+ "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`.",
8968
+ "privacy": "public"
8969
+ }
8970
+ ],
8971
+ "attributes": [
8972
+ {
8973
+ "name": "theme",
8974
+ "fieldName": "theme",
8975
+ "type": {
8976
+ "text": "\"light\" | \"dark\" | \"auto\""
8977
+ },
8978
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
8979
+ },
8980
+ {
8981
+ "name": "min-pane-width",
8982
+ "fieldName": "minPaneWidth",
8983
+ "type": {
8984
+ "text": "undefined | number"
8985
+ },
8986
+ "description": "Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`."
8987
+ },
8988
+ {
8989
+ "name": "min-pane-height",
8990
+ "fieldName": "minPaneHeight",
8991
+ "type": {
8992
+ "text": "undefined | number"
8993
+ },
8994
+ "description": "Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`."
8995
+ },
8996
+ {
8997
+ "name": "max-columns",
8998
+ "fieldName": "maxColumns",
8999
+ "type": {
9000
+ "text": "undefined | number"
9001
+ },
9002
+ "description": "Column cap when the container is wide (default `3`). Attribute: `max-columns`."
9003
+ },
9004
+ {
9005
+ "name": "gap",
9006
+ "fieldName": "gap",
9007
+ "type": {
9008
+ "text": "undefined | string"
9009
+ },
9010
+ "description": "Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`."
9011
+ }
9012
+ ],
9013
+ "events": [],
9014
+ "cssProperties": []
9015
+ },
8387
9016
  {
8388
9017
  "kind": "class",
8389
9018
  "customElement": true,
@@ -9029,7 +9658,7 @@
9029
9658
  "type": {
9030
9659
  "text": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]"
9031
9660
  },
9032
- "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).",
9661
+ "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.)",
9033
9662
  "privacy": "public"
9034
9663
  },
9035
9664
  {
@@ -9202,7 +9831,7 @@
9202
9831
  "type": {
9203
9832
  "text": "CustomEvent<{ 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 }[] }>"
9204
9833
  },
9205
- "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."
9834
+ "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."
9206
9835
  },
9207
9836
  {
9208
9837
  "name": "kai-suggestion-click",
@@ -9290,8 +9919,8 @@
9290
9919
  {
9291
9920
  "kind": "class",
9292
9921
  "customElement": true,
9293
- "tagName": "kai-reasoning",
9294
- "name": "KaiReasoningElement",
9922
+ "tagName": "kai-radio-group",
9923
+ "name": "KaiRadioGroupElement",
9295
9924
  "description": "",
9296
9925
  "members": [
9297
9926
  {
@@ -9305,98 +9934,63 @@
9305
9934
  },
9306
9935
  {
9307
9936
  "kind": "field",
9308
- "name": "text",
9937
+ "name": "options",
9309
9938
  "type": {
9310
- "text": "string"
9939
+ "text": "{ value: string; label: string; description?: undefined | string; disabled?: undefined | false | true }[]"
9311
9940
  },
9312
- "description": "The reasoning text to display.",
9941
+ "description": "The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute.",
9313
9942
  "privacy": "public"
9314
9943
  },
9315
9944
  {
9316
9945
  "kind": "field",
9317
- "name": "label",
9946
+ "name": "value",
9318
9947
  "type": {
9319
9948
  "text": "undefined | string"
9320
9949
  },
9321
- "description": "Trigger label.",
9322
- "privacy": "public"
9323
- },
9324
- {
9325
- "kind": "field",
9326
- "name": "open",
9327
- "type": {
9328
- "text": "undefined | false | true"
9329
- },
9330
- "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click + while streaming). Set `el.open = true`; listen for `kai-open-change`.",
9331
- "privacy": "public"
9332
- },
9333
- {
9334
- "kind": "field",
9335
- "name": "defaultOpen",
9336
- "type": {
9337
- "text": "undefined | false | true"
9338
- },
9339
- "description": "Initial open state on mount (uncontrolled seed).",
9950
+ "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.",
9340
9951
  "privacy": "public"
9341
9952
  },
9342
9953
  {
9343
9954
  "kind": "field",
9344
- "name": "streaming",
9955
+ "name": "name",
9345
9956
  "type": {
9346
- "text": "undefined | false | true"
9957
+ "text": "undefined | string"
9347
9958
  },
9348
- "description": "While true, auto-expands (and re-collapses when it flips false).",
9959
+ "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.",
9349
9960
  "privacy": "public"
9350
9961
  },
9351
9962
  {
9352
9963
  "kind": "field",
9353
- "name": "markdown",
9964
+ "name": "disabled",
9354
9965
  "type": {
9355
9966
  "text": "undefined | false | true"
9356
9967
  },
9357
- "description": "Render `text` as markdown.",
9968
+ "description": "Disable every row. Individual rows carry their own `disabled`.",
9358
9969
  "privacy": "public"
9359
9970
  },
9360
9971
  {
9361
9972
  "kind": "field",
9362
- "name": "disabled",
9973
+ "name": "label",
9363
9974
  "type": {
9364
- "text": "undefined | false | true"
9365
- },
9366
- "description": "Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
9367
- "privacy": "public"
9368
- },
9369
- {
9370
- "kind": "method",
9371
- "name": "show",
9372
- "return": {
9373
- "type": {
9374
- "text": "void"
9375
- }
9975
+ "text": "undefined | string"
9376
9976
  },
9377
- "description": "Open it programmatically (no-op while disabled).",
9977
+ "description": "Accessible name for the group.",
9378
9978
  "privacy": "public"
9379
9979
  },
9380
9980
  {
9381
9981
  "kind": "method",
9382
- "name": "hide",
9383
- "return": {
9384
- "type": {
9385
- "text": "void"
9982
+ "name": "focus",
9983
+ "parameters": [
9984
+ {
9985
+ "name": "options?: FocusOptions"
9386
9986
  }
9387
- },
9388
- "description": "Close it programmatically.",
9389
- "privacy": "public"
9390
- },
9391
- {
9392
- "kind": "method",
9393
- "name": "toggle",
9987
+ ],
9394
9988
  "return": {
9395
9989
  "type": {
9396
9990
  "text": "void"
9397
9991
  }
9398
9992
  },
9399
- "description": "Flip the open state (closes while disabled).",
9993
+ "description": "Focus the group's tab stop. That is the selected radio, or the first row when nothing is selected yet.",
9400
9994
  "privacy": "public"
9401
9995
  }
9402
9996
  ],
@@ -9410,12 +10004,178 @@
9410
10004
  "description": "Color mode (`auto` follows prefers-color-scheme)."
9411
10005
  },
9412
10006
  {
9413
- "name": "text",
9414
- "fieldName": "text",
10007
+ "name": "value",
10008
+ "fieldName": "value",
9415
10009
  "type": {
9416
- "text": "string"
10010
+ "text": "undefined | string"
9417
10011
  },
9418
- "description": "The reasoning text to display."
10012
+ "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."
10013
+ },
10014
+ {
10015
+ "name": "name",
10016
+ "fieldName": "name",
10017
+ "type": {
10018
+ "text": "undefined | string"
10019
+ },
10020
+ "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."
10021
+ },
10022
+ {
10023
+ "name": "disabled",
10024
+ "fieldName": "disabled",
10025
+ "type": {
10026
+ "text": "undefined | false | true"
10027
+ },
10028
+ "description": "Disable every row. Individual rows carry their own `disabled`."
10029
+ },
10030
+ {
10031
+ "name": "label",
10032
+ "fieldName": "label",
10033
+ "type": {
10034
+ "text": "undefined | string"
10035
+ },
10036
+ "description": "Accessible name for the group."
10037
+ }
10038
+ ],
10039
+ "events": [
10040
+ {
10041
+ "name": "kai-change",
10042
+ "type": {
10043
+ "text": "CustomEvent<{ value: string }>"
10044
+ },
10045
+ "description": "A row was chosen."
10046
+ }
10047
+ ],
10048
+ "cssProperties": []
10049
+ },
10050
+ {
10051
+ "kind": "class",
10052
+ "customElement": true,
10053
+ "tagName": "kai-reasoning",
10054
+ "name": "KaiReasoningElement",
10055
+ "description": "",
10056
+ "members": [
10057
+ {
10058
+ "kind": "field",
10059
+ "name": "theme",
10060
+ "type": {
10061
+ "text": "\"light\" | \"dark\" | \"auto\""
10062
+ },
10063
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
10064
+ "privacy": "public"
10065
+ },
10066
+ {
10067
+ "kind": "field",
10068
+ "name": "text",
10069
+ "type": {
10070
+ "text": "string"
10071
+ },
10072
+ "description": "The reasoning text to display.",
10073
+ "privacy": "public"
10074
+ },
10075
+ {
10076
+ "kind": "field",
10077
+ "name": "label",
10078
+ "type": {
10079
+ "text": "undefined | string"
10080
+ },
10081
+ "description": "Trigger label.",
10082
+ "privacy": "public"
10083
+ },
10084
+ {
10085
+ "kind": "field",
10086
+ "name": "open",
10087
+ "type": {
10088
+ "text": "undefined | false | true"
10089
+ },
10090
+ "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click + while streaming). Set `el.open = true`; listen for `kai-open-change`.",
10091
+ "privacy": "public"
10092
+ },
10093
+ {
10094
+ "kind": "field",
10095
+ "name": "defaultOpen",
10096
+ "type": {
10097
+ "text": "undefined | false | true"
10098
+ },
10099
+ "description": "Initial open state on mount (uncontrolled seed).",
10100
+ "privacy": "public"
10101
+ },
10102
+ {
10103
+ "kind": "field",
10104
+ "name": "streaming",
10105
+ "type": {
10106
+ "text": "undefined | false | true"
10107
+ },
10108
+ "description": "While true, auto-expands (and re-collapses when it flips false).",
10109
+ "privacy": "public"
10110
+ },
10111
+ {
10112
+ "kind": "field",
10113
+ "name": "markdown",
10114
+ "type": {
10115
+ "text": "undefined | false | true"
10116
+ },
10117
+ "description": "Render `text` as markdown.",
10118
+ "privacy": "public"
10119
+ },
10120
+ {
10121
+ "kind": "field",
10122
+ "name": "disabled",
10123
+ "type": {
10124
+ "text": "undefined | false | true"
10125
+ },
10126
+ "description": "Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
10127
+ "privacy": "public"
10128
+ },
10129
+ {
10130
+ "kind": "method",
10131
+ "name": "show",
10132
+ "return": {
10133
+ "type": {
10134
+ "text": "void"
10135
+ }
10136
+ },
10137
+ "description": "Open it programmatically (no-op while disabled).",
10138
+ "privacy": "public"
10139
+ },
10140
+ {
10141
+ "kind": "method",
10142
+ "name": "hide",
10143
+ "return": {
10144
+ "type": {
10145
+ "text": "void"
10146
+ }
10147
+ },
10148
+ "description": "Close it programmatically.",
10149
+ "privacy": "public"
10150
+ },
10151
+ {
10152
+ "kind": "method",
10153
+ "name": "toggle",
10154
+ "return": {
10155
+ "type": {
10156
+ "text": "void"
10157
+ }
10158
+ },
10159
+ "description": "Flip the open state (closes while disabled).",
10160
+ "privacy": "public"
10161
+ }
10162
+ ],
10163
+ "attributes": [
10164
+ {
10165
+ "name": "theme",
10166
+ "fieldName": "theme",
10167
+ "type": {
10168
+ "text": "\"light\" | \"dark\" | \"auto\""
10169
+ },
10170
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
10171
+ },
10172
+ {
10173
+ "name": "text",
10174
+ "fieldName": "text",
10175
+ "type": {
10176
+ "text": "string"
10177
+ },
10178
+ "description": "The reasoning text to display."
9419
10179
  },
9420
10180
  {
9421
10181
  "name": "label",
@@ -10425,6 +11185,24 @@
10425
11185
  },
10426
11186
  "description": "Button size token. Defaults to `'icon'` (square).",
10427
11187
  "privacy": "public"
11188
+ },
11189
+ {
11190
+ "kind": "field",
11191
+ "name": "label",
11192
+ "type": {
11193
+ "text": "undefined | string"
11194
+ },
11195
+ "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'`.",
11196
+ "privacy": "public"
11197
+ },
11198
+ {
11199
+ "kind": "field",
11200
+ "name": "showLabel",
11201
+ "type": {
11202
+ "text": "undefined | false | true"
11203
+ },
11204
+ "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.",
11205
+ "privacy": "public"
10428
11206
  }
10429
11207
  ],
10430
11208
  "attributes": [
@@ -10459,6 +11237,22 @@
10459
11237
  "text": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
10460
11238
  },
10461
11239
  "description": "Button size token. Defaults to `'icon'` (square)."
11240
+ },
11241
+ {
11242
+ "name": "label",
11243
+ "fieldName": "label",
11244
+ "type": {
11245
+ "text": "undefined | string"
11246
+ },
11247
+ "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'`."
11248
+ },
11249
+ {
11250
+ "name": "show-label",
11251
+ "fieldName": "showLabel",
11252
+ "type": {
11253
+ "text": "undefined | false | true"
11254
+ },
11255
+ "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."
10462
11256
  }
10463
11257
  ],
10464
11258
  "events": [
@@ -10761,8 +11555,8 @@
10761
11555
  {
10762
11556
  "kind": "class",
10763
11557
  "customElement": true,
10764
- "tagName": "kai-separator",
10765
- "name": "KaiSeparatorElement",
11558
+ "tagName": "kai-select",
11559
+ "name": "KaiSelectElement",
10766
11560
  "description": "",
10767
11561
  "members": [
10768
11562
  {
@@ -10776,80 +11570,279 @@
10776
11570
  },
10777
11571
  {
10778
11572
  "kind": "field",
10779
- "name": "orientation",
11573
+ "name": "options",
10780
11574
  "type": {
10781
- "text": "undefined | \"horizontal\" | \"vertical\""
11575
+ "text": "{ value: string; label?: undefined | string; disabled?: undefined | false | true }[]"
10782
11576
  },
10783
- "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height).",
11577
+ "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.",
10784
11578
  "privacy": "public"
10785
- }
10786
- ],
10787
- "attributes": [
11579
+ },
10788
11580
  {
10789
- "name": "theme",
10790
- "fieldName": "theme",
11581
+ "kind": "field",
11582
+ "name": "value",
10791
11583
  "type": {
10792
- "text": "\"light\" | \"dark\" | \"auto\""
11584
+ "text": "undefined | string"
10793
11585
  },
10794
- "description": "Color mode (`auto` follows prefers-color-scheme)."
11586
+ "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.",
11587
+ "privacy": "public"
10795
11588
  },
10796
11589
  {
10797
- "name": "orientation",
10798
- "fieldName": "orientation",
11590
+ "kind": "field",
11591
+ "name": "placeholder",
10799
11592
  "type": {
10800
- "text": "undefined | \"horizontal\" | \"vertical\""
11593
+ "text": "undefined | string"
10801
11594
  },
10802
- "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height)."
10803
- }
10804
- ],
10805
- "events": [],
10806
- "cssProperties": [],
10807
- "cssParts": [
10808
- {
10809
- "name": "separator",
10810
- "description": "The divider line. Restyle its color, thickness, or inset from outside.",
10811
- "recipe": "kai-separator::part(separator) { background: var(--color-border) }"
10812
- }
10813
- ]
10814
- },
10815
- {
10816
- "kind": "class",
10817
- "customElement": true,
10818
- "tagName": "kai-setting-item",
10819
- "name": "KaiSettingItemElement",
10820
- "description": "",
10821
- "members": [
11595
+ "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.",
11596
+ "privacy": "public"
11597
+ },
10822
11598
  {
10823
11599
  "kind": "field",
10824
- "name": "theme",
11600
+ "name": "multiple",
10825
11601
  "type": {
10826
- "text": "\"light\" | \"dark\" | \"auto\""
11602
+ "text": "undefined | false | true"
10827
11603
  },
10828
- "description": "Color mode (`auto` follows prefers-color-scheme).",
11604
+ "description": "Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn.",
10829
11605
  "privacy": "public"
10830
11606
  },
10831
11607
  {
10832
11608
  "kind": "field",
10833
- "name": "label",
11609
+ "name": "invalid",
10834
11610
  "type": {
10835
- "text": "undefined | string"
11611
+ "text": "undefined | false | true"
10836
11612
  },
10837
- "description": "Row label (primary text). Attribute: `label`.",
11613
+ "description": "Force the invalid (destructive-border) state.",
10838
11614
  "privacy": "public"
10839
11615
  },
10840
11616
  {
10841
11617
  "kind": "field",
10842
- "name": "description",
11618
+ "name": "disabled",
10843
11619
  "type": {
10844
- "text": "undefined | string"
11620
+ "text": "undefined | false | true"
10845
11621
  },
10846
- "description": "Optional secondary description under the label. Attribute: `description`.",
11622
+ "description": "Disable interaction.",
10847
11623
  "privacy": "public"
10848
- }
10849
- ],
10850
- "attributes": [
11624
+ },
10851
11625
  {
10852
- "name": "theme",
11626
+ "kind": "field",
11627
+ "name": "required",
11628
+ "type": {
11629
+ "text": "undefined | false | true"
11630
+ },
11631
+ "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.",
11632
+ "privacy": "public"
11633
+ },
11634
+ {
11635
+ "kind": "field",
11636
+ "name": "label",
11637
+ "type": {
11638
+ "text": "undefined | string"
11639
+ },
11640
+ "description": "Accessible label for the control.",
11641
+ "privacy": "public"
11642
+ },
11643
+ {
11644
+ "kind": "field",
11645
+ "name": "name",
11646
+ "type": {
11647
+ "text": "undefined | string"
11648
+ },
11649
+ "description": "Form-control name, for a native form submit.",
11650
+ "privacy": "public"
11651
+ },
11652
+ {
11653
+ "kind": "method",
11654
+ "name": "focus",
11655
+ "parameters": [
11656
+ {
11657
+ "name": "options?: FocusOptions"
11658
+ }
11659
+ ],
11660
+ "return": {
11661
+ "type": {
11662
+ "text": "void"
11663
+ }
11664
+ },
11665
+ "description": "Focus the inner select (the host element can't reach it).",
11666
+ "privacy": "public"
11667
+ }
11668
+ ],
11669
+ "attributes": [
11670
+ {
11671
+ "name": "theme",
11672
+ "fieldName": "theme",
11673
+ "type": {
11674
+ "text": "\"light\" | \"dark\" | \"auto\""
11675
+ },
11676
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
11677
+ },
11678
+ {
11679
+ "name": "value",
11680
+ "fieldName": "value",
11681
+ "type": {
11682
+ "text": "undefined | string"
11683
+ },
11684
+ "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."
11685
+ },
11686
+ {
11687
+ "name": "placeholder",
11688
+ "fieldName": "placeholder",
11689
+ "type": {
11690
+ "text": "undefined | string"
11691
+ },
11692
+ "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."
11693
+ },
11694
+ {
11695
+ "name": "multiple",
11696
+ "fieldName": "multiple",
11697
+ "type": {
11698
+ "text": "undefined | false | true"
11699
+ },
11700
+ "description": "Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn."
11701
+ },
11702
+ {
11703
+ "name": "invalid",
11704
+ "fieldName": "invalid",
11705
+ "type": {
11706
+ "text": "undefined | false | true"
11707
+ },
11708
+ "description": "Force the invalid (destructive-border) state."
11709
+ },
11710
+ {
11711
+ "name": "disabled",
11712
+ "fieldName": "disabled",
11713
+ "type": {
11714
+ "text": "undefined | false | true"
11715
+ },
11716
+ "description": "Disable interaction."
11717
+ },
11718
+ {
11719
+ "name": "required",
11720
+ "fieldName": "required",
11721
+ "type": {
11722
+ "text": "undefined | false | true"
11723
+ },
11724
+ "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."
11725
+ },
11726
+ {
11727
+ "name": "label",
11728
+ "fieldName": "label",
11729
+ "type": {
11730
+ "text": "undefined | string"
11731
+ },
11732
+ "description": "Accessible label for the control."
11733
+ },
11734
+ {
11735
+ "name": "name",
11736
+ "fieldName": "name",
11737
+ "type": {
11738
+ "text": "undefined | string"
11739
+ },
11740
+ "description": "Form-control name, for a native form submit."
11741
+ }
11742
+ ],
11743
+ "events": [
11744
+ {
11745
+ "name": "kai-change",
11746
+ "type": {
11747
+ "text": "CustomEvent<{ value: string; values: string[] }>"
11748
+ },
11749
+ "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."
11750
+ }
11751
+ ],
11752
+ "cssProperties": []
11753
+ },
11754
+ {
11755
+ "kind": "class",
11756
+ "customElement": true,
11757
+ "tagName": "kai-separator",
11758
+ "name": "KaiSeparatorElement",
11759
+ "description": "",
11760
+ "members": [
11761
+ {
11762
+ "kind": "field",
11763
+ "name": "theme",
11764
+ "type": {
11765
+ "text": "\"light\" | \"dark\" | \"auto\""
11766
+ },
11767
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
11768
+ "privacy": "public"
11769
+ },
11770
+ {
11771
+ "kind": "field",
11772
+ "name": "orientation",
11773
+ "type": {
11774
+ "text": "undefined | \"horizontal\" | \"vertical\""
11775
+ },
11776
+ "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height).",
11777
+ "privacy": "public"
11778
+ }
11779
+ ],
11780
+ "attributes": [
11781
+ {
11782
+ "name": "theme",
11783
+ "fieldName": "theme",
11784
+ "type": {
11785
+ "text": "\"light\" | \"dark\" | \"auto\""
11786
+ },
11787
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
11788
+ },
11789
+ {
11790
+ "name": "orientation",
11791
+ "fieldName": "orientation",
11792
+ "type": {
11793
+ "text": "undefined | \"horizontal\" | \"vertical\""
11794
+ },
11795
+ "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height)."
11796
+ }
11797
+ ],
11798
+ "events": [],
11799
+ "cssProperties": [],
11800
+ "cssParts": [
11801
+ {
11802
+ "name": "separator",
11803
+ "description": "The divider line. Restyle its color, thickness, or inset from outside.",
11804
+ "recipe": "kai-separator::part(separator) { background: var(--color-border) }"
11805
+ }
11806
+ ]
11807
+ },
11808
+ {
11809
+ "kind": "class",
11810
+ "customElement": true,
11811
+ "tagName": "kai-setting-item",
11812
+ "name": "KaiSettingItemElement",
11813
+ "description": "",
11814
+ "members": [
11815
+ {
11816
+ "kind": "field",
11817
+ "name": "theme",
11818
+ "type": {
11819
+ "text": "\"light\" | \"dark\" | \"auto\""
11820
+ },
11821
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
11822
+ "privacy": "public"
11823
+ },
11824
+ {
11825
+ "kind": "field",
11826
+ "name": "label",
11827
+ "type": {
11828
+ "text": "undefined | string"
11829
+ },
11830
+ "description": "Row label (primary text). Attribute: `label`.",
11831
+ "privacy": "public"
11832
+ },
11833
+ {
11834
+ "kind": "field",
11835
+ "name": "description",
11836
+ "type": {
11837
+ "text": "undefined | string"
11838
+ },
11839
+ "description": "Optional secondary description under the label. Attribute: `description`.",
11840
+ "privacy": "public"
11841
+ }
11842
+ ],
11843
+ "attributes": [
11844
+ {
11845
+ "name": "theme",
10853
11846
  "fieldName": "theme",
10854
11847
  "type": {
10855
11848
  "text": "\"light\" | \"dark\" | \"auto\""
@@ -11131,6 +12124,195 @@
11131
12124
  }
11132
12125
  ]
11133
12126
  },
12127
+ {
12128
+ "kind": "class",
12129
+ "customElement": true,
12130
+ "tagName": "kai-slider",
12131
+ "name": "KaiSliderElement",
12132
+ "description": "",
12133
+ "members": [
12134
+ {
12135
+ "kind": "field",
12136
+ "name": "theme",
12137
+ "type": {
12138
+ "text": "\"light\" | \"dark\" | \"auto\""
12139
+ },
12140
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
12141
+ "privacy": "public"
12142
+ },
12143
+ {
12144
+ "kind": "field",
12145
+ "name": "min",
12146
+ "type": {
12147
+ "text": "undefined | number"
12148
+ },
12149
+ "description": "Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means.",
12150
+ "privacy": "public"
12151
+ },
12152
+ {
12153
+ "kind": "field",
12154
+ "name": "max",
12155
+ "type": {
12156
+ "text": "undefined | number"
12157
+ },
12158
+ "description": "Highest selectable value. Required, for the same reason as `min`.",
12159
+ "privacy": "public"
12160
+ },
12161
+ {
12162
+ "kind": "field",
12163
+ "name": "step",
12164
+ "type": {
12165
+ "text": "undefined | number | \"any\""
12166
+ },
12167
+ "description": "Granularity. Omitted means the native default of 1; `any` means continuous.",
12168
+ "privacy": "public"
12169
+ },
12170
+ {
12171
+ "kind": "field",
12172
+ "name": "value",
12173
+ "type": {
12174
+ "text": "undefined | number"
12175
+ },
12176
+ "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.",
12177
+ "privacy": "public"
12178
+ },
12179
+ {
12180
+ "kind": "field",
12181
+ "name": "disabled",
12182
+ "type": {
12183
+ "text": "undefined | false | true"
12184
+ },
12185
+ "description": "Disable interaction.",
12186
+ "privacy": "public"
12187
+ },
12188
+ {
12189
+ "kind": "field",
12190
+ "name": "label",
12191
+ "type": {
12192
+ "text": "undefined | string"
12193
+ },
12194
+ "description": "Accessible label for the slider.",
12195
+ "privacy": "public"
12196
+ },
12197
+ {
12198
+ "kind": "field",
12199
+ "name": "name",
12200
+ "type": {
12201
+ "text": "undefined | string"
12202
+ },
12203
+ "description": "Form-control name, for a native form submit.",
12204
+ "privacy": "public"
12205
+ },
12206
+ {
12207
+ "kind": "field",
12208
+ "name": "valueLabel",
12209
+ "type": {
12210
+ "text": "undefined | false | true | ((value: number) => string)"
12211
+ },
12212
+ "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.",
12213
+ "privacy": "public"
12214
+ },
12215
+ {
12216
+ "kind": "method",
12217
+ "name": "focus",
12218
+ "parameters": [
12219
+ {
12220
+ "name": "options?: FocusOptions"
12221
+ }
12222
+ ],
12223
+ "return": {
12224
+ "type": {
12225
+ "text": "void"
12226
+ }
12227
+ },
12228
+ "description": "Focus the inner range input (the host element can't reach it).",
12229
+ "privacy": "public"
12230
+ }
12231
+ ],
12232
+ "attributes": [
12233
+ {
12234
+ "name": "theme",
12235
+ "fieldName": "theme",
12236
+ "type": {
12237
+ "text": "\"light\" | \"dark\" | \"auto\""
12238
+ },
12239
+ "description": "Color mode (`auto` follows prefers-color-scheme)."
12240
+ },
12241
+ {
12242
+ "name": "min",
12243
+ "fieldName": "min",
12244
+ "type": {
12245
+ "text": "undefined | number"
12246
+ },
12247
+ "description": "Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means."
12248
+ },
12249
+ {
12250
+ "name": "max",
12251
+ "fieldName": "max",
12252
+ "type": {
12253
+ "text": "undefined | number"
12254
+ },
12255
+ "description": "Highest selectable value. Required, for the same reason as `min`."
12256
+ },
12257
+ {
12258
+ "name": "step",
12259
+ "fieldName": "step",
12260
+ "type": {
12261
+ "text": "undefined | number | \"any\""
12262
+ },
12263
+ "description": "Granularity. Omitted means the native default of 1; `any` means continuous."
12264
+ },
12265
+ {
12266
+ "name": "value",
12267
+ "fieldName": "value",
12268
+ "type": {
12269
+ "text": "undefined | number"
12270
+ },
12271
+ "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."
12272
+ },
12273
+ {
12274
+ "name": "disabled",
12275
+ "fieldName": "disabled",
12276
+ "type": {
12277
+ "text": "undefined | false | true"
12278
+ },
12279
+ "description": "Disable interaction."
12280
+ },
12281
+ {
12282
+ "name": "label",
12283
+ "fieldName": "label",
12284
+ "type": {
12285
+ "text": "undefined | string"
12286
+ },
12287
+ "description": "Accessible label for the slider."
12288
+ },
12289
+ {
12290
+ "name": "name",
12291
+ "fieldName": "name",
12292
+ "type": {
12293
+ "text": "undefined | string"
12294
+ },
12295
+ "description": "Form-control name, for a native form submit."
12296
+ }
12297
+ ],
12298
+ "events": [
12299
+ {
12300
+ "name": "kai-change",
12301
+ "type": {
12302
+ "text": "CustomEvent<{ value: number }>"
12303
+ },
12304
+ "description": "The value was committed: pointer released, or a key press finished."
12305
+ },
12306
+ {
12307
+ "name": "kai-input",
12308
+ "type": {
12309
+ "text": "CustomEvent<{ value: number }>"
12310
+ },
12311
+ "description": "The thumb moved. Fires per step during a drag or a key press."
12312
+ }
12313
+ ],
12314
+ "cssProperties": []
12315
+ },
11134
12316
  {
11135
12317
  "kind": "class",
11136
12318
  "customElement": true,
@@ -12571,7 +13753,7 @@
12571
13753
  "type": {
12572
13754
  "text": "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 }[]"
12573
13755
  },
12574
- "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.",
13756
+ "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.",
12575
13757
  "privacy": "public"
12576
13758
  },
12577
13759
  {
@@ -13057,7 +14239,7 @@
13057
14239
  "kind": "field",
13058
14240
  "name": "transcribe",
13059
14241
  "type": {
13060
- "text": "undefined | (audio: Blob) => Promise<string>"
14242
+ "text": "undefined | ((audio: Blob) => Promise<string>)"
13061
14243
  },
13062
14244
  "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.",
13063
14245
  "privacy": "public"
@@ -13223,7 +14405,7 @@
13223
14405
  "kind": "field",
13224
14406
  "name": "synthesize",
13225
14407
  "type": {
13226
- "text": "undefined | (text: string) => Promise<Blob>"
14408
+ "text": "undefined | ((text: string) => Promise<Blob>)"
13227
14409
  },
13228
14410
  "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.",
13229
14411
  "privacy": "public"