@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
@@ -0,0 +1,83 @@
1
+ import { JSX } from 'solid-js';
2
+ /** One choice in a {@link CheckboxGroup}. */
3
+ export interface CheckboxOption<T = string> {
4
+ /** The value this row selects. Compared to the group's `value` by identity. */
5
+ value: T;
6
+ /** The row's visible label. */
7
+ label: JSX.Element;
8
+ /** Optional second line under the label. */
9
+ description?: JSX.Element;
10
+ /** Disable this row alone (the group's `disabled` disables all of them). */
11
+ disabled?: boolean;
12
+ }
13
+ export interface CheckboxGroupProps<T = string> extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'onChange' | 'children'> {
14
+ /**
15
+ * The choices, in display order. Rendered in full: the kit never truncates,
16
+ * re-orders or de-duplicates a consumer's option list.
17
+ */
18
+ options: readonly CheckboxOption<T>[];
19
+ /** The selected values. Each option is checked when its `value` is in here (by identity). */
20
+ value?: readonly T[];
21
+ /**
22
+ * The shared form-control name every box in the group carries, so a native form
23
+ * submits the whole selection under one key and `FormData.getAll(name)` reads it back.
24
+ *
25
+ * UNLIKE {@link RadioGroup}, this has no default. A radio group needs a shared `name`
26
+ * for the browser to make the set exclusive and arrow-navigable, so one is generated
27
+ * when none is given; checkboxes are independent controls and need nothing to behave
28
+ * correctly. Generating a name here would submit the selection under a random key,
29
+ * which is worse than submitting nothing.
30
+ */
31
+ name?: string;
32
+ /** Disable every row. */
33
+ disabled?: boolean;
34
+ /** Accessible name for the group. Rendered as `aria-label` on the `group`. */
35
+ label?: string;
36
+ /**
37
+ * Fires on every toggle with the NEXT selection, plus the option that moved and
38
+ * which way it went. The next selection is a fresh array — the group holds no state
39
+ * of its own, so `value` is yours to own.
40
+ */
41
+ onChange?: (value: T[], option: CheckboxOption<T>, checked: boolean) => void;
42
+ /** Fires when a box loses focus — the commit point for a form field. */
43
+ onOptionBlur?: () => void;
44
+ /** Extra classes for each row. */
45
+ itemClass?: string;
46
+ /**
47
+ * Presentation slot. Replaces the default label/description column with whatever
48
+ * you return, so a row can carry media, a badge or a price without a second
49
+ * checkbox component existing. The control, the row chrome and the group semantics
50
+ * stay ours.
51
+ */
52
+ children?: (option: CheckboxOption<T>, state: {
53
+ checked: boolean;
54
+ disabled: boolean;
55
+ }) => JSX.Element;
56
+ }
57
+ /**
58
+ * A vertical set of checkbox rows in a bordered, divided list — the kit's standard
59
+ * "pick any number" control, and {@link RadioGroup}'s sibling: same options shape,
60
+ * same row chrome, same presentation slot, multi-value instead of single.
61
+ *
62
+ * Every row is a real `<input type="checkbox">` inside a `<label>`, so clicking
63
+ * anywhere on the row toggles it and the keyboard behaviour (a tab stop per box,
64
+ * Space to toggle) is the browser's rather than a reimplementation. The wrapper is
65
+ * `role="group"`, not `role="listbox"`: the boxes are independent controls and
66
+ * nothing here overrides what they already announce.
67
+ *
68
+ * Everything not listed in `CheckboxGroupProps` is forwarded to the group element, so
69
+ * `id`, `aria-labelledby`, any other `aria-*` and any `data-*` hook land where a form
70
+ * expects them. No validation is applied — "at least one" is your application's rule,
71
+ * not the kit's.
72
+ *
73
+ * ```tsx
74
+ * <CheckboxGroup
75
+ * label="Environments"
76
+ * name="env"
77
+ * options={[{ value: 'prod', label: 'Production' }, { value: 'staging', label: 'Staging' }]}
78
+ * value={envs()}
79
+ * onChange={setEnvs}
80
+ * />
81
+ * ```
82
+ */
83
+ export declare function CheckboxGroup<T = string>(props: CheckboxGroupProps<T>): JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface CheckboxProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children'> {
3
+ /**
4
+ * The mixed / partially-checked state ("some of the things below are ticked").
5
+ *
6
+ * `indeterminate` is a DOM PROPERTY with no HTML attribute, so it cannot be set
7
+ * from markup — every caller that wanted it used to reach for a `ref` plus a
8
+ * `createEffect`. That effect now lives in here, once, and callers pass a prop.
9
+ *
10
+ * Note that the property is purely visual plus an accessibility hint: a checkbox
11
+ * whose `indeterminate` is true still reports `checked === false` and submits
12
+ * accordingly. A native indeterminate checkbox already announces as "mixed", so
13
+ * this component does not stamp `aria-checked="mixed"` on top of it — pass one
14
+ * yourself if you also want the attribute in the DOM.
15
+ */
16
+ indeterminate?: boolean;
17
+ }
18
+ /**
19
+ * A checkbox. A REAL `<input type="checkbox">` behind `appearance: none`, styled by
20
+ * the kit's `.kai-checkbox` rule, never a `<div>` wearing `role="checkbox"`.
21
+ *
22
+ * That is the whole design: the native control brings keyboard operation (Space),
23
+ * the `:focus-visible` ring, form participation via `name` / `value`, and correct
24
+ * screen-reader announcement — all of it for free and all of it correct. Every
25
+ * accessibility defect this kit's control audit found was in a control that had
26
+ * replaced the native element with something hand-rolled.
27
+ *
28
+ * Everything not listed in `CheckboxProps` is forwarded to the input, so `id`,
29
+ * `name`, `value`, `required`, `disabled`, `aria-*` and any `data-*` hook behave
30
+ * exactly as they do on a plain `<input>`.
31
+ *
32
+ * Validation is deliberately absent. `required` is passed through to the native
33
+ * attribute and nothing else — whether an unchecked box is an error is the
34
+ * consuming application's call, not the kit's.
35
+ *
36
+ * ```tsx
37
+ * <Checkbox name="notify" checked={on()} onChange={(e) => setOn(e.currentTarget.checked)} />
38
+ * ```
39
+ */
40
+ export declare function Checkbox(props: CheckboxProps): JSX.Element;
package/dist/ui/dock.d.ts CHANGED
@@ -38,6 +38,19 @@ export interface DockProps {
38
38
  unread?: boolean;
39
39
  /** Disable the launcher. */
40
40
  disabled?: boolean;
41
+ /** Suppress the dock's own built-in mobile `[part="close"]` X. Off (rendered) by
42
+ * default — the built-in X is the FALLBACK close route for panel content with no
43
+ * header of its own, which is the general case the dock has to cover since it
44
+ * never reads what it holds. Set `true` when the slotted/composed content
45
+ * supplies its own close affordance in its own header row (e.g. `ChatThread`'s
46
+ * `headerEndContent`) — with both present the two X's stack, one floating over
47
+ * the other's row, which is exactly the "doesn't look intentional" feedback this
48
+ * prop exists to let a caller avoid. TRADEOFF: the mobile panel reserves a
49
+ * padding band above its content so the built-in X never paints over it; that
50
+ * band stays reserved unless you set `hideClose` true, so only set it once your
51
+ * own control is actually in place — otherwise you get the band with no X to
52
+ * justify it. */
53
+ hideClose?: boolean;
41
54
  /** Where focus lands on open. Defaults to `content`. */
42
55
  focusOnOpen?: DockFocusOnOpen;
43
56
  /** Controlled open state. When set, the component never changes it itself — drive it
@@ -94,6 +107,15 @@ export declare function DockCloseGlyph(): JSX.Element;
94
107
  * own menus; swallowing a key from a page you are a guest on is a decide-quietly move.
95
108
  * - **No focus trap**, deliberately, unlike `kai-dialog`. The page staying usable is
96
109
  * the whole point of "docked", which is also why the panel is `aria-modal="false"`.
110
+ * - **Mobile close route.** At <=480px the panel goes full-bleed and the launcher
111
+ * hides while it is open — a floating launcher over a full-bleed panel is not an
112
+ * obvious close affordance. The panel gets its own `[part="close"]` X, top-right,
113
+ * CSS-gated by the SAME media query and `[data-expanded]`, so it needs no viewport
114
+ * JS. Desktop is unaffected: the launcher keeps toggling and no X ever renders.
115
+ * This is the FALLBACK route, for panel content with no header of its own to hold
116
+ * a close control — content that does (a `ChatThread` using `headerEndContent`,
117
+ * say) passes `hideClose` to drop this X instead of stacking a second one over
118
+ * its own header row.
97
119
  *
98
120
  * WHAT IT REFUSES: it never aborts a request, never persists its own open state, never
99
121
  * decides what "unread" means, and never clears `unread` on open — writing over a
package/dist/ui/icon.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  import { JSX } from 'solid-js';
2
+ /** Every curated icon name, sorted. Derived from `NAMED_ICONS` so a gallery,
3
+ * a story control or a test can never drift from the map itself. */
4
+ export declare const ICON_NAMES: readonly string[];
2
5
  /** Render an item icon.
3
6
  *
4
7
  * Resolution order:
@@ -1,4 +1,7 @@
1
1
  import { JSX } from 'solid-js';
2
+ import { CaseMode } from '../primitives/field-mask.js';
3
+ import { FieldSemanticType } from '../primitives/field-semantics.js';
4
+ import { CopyPolicy, InputMaskRejectReason } from '../primitives/input-mask.js';
2
5
  export interface InputProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'onInput' | 'onChange' | 'size'> {
3
6
  /** Field label rendered above the control and linked via `for`/`id`. */
4
7
  label?: string;
@@ -14,12 +17,55 @@ export interface InputProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElemen
14
17
  leading?: JSX.Element;
15
18
  /** Trailing affix (icon, inline button). Rendered inside the field row, after the input. */
16
19
  trailing?: JSX.Element;
17
- /** Fires per keystroke with the current value. */
20
+ /** Fires per keystroke with the current value — the CANONICAL value when a mask is
21
+ * active (digits for `tel`/`ssn`/`credit-card`, the formatted text for
22
+ * `custom`), and the raw text of the field otherwise. */
18
23
  onValueInput?: (value: string) => void;
19
- /** Fires on commit (blur) with the current value. */
24
+ /** Fires on commit (blur) with the current value; canonical when a mask is active. */
20
25
  onValueChange?: (value: string) => void;
26
+ /** Tier-2 mask pattern: `#` a digit, `@` an alphanumeric, `*` an obscurable
27
+ * alphanumeric, everything else a positional literal (`@@@-####`).
28
+ *
29
+ * The literal `default` is the OPT-IN sentinel: it resolves to the default format of
30
+ * `semantic` (`tel` → `###-###-####`). It cannot collide with a real pattern — `default`
31
+ * as a format is eight literals with no fill position, i.e. a field that can hold
32
+ * nothing — and an opt-in token is needed because decision 1 forbids a bare semantic
33
+ * type from starting to mask on its own. */
34
+ format?: string;
35
+ /** The placeholder guide shown at unfilled positions, aligned position-for-position
36
+ * with `format` (` - - `, `mm/dd/yyyy`). Without it the field shows only up
37
+ * to the last typed character. */
38
+ guide?: string;
39
+ /** Tier-1 semantic type. On its own it applies `inputmode` / `autocomplete` /
40
+ * `spellcheck` / `autocorrect` / `autocapitalize` and decides the canonical value —
41
+ * it never starts masking by itself. */
42
+ semantic?: FieldSemanticType;
43
+ /** Case folding applied to typed and pasted text. Defaults to `preserve`. */
44
+ caseMode?: CaseMode;
45
+ /** What a copy or cut of a masked field puts on the clipboard. Defaults to `canonical`. */
46
+ copyPolicy?: CopyPolicy;
47
+ /** A mask refused, or partly refused, some content — `full`, `wrong-class`,
48
+ * `over-capacity`, or `format-change-clipped`. Not a scalar and therefore not an
49
+ * attribute: the facade projects this onto its `kai-input-rejected` event.
50
+ *
51
+ * NOT an error state. `format-change-clipped` in particular fires on a routine
52
+ * reactive `format` change, so this widget deliberately does not touch `invalid` —
53
+ * validity belongs to the consumer, and stays there. */
54
+ onMaskReject?: (detail: {
55
+ reason: InputMaskRejectReason;
56
+ data: string;
57
+ }) => void;
21
58
  }
59
+ /** The `format` value that means: resolve the default format of the semantic type.
60
+ *
61
+ * EXPORTED because `src/elements/input.tsx` has to recognise the same sentinel when it
62
+ * resolves a seeded value ahead of the masker, and a restated literal there would fail
63
+ * SILENTLY if this string ever changed: `format === 'default'` would simply go false and
64
+ * `compileMask('default')` would compile seven literals, garbling the seed with no error
65
+ * anywhere. One exported constant instead of two copies of a magic string. */
66
+ export declare const DEFAULT_FORMAT = "default";
22
67
  export declare const FIELD_BASE = "w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 disabled:pointer-events-none";
68
+ export declare const FIELD_INVALID = "border-destructive dark:border-red-400/70";
23
69
  /**
24
70
  * `Input`: the token-themed single-line text field shell. A label/hint/error
25
71
  * stack around a field row that holds an optional `leading` affix, the
@@ -0,0 +1,85 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface RadioProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children'> {
3
+ }
4
+ /**
5
+ * A single radio button. A REAL `<input type="radio">` behind `appearance: none`,
6
+ * styled by the kit's `.kai-radio` rule, never a `<div role="radio">`.
7
+ *
8
+ * The native element is what makes a set of radios a GROUP: browsers give same-`name`
9
+ * radios one tab stop, arrow-key navigation between them, mutual exclusion and form
10
+ * participation, and screen readers announce "2 of 4". None of that is reimplementable
11
+ * for free, and every hand-rolled radio in this kit's control audit had lost some of it.
12
+ *
13
+ * Use {@link RadioGroup} for a set. Reach for a bare `Radio` when you are laying the
14
+ * group out yourself — give every member the same `name`.
15
+ *
16
+ * Everything not listed in `RadioProps` is forwarded to the input, so `id`, `name`,
17
+ * `value`, `required`, `disabled`, `aria-*` and any `data-*` hook behave exactly as
18
+ * they do on a plain `<input>`. No validation is applied: `required` reaches the
19
+ * native attribute and stops there.
20
+ */
21
+ export declare function Radio(props: RadioProps): JSX.Element;
22
+ /** One choice in a {@link RadioGroup}. */
23
+ export interface RadioOption<T = string> {
24
+ /** The value this row selects. Compared to the group's `value` by identity. */
25
+ value: T;
26
+ /** The row's visible label. */
27
+ label: JSX.Element;
28
+ /** Optional second line under the label. */
29
+ description?: JSX.Element;
30
+ /** Disable this row alone (the group's `disabled` disables all of them). */
31
+ disabled?: boolean;
32
+ }
33
+ export interface RadioGroupProps<T = string> extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'onChange' | 'children'> {
34
+ /** The choices, in display order. */
35
+ options: readonly RadioOption<T>[];
36
+ /** The selected value. Matched against each option's `value` by identity. */
37
+ value?: T;
38
+ /**
39
+ * The shared form-control name every radio in the group carries — what makes the
40
+ * browser treat them as one control. Defaults to a generated id, so the group is
41
+ * exclusive and keyboard-navigable even when nothing is being submitted.
42
+ */
43
+ name?: string;
44
+ /** Disable every row. */
45
+ disabled?: boolean;
46
+ /** Accessible name for the group. Rendered as `aria-label` on the `radiogroup`. */
47
+ label?: string;
48
+ /** Fires with the newly selected value (and its option) on selection. */
49
+ onChange?: (value: T, option: RadioOption<T>) => void;
50
+ /** Fires when a radio loses focus — the commit point for a form field. */
51
+ onOptionBlur?: () => void;
52
+ /** Extra classes for each row. */
53
+ itemClass?: string;
54
+ /**
55
+ * Presentation slot. Replaces the default label/description column with whatever
56
+ * you return, so a row can carry media, a badge or a price without a second radio
57
+ * component existing. The control, the row chrome and the group semantics stay ours.
58
+ */
59
+ children?: (option: RadioOption<T>, state: {
60
+ checked: boolean;
61
+ disabled: boolean;
62
+ }) => JSX.Element;
63
+ }
64
+ /**
65
+ * A vertical set of radio rows in a bordered, divided list — the kit's standard
66
+ * "pick exactly one" control.
67
+ *
68
+ * The group is a `role="radiogroup"` wrapper around real `<input type="radio">`s that
69
+ * share a `name`, so the keyboard behaviour (one tab stop, arrows to move) is the
70
+ * browser's and not a reimplementation. Clicking anywhere on a row selects it, because
71
+ * each row is a `<label>`.
72
+ *
73
+ * Everything not listed in `RadioGroupProps` is forwarded to the group element, so
74
+ * `id`, `aria-*` and any `data-*` hook land where a form expects them.
75
+ *
76
+ * ```tsx
77
+ * <RadioGroup
78
+ * label="Severity"
79
+ * options={[{ value: 'blocking', label: 'Blocking' }, { value: 'cosmetic', label: 'Cosmetic' }]}
80
+ * value={severity()}
81
+ * onChange={setSeverity}
82
+ * />
83
+ * ```
84
+ */
85
+ export declare function RadioGroup<T = string>(props: RadioGroupProps<T>): JSX.Element;
@@ -0,0 +1,71 @@
1
+ import { JSX } from 'solid-js';
2
+ /** One choice in a {@link Select}. */
3
+ export interface SelectOption<T = string> {
4
+ /** The value this row selects. Compared to the select's `value` by identity. */
5
+ value: T;
6
+ /** Visible text. Defaults to `String(value)`. Native `<option>`s hold text, not markup. */
7
+ label?: string;
8
+ /** Disable this option alone (the select's `disabled` disables the whole control). */
9
+ disabled?: boolean;
10
+ }
11
+ export interface SelectProps<T = string> extends Omit<JSX.SelectHTMLAttributes<HTMLSelectElement>, 'value' | 'children'> {
12
+ /**
13
+ * The choices, in display order. Rendered in full: the kit never truncates,
14
+ * re-orders or de-duplicates a consumer's option list.
15
+ *
16
+ * Omit it and pass `children` instead when you need `<optgroup>`s or anything else
17
+ * a flat list cannot express.
18
+ */
19
+ options?: readonly SelectOption<T>[];
20
+ /**
21
+ * The selected value, matched against each option's `value` by IDENTITY (so a
22
+ * numeric enum selects on the number, not on its string form). Pass an array for a
23
+ * `multiple` select.
24
+ */
25
+ value?: T | readonly T[];
26
+ /**
27
+ * Text for a leading, disabled, empty-valued option — the "nothing chosen yet" row.
28
+ * Omitted means no such row is rendered at all; there is no default placeholder,
29
+ * because inventing one would put words in the consumer's UI.
30
+ */
31
+ placeholder?: string;
32
+ /** Force the invalid (destructive-border) state. Matches `Input`'s. */
33
+ invalid?: boolean;
34
+ /** Raw `<option>` / `<optgroup>` children, for lists `options` cannot express.
35
+ * `value` still drives the selection when you use these: it is applied to the
36
+ * rendered options rather than quietly doing nothing. */
37
+ children?: JSX.Element;
38
+ /** Extra classes for the positioning wrapper that holds the chevron. */
39
+ containerClass?: string;
40
+ }
41
+ /**
42
+ * A select. A REAL native `<select>` behind `appearance: none`, in a box consistent
43
+ * with {@link Input}, with the kit's own chevron drawn over it.
44
+ *
45
+ * **Native, not a listbox, and that is the design.** A hand-built popup can be made to
46
+ * look identical and cannot be made to behave identically: the native control brings
47
+ * the platform picker on mobile, type-ahead on desktop, form participation, and the
48
+ * OS's own accessibility tree. This kit's control audit found every one of its
49
+ * accessibility defects in a control that had replaced a native element.
50
+ *
51
+ * The trade is that the *dropdown list itself* stays OS chrome — it renders outside the
52
+ * page and no stylesheet reaches it. What the kit can do is make it follow the kit's
53
+ * light/dark mode rather than the OS's, which `color-scheme` on the element host
54
+ * already does (`src/elements/styles.css`). Styling the closed control and leaving the
55
+ * open list to the platform is the whole of the bargain.
56
+ *
57
+ * Everything not listed in `SelectProps` is forwarded to the `<select>`, so `id`,
58
+ * `name`, `required`, `disabled`, `multiple`, `size`, `aria-*`, any `data-*` hook and
59
+ * the DOM events behave exactly as they do on a plain select. No validation is
60
+ * applied: `required` reaches the native attribute and stops there.
61
+ *
62
+ * ```tsx
63
+ * <Select
64
+ * options={[{ value: 'low' }, { value: 'high', label: 'High priority' }]}
65
+ * value={sev()}
66
+ * placeholder="Choose a severity…"
67
+ * onChange={(e) => setSev(e.currentTarget.value)}
68
+ * />
69
+ * ```
70
+ */
71
+ export declare function Select<T = string>(props: SelectProps<T>): JSX.Element;
@@ -0,0 +1,65 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface SliderProps extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'min' | 'max' | 'step' | 'value'> {
3
+ /**
4
+ * Lowest selectable value. REQUIRED, and deliberately so.
5
+ *
6
+ * A range with no `min`/`max` is not a slider, it is a slider-shaped guess, and the
7
+ * guess belongs to whoever knows what the number means. `SliderWidget` reading a
8
+ * JSON-Schema field still defaults an absent `minimum` to 0 — that is the WIDGET's
9
+ * decision about a consumer-authored schema, and it stays there rather than being
10
+ * quietly adopted by every caller of this component.
11
+ */
12
+ min: number;
13
+ /** Highest selectable value. REQUIRED for the same reason as `min`. */
14
+ max: number;
15
+ /** Granularity. Omitted means the native default (1); `'any'` means continuous. */
16
+ step?: number | 'any';
17
+ /** The current value. Controlled — drive it from `onInput`. Omit for uncontrolled. */
18
+ value?: number;
19
+ /** Initial value when uncontrolled. */
20
+ defaultValue?: number;
21
+ /**
22
+ * Show the current value beside the track. Off by default.
23
+ *
24
+ * Two shapes, because one is not enough and three would be too many. `true` renders
25
+ * the raw number, which is what most sliders want. A FUNCTION renders whatever it
26
+ * returns, because plenty of sliders are not counting bare numbers: `60%`, `3 of 5`,
27
+ * `1m 30s`. A boolean alone cannot express those, and a formatter alone would make
28
+ * the common case read `valueLabel={(v) => v}`.
29
+ *
30
+ * The readout is `aria-hidden`. The input already reports the same number through
31
+ * `aria-valuenow` / `aria-valuetext`, so an exposed copy would be announced twice.
32
+ *
33
+ * NOTE ON STRUCTURE: with a readout the component renders a flex row around the
34
+ * input; without one it is still a bare `<input>` and nothing changes for existing
35
+ * callers. Toggling this at runtime therefore rebuilds the input element, which is
36
+ * fine for a control panel and not something a real app does mid-drag.
37
+ */
38
+ valueLabel?: boolean | ((value: number) => JSX.Element);
39
+ }
40
+ /**
41
+ * A slider. A REAL `<input type="range">` behind `appearance: none`, styled by the
42
+ * kit's `.kai-range` rule, never a `<div>` with a drag handler.
43
+ *
44
+ * The native control brings the whole keyboard contract (arrows, Home, End,
45
+ * PageUp/PageDown), pointer and touch dragging, form participation via `name`, and
46
+ * the `slider` role with a live value announcement — all of it for free and all of it
47
+ * correct. Every accessibility defect this kit's control audit found was in a control
48
+ * that had replaced the native element with something hand-rolled.
49
+ *
50
+ * What the component adds is the **filled track**. `.kai-range` paints the portion
51
+ * left of the thumb from a `--kai-range-fill` custom property, and until now every
52
+ * caller computed that percentage itself. It is arithmetic over `min`, `max` and the
53
+ * current value — three things this component already has — so no consumer should
54
+ * ever write it again.
55
+ *
56
+ * Everything not listed in `SliderProps` is forwarded to the input, so `id`, `name`,
57
+ * `disabled`, `required`, `aria-*` and any `data-*` hook behave exactly as they do on
58
+ * a plain `<input>`. No clamping and no validation is applied: a value outside
59
+ * `min`..`max` is the browser's business, not ours.
60
+ *
61
+ * ```tsx
62
+ * <Slider min={0} max={100} step={5} value={v()} onInput={(e) => setV(e.currentTarget.valueAsNumber)} />
63
+ * ```
64
+ */
65
+ export declare function Slider(props: SliderProps): JSX.Element;
@@ -1,4 +1,5 @@
1
- export interface SwitchProps {
1
+ import { JSX } from 'solid-js';
2
+ export interface SwitchProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'role' | 'aria-checked' | 'children' | 'ref' | 'onChange' | 'onchange' | 'onClick' | 'onclick' | 'onKeyDown' | 'onkeydown'> {
2
3
  /** Controlled checked state. When set, the component defers state to the
3
4
  * parent; drive it from `onChange`. Omit for uncontrolled (internal) state. */
4
5
  checked?: boolean;
@@ -22,5 +23,11 @@ export interface SwitchProps {
22
23
  /**
23
24
  * A toggle switch (`role="switch"`). Controlled via `checked`, or uncontrolled
24
25
  * from `defaultChecked`. Keyboard-operable (Space/Enter) and theme-tokened.
26
+ *
27
+ * Anything not named in `SwitchProps` is forwarded to the inner button, so `id`,
28
+ * `aria-required` / `aria-invalid` / `aria-describedby` and any `data-*` hook land
29
+ * on the focusable element without a caller stamping them through a `ref`. The
30
+ * switch keeps ownership of `type`, `role`, `aria-checked` and the toggle handlers:
31
+ * those are the control, not decoration.
25
32
  */
26
- export declare function Switch(props: SwitchProps): import("solid-js").JSX.Element;
33
+ export declare function Switch(props: SwitchProps): JSX.Element;
@@ -0,0 +1 @@
1
+ import{I as a}from"./Icon-BnFKqqtY.js";import{c as e,q as i}from"./define-CGGX-7Vg.js";var p=[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]],t=o=>e(a,i(o,{name:"Upload",iconNode:p})),r=t;export{r as u};
@@ -0,0 +1 @@
1
+ const i=["http:","https:","mailto:"],r=["javascript:","vbscript:"];function c(t){try{return new URL(t,"http://_invalid_base").protocol}catch{return}}function o(t){const n=c(t);return n!==void 0&&i.includes(n)}function s(t){const n=c(t);return n!==void 0&&r.includes(n)}export{o as a,s as i};
@@ -0,0 +1 @@
1
+ import{q as D,s as L,g as z,c as i,i as s,S as a,a as b,d as k,b as P,D as T,m as w,t as c,w as q,e as A,G as E,B as F,j as G,x as K,k as m}from"./define-CGGX-7Vg.js";import{c as C}from"./cn-DN5AWfiS.js";import{B as O}from"./button-BH6rN0U-.js";import{t as U}from"./triangle-alert-DHohDOCy.js";import{x as _}from"./x-C5m1JFgi.js";import{r as H}from"./rotate-ccw-0DLRDHH5.js";var J=c('<h3 class="text-title font-semibold tracking-tight text-foreground">'),N=c('<p class="text-body text-muted-foreground">'),Q=c("<div>"),V=c('<div role=alert class="flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/15 dark:text-red-400"><span>'),W=c('<div class="text-sm text-foreground">'),X=c('<div class="flex flex-wrap items-center justify-end gap-2 pt-1">'),Y=c('<button type=button part=dismiss aria-label=Dismiss class="absolute right-2.5 top-2.5 z-10 shrink-0 rounded p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground">'),Z=c('<div class="overflow-hidden rounded-lg">');function S(t){const o=D({dense:!1},t),[e,d]=L(o,["heading","description","media","actions","errorMessage","dense","headingId","descriptionId","dismissible","onDismiss","href","target","rel","clickable","onCardClick","class","children"]),g=q(),u=()=>e.headingId??`kai-card-heading-${g}`,v=()=>e.descriptionId??`kai-card-description-${g}`,p=()=>e.errorMessage!==void 0&&e.errorMessage!=="",l=()=>!!e.heading||!!e.description,[x,I]=z(!0),M=r=>{var n;r.stopPropagation(),I(!1),(n=e.onDismiss)==null||n.call(e)},h=()=>!!e.href,f=()=>!h()&&!!e.clickable,y=()=>h()||f(),$=r=>{var n;return(n=e.onCardClick)==null?void 0:n.call(e,r)},R=r=>{f()&&(r.key==="Enter"||r.key===" "||r.key==="Spacebar")&&(r.preventDefault(),$(r))},j=()=>e.rel??(e.target==="_blank"?"noopener noreferrer":void 0),B=[i(a,{get when(){return l()},get children(){var r=Q();return s(r,i(a,{get when(){return e.heading},get children(){var n=J();return s(n,()=>e.heading),b(()=>k(n,"id",u())),n}}),null),s(r,i(a,{get when(){return e.description},get children(){var n=N();return s(n,()=>e.description),b(()=>k(n,"id",v())),n}}),null),b(()=>P(r,C("flex flex-col border-b border-border",e.dense?"gap-0.5 pb-2.5":"gap-1 pb-4"))),r}}),i(a,{get when(){return p()},get fallback(){return[i(a,{get when(){return e.children},get children(){var r=W();return s(r,()=>e.children),r}}),i(a,{get when(){return e.actions},get children(){var r=X();return s(r,()=>e.actions),r}})]},get children(){var r=V(),n=r.firstChild;return s(r,i(U,{size:16,class:"mt-0.5 shrink-0","aria-hidden":"true"}),n),s(n,()=>e.errorMessage),r}})];return i(a,{get when(){return x()},get children(){return i(T,D({get component(){return h()?"a":"div"},part:"card",get href(){return w(()=>!!h())()?e.href:void 0},get target(){return w(()=>!!h())()?e.target:void 0},get rel(){return w(()=>!!h())()?j():void 0},get role(){return f()?"button":void 0},get tabindex(){return f()?0:void 0},get onClick(){return y()?$:void 0},get onKeyDown(){return f()?R:void 0},get class(){return C("relative flex flex-col rounded-xl border border-border bg-card text-card-foreground kai-elevation-sm",e.dense?"gap-2.5 p-3.5":"gap-4 p-5",y()&&"cursor-pointer no-underline transition-colors hover:border-ring hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",e.class)}},d,{get children(){return[i(a,{get when(){return e.dismissible},get children(){var r=Y();return r.$$click=M,s(r,i(_,{class:"size-3.5","aria-hidden":"true"})),r}}),i(a,{get when(){return e.media},get children(){var r=Z();return s(r,()=>e.media),r}}),B]}}))}})}A(["click"]);var ee=c('<div role=group class="flex flex-wrap items-center gap-x-2 gap-y-1"><span class="min-w-0 text-sm text-muted-foreground"><span class="font-medium text-foreground"></span> <span class=text-foreground></span><span class=text-muted-foreground> \u2014 dismissed');const re={confirm:"Proposed",choice:"Choose",form:"Form",tasks:"Tasks"};function te(t){const o=re[t];return o?`${o}:`:t.length===0?"Card:":`${t.charAt(0).toUpperCase()}${t.slice(1)}:`}function ne(t){const o=()=>te(t.type),e=()=>t.title??"this card",d=()=>t.reopenLabel??"Reopen",g=()=>`${o()} ${e()} \u2014 dismissed`;return i(S,{dense:!0,get class(){return t.class},get children(){var u=ee(),v=u.firstChild,p=v.firstChild,l=p.nextSibling,x=l.nextSibling;return s(p,o),s(x,e),s(u,i(O,{type:"button",variant:"ghost",size:"sm",get class(){return C("ml-auto gap-1.5")},onClick:()=>t.onReopen(),get children(){return[i(H,{size:14,"aria-hidden":"true"}),i(a,{get when(){return d()},get children(){return d()}})]}}),null),b(()=>k(u,"aria-label",g())),u}})}const ie=F();function se(){return E(ie)}const oe=new Set(["action","submit","expired"]);function ae(t){const[o,e]=z(void 0);G(K(t.data,()=>e(void 0),{defer:!0}));const d=m(()=>t.prop()??o()),g=m(()=>d()!==void 0),u=m(()=>{const l=d();return l!==void 0&&oe.has(l.kind)}),v=m(()=>{var l;return((l=d())==null?void 0:l.kind)==="dismissed"}),p=m(()=>t.prop()===void 0&&o()!==void 0);return{resolution:d,isResolved:g,isTerminal:u,isDeferred:v,isOptimistic:p,setLocal:e}}export{S as C,ne as D,ae as a,se as u};
@@ -1,7 +1,7 @@
1
1
  import { ssr as w, ssrAttribute as d, escape as h, ssrStyleProperty as u, createComponent as R } from "solid-js/web";
2
2
  import { createEffect as p, createSignal as A, onCleanup as S } from "solid-js";
3
- import { c, S as _, h as k, D as C } from "./create-tween-BFT6c-Y8.js";
4
- import { C as T, a as M } from "./solid-CnavwBye.js";
3
+ import { c, S as _, h as k, D as C } from "./create-tween-CnMHviKB.js";
4
+ import { C as T, a as M } from "./solid-DFhsce3O.js";
5
5
  const W = `
6
6
  const float PI = 3.14159265359;
7
7
  // Strand phase span: 0.5 + pi (fact sheet section 2's "sigma", the
@@ -1,7 +1,7 @@
1
1
  import { insert as y, createComponent as b, effect as w, setAttribute as R, className as A, setStyleProperty as S, template as k } from "solid-js/web";
2
2
  import { createEffect as p, createSignal as C, onCleanup as T } from "solid-js";
3
- import { c as l, S as _, h as M, D as W } from "./create-tween-CJNlzoaO.js";
4
- import { C as z, a as P } from "./solid-BtdqNZI7.js";
3
+ import { c as l, S as _, h as M, D as W } from "./create-tween-D1aiGZZh.js";
4
+ import { C as z, a as P } from "./solid-BE5ui6sy.js";
5
5
  const N = `
6
6
  const float PI = 3.14159265359;
7
7
  // Strand phase span: 0.5 + pi (fact sheet section 2's "sigma", the
@@ -1,4 +1,4 @@
1
- import{i as y,s as b,c as w,a as R,C as A,t as S,b as _}from"./register-impl-DpE7icIb.js";import{h as f,l as k,d as M,i as T,o as W}from"./kai.es.js";import{c as n,h as q,S as C,D as z}from"./create-tween-CQED4T0g.js";const P=`
1
+ import{i as y,s as b,c as w,a as R,C as A,t as S,b as _}from"./register-impl-C7rENvPK.js";import{h as f,l as k,d as M,i as T,o as W}from"./kai.es.js";import{c as n,h as q,S as C,D as z}from"./create-tween-BPzaefTp.js";const P=`
2
2
  const float PI = 3.14159265359;
3
3
  // Strand phase span: 0.5 + pi (fact sheet section 2's "sigma", the
4
4
  // midpoint of the interval [1, 2*pi] with the interpolation knob fixed
@@ -1,4 +1,4 @@
1
- import{k as f,i as y,c as b,a as w,d as R,b as A,n as S,g as _,h as k,t as M}from"./define-wjHR1MkU.js";import{c as n,h as T,D as W,S as q}from"./create-tween-c4Z8TDYz.js";import{C,a as z}from"./audio-visualizer-D7lB6mvR.js";const P=`
1
+ import{j as f,i as y,c as b,a as w,d as R,b as A,l as S,g as _,h as k,t as M}from"./define-CGGX-7Vg.js";import{c as n,h as T,D as W,S as q}from"./create-tween-DUSQUKpr.js";import{C,a as z}from"./audio-visualizer-B-79y1Tj.js";const P=`
2
2
  const float PI = 3.14159265359;
3
3
  // Strand phase span: 0.5 + pi (fact sheet section 2's "sigma", the
4
4
  // midpoint of the interval [1, 2*pi] with the interpolation knob fixed
@@ -1 +1 @@
1
- import{d as w,i as S,s as c,c as m,e as p,t as M,b as A,C as N}from"./register-impl-DpE7icIb.js";import{h as g,c as C,l as y,S as x,d as h}from"./kai.es.js";import{c as $,S as E,h as U,D as j}from"./create-tween-CQED4T0g.js";var b=M("<div>");const F={"1f":!0,"1i":!0,"1fv":!0,"2f":!0,"3f":!0,"3fv":!0,"4f":!0,"4fv":!0,Matrix2fv:!0,Matrix3fv:!0,Matrix4fv:!0},O=new Set(["1f","1i"]),V={"2f":2,"3f":3,"4f":4,Matrix2fv:4,Matrix3fv:9,Matrix4fv:16};function D(a,e){if(e==null||typeof e!="object")return`uniform "${a}" is not a valid declaration (expected an object with "type" and "value").`;if(F[e.type]!==!0)return`uniform "${a}" has an unrecognized type "${String(e.type)}".`;if(O.has(e.type))return typeof e.value!="number"||!Number.isFinite(e.value)?`uniform "${a}" is declared "${e.type}" (a number) but its value is not a finite number.`:void 0;if(!Array.isArray(e.value)||e.value.some(s=>typeof s!="number"||!Number.isFinite(s)))return`uniform "${a}" is declared "${e.type}" (an array) but its value is not an array of finite numbers.`;const o=V[e.type];if(o!==void 0&&e.value.length!==o)return`uniform "${a}" is declared "${e.type}", which takes exactly ${o} numbers, but its value has ${e.value.length}.`}function z(a,e){const o=a.bands.length?a.bands:[0],s={uColor:{type:"3fv",value:U(a.color)},uIntensity:{type:"1f",value:a.intensity},uSpeed:{type:"1f",value:a.speed},uComplexity:{type:"1f",value:a.complexity},uVolume:{type:"1f",value:a.volume},uBands:{type:"1fv",value:o,arraySize:o.length}};if(!e)return s;for(const[f,v]of Object.entries(e)){const l=D(f,v);if(l)throw new Error(l)}return{...s,...e}}function I(a){const e=$(.3),o=$(1),s=()=>A(a.state,a.listeningAmplitude);g(()=>{const t=w(s());if(s()==="speaking")e.to(.3+.7*a.volume,{duration:0});else{const r=a.frozen?{duration:0}:{duration:.5,ease:"easeOut"};e.to(Array.isArray(t.intensity)&&a.frozen?t.intensity[0]:t.intensity,r)}o.to(a.frozen?0:t.speed,{duration:0})});const f=C(()=>{var t;try{return{uniforms:z({color:a.color??j,intensity:e.value(),speed:o.value(),complexity:a.complexity??.5,volume:a.volume,bands:a.bands},(t=a.shader)==null?void 0:t.uniforms)}}catch(r){return{error:r instanceof Error?r.message:String(r)}}});let v=!1;g(()=>{const{error:t}=f();if(!t){v=!1;return}v||(v=!0,console.error(`<kai-audio-visualizer variant="custom">: ${t}`),a.onUnavailable())});const l=()=>({height:`${N[a.size]}px`,"aspect-ratio":"1"});return y(x,{get when(){var t;return(t=a.shader)==null?void 0:t.fragment},get fallback(){return(()=>{var t=b();return h(r=>{var n=a.state,i=a.class,u=l();return n!==r.e&&c(t,"data-kai-state",r.e=n),i!==r.t&&m(t,r.t=i),r.a=p(t,u,r.a),r},{e:void 0,t:void 0,a:void 0}),t})()},children:t=>y(x,{get when(){return f().uniforms},get fallback(){return(()=>{var r=b();return h(n=>{var i=a.state,u=a.class,d=l();return i!==n.e&&c(r,"data-kai-state",n.e=i),u!==n.t&&m(r,n.t=u),n.a=p(r,d,n.a),n},{e:void 0,t:void 0,a:void 0}),r})()},children:r=>(()=>{var n=b();return S(n,y(E,{get fragment(){return t()},get precision(){return a.size==="icon"||a.size==="sm"?"mediump":"highp"},get uniforms(){return r()},get animateWhenNotVisible(){return a.animateWhenNotVisible},onError:i=>{/not available/i.test(i)?console.warn('<kai-audio-visualizer variant="custom">: shader unavailable',i):console.error('<kai-audio-visualizer variant="custom">: shader error',i),a.onUnavailable()}})),h(i=>{var u=a.state,d=a.class,k=l();return u!==i.e&&c(n,"data-kai-state",i.e=u),d!==i.t&&m(n,i.t=d),i.a=p(n,k,i.a),i},{e:void 0,t:void 0,a:void 0}),n})()})})}export{z as customUniforms,I as default};
1
+ import{d as w,i as S,s as c,c as m,e as p,t as M,b as A,C as N}from"./register-impl-C7rENvPK.js";import{h as g,c as C,l as y,S as x,d as h}from"./kai.es.js";import{c as $,S as E,h as U,D as j}from"./create-tween-BPzaefTp.js";var b=M("<div>");const F={"1f":!0,"1i":!0,"1fv":!0,"2f":!0,"3f":!0,"3fv":!0,"4f":!0,"4fv":!0,Matrix2fv:!0,Matrix3fv:!0,Matrix4fv:!0},O=new Set(["1f","1i"]),V={"2f":2,"3f":3,"4f":4,Matrix2fv:4,Matrix3fv:9,Matrix4fv:16};function D(a,e){if(e==null||typeof e!="object")return`uniform "${a}" is not a valid declaration (expected an object with "type" and "value").`;if(F[e.type]!==!0)return`uniform "${a}" has an unrecognized type "${String(e.type)}".`;if(O.has(e.type))return typeof e.value!="number"||!Number.isFinite(e.value)?`uniform "${a}" is declared "${e.type}" (a number) but its value is not a finite number.`:void 0;if(!Array.isArray(e.value)||e.value.some(s=>typeof s!="number"||!Number.isFinite(s)))return`uniform "${a}" is declared "${e.type}" (an array) but its value is not an array of finite numbers.`;const o=V[e.type];if(o!==void 0&&e.value.length!==o)return`uniform "${a}" is declared "${e.type}", which takes exactly ${o} numbers, but its value has ${e.value.length}.`}function z(a,e){const o=a.bands.length?a.bands:[0],s={uColor:{type:"3fv",value:U(a.color)},uIntensity:{type:"1f",value:a.intensity},uSpeed:{type:"1f",value:a.speed},uComplexity:{type:"1f",value:a.complexity},uVolume:{type:"1f",value:a.volume},uBands:{type:"1fv",value:o,arraySize:o.length}};if(!e)return s;for(const[f,v]of Object.entries(e)){const l=D(f,v);if(l)throw new Error(l)}return{...s,...e}}function I(a){const e=$(.3),o=$(1),s=()=>A(a.state,a.listeningAmplitude);g(()=>{const t=w(s());if(s()==="speaking")e.to(.3+.7*a.volume,{duration:0});else{const r=a.frozen?{duration:0}:{duration:.5,ease:"easeOut"};e.to(Array.isArray(t.intensity)&&a.frozen?t.intensity[0]:t.intensity,r)}o.to(a.frozen?0:t.speed,{duration:0})});const f=C(()=>{var t;try{return{uniforms:z({color:a.color??j,intensity:e.value(),speed:o.value(),complexity:a.complexity??.5,volume:a.volume,bands:a.bands},(t=a.shader)==null?void 0:t.uniforms)}}catch(r){return{error:r instanceof Error?r.message:String(r)}}});let v=!1;g(()=>{const{error:t}=f();if(!t){v=!1;return}v||(v=!0,console.error(`<kai-audio-visualizer variant="custom">: ${t}`),a.onUnavailable())});const l=()=>({height:`${N[a.size]}px`,"aspect-ratio":"1"});return y(x,{get when(){var t;return(t=a.shader)==null?void 0:t.fragment},get fallback(){return(()=>{var t=b();return h(r=>{var n=a.state,i=a.class,u=l();return n!==r.e&&c(t,"data-kai-state",r.e=n),i!==r.t&&m(t,r.t=i),r.a=p(t,u,r.a),r},{e:void 0,t:void 0,a:void 0}),t})()},children:t=>y(x,{get when(){return f().uniforms},get fallback(){return(()=>{var r=b();return h(n=>{var i=a.state,u=a.class,d=l();return i!==n.e&&c(r,"data-kai-state",n.e=i),u!==n.t&&m(r,n.t=u),n.a=p(r,d,n.a),n},{e:void 0,t:void 0,a:void 0}),r})()},children:r=>(()=>{var n=b();return S(n,y(E,{get fragment(){return t()},get precision(){return a.size==="icon"||a.size==="sm"?"mediump":"highp"},get uniforms(){return r()},get animateWhenNotVisible(){return a.animateWhenNotVisible},onError:i=>{/not available/i.test(i)?console.warn('<kai-audio-visualizer variant="custom">: shader unavailable',i):console.error('<kai-audio-visualizer variant="custom">: shader error',i),a.onUnavailable()}})),h(i=>{var u=a.state,d=a.class,k=l();return u!==i.e&&c(n,"data-kai-state",i.e=u),d!==i.t&&m(n,i.t=d),i.a=p(n,k,i.a),i},{e:void 0,t:void 0,a:void 0}),n})()})})}export{z as customUniforms,I as default};
@@ -1,7 +1,7 @@
1
1
  import { createComponent as m, insert as C, effect as c, setAttribute as y, className as b, style as h, template as E } from "solid-js/web";
2
2
  import { createEffect as x, createMemo as N, Show as S } from "solid-js";
3
- import { c as z, D as k, S as w, h as M } from "./create-tween-CJNlzoaO.js";
4
- import { s as R, a as T, C as O } from "./solid-BtdqNZI7.js";
3
+ import { c as z, D as k, S as w, h as M } from "./create-tween-D1aiGZZh.js";
4
+ import { s as R, a as T, C as O } from "./solid-BE5ui6sy.js";
5
5
  var g = /* @__PURE__ */ E("<div>");
6
6
  const $ = {
7
7
  "1f": !0,
@@ -1,7 +1,7 @@
1
1
  import { createComponent as d, ssr as m, ssrAttribute as s, escape as u, ssrStyle as v } from "solid-js/web";
2
2
  import { createEffect as y, createMemo as S, Show as b } from "solid-js";
3
- import { c as h, D as x, S as $, h as z } from "./create-tween-BFT6c-Y8.js";
4
- import { s as A, a as C, C as E } from "./solid-CnavwBye.js";
3
+ import { c as h, D as x, S as $, h as z } from "./create-tween-CnMHviKB.js";
4
+ import { s as A, a as C, C as E } from "./solid-DFhsce3O.js";
5
5
  var g = ["<div", ' style="', '"></div>'], k = ["<div", ' style="', '">', "</div>"];
6
6
  const w = {
7
7
  "1f": !0,
@@ -1 +1 @@
1
- import{k as g,l as w,c,S as x,i as S,a as m,d as p,b as y,p as h,t as M}from"./define-wjHR1MkU.js";import{c as $,S as A,h as N,D as C}from"./create-tween-c4Z8TDYz.js";import{s as E,a as U,C as j}from"./audio-visualizer-D7lB6mvR.js";var b=M("<div>");const F={"1f":!0,"1i":!0,"1fv":!0,"2f":!0,"3f":!0,"3fv":!0,"4f":!0,"4fv":!0,Matrix2fv:!0,Matrix3fv:!0,Matrix4fv:!0},O=new Set(["1f","1i"]),V={"2f":2,"3f":3,"4f":4,Matrix2fv:4,Matrix3fv:9,Matrix4fv:16};function D(a,e){if(e==null||typeof e!="object")return`uniform "${a}" is not a valid declaration (expected an object with "type" and "value").`;if(F[e.type]!==!0)return`uniform "${a}" has an unrecognized type "${String(e.type)}".`;if(O.has(e.type))return typeof e.value!="number"||!Number.isFinite(e.value)?`uniform "${a}" is declared "${e.type}" (a number) but its value is not a finite number.`:void 0;if(!Array.isArray(e.value)||e.value.some(s=>typeof s!="number"||!Number.isFinite(s)))return`uniform "${a}" is declared "${e.type}" (an array) but its value is not an array of finite numbers.`;const o=V[e.type];if(o!==void 0&&e.value.length!==o)return`uniform "${a}" is declared "${e.type}", which takes exactly ${o} numbers, but its value has ${e.value.length}.`}function k(a,e){const o=a.bands.length?a.bands:[0],s={uColor:{type:"3fv",value:N(a.color)},uIntensity:{type:"1f",value:a.intensity},uSpeed:{type:"1f",value:a.speed},uComplexity:{type:"1f",value:a.complexity},uVolume:{type:"1f",value:a.volume},uBands:{type:"1fv",value:o,arraySize:o.length}};if(!e)return s;for(const[f,v]of Object.entries(e)){const l=D(f,v);if(l)throw new Error(l)}return{...s,...e}}function I(a){const e=$(.3),o=$(1),s=()=>U(a.state,a.listeningAmplitude);g(()=>{const t=E(s());if(s()==="speaking")e.to(.3+.7*a.volume,{duration:0});else{const r=a.frozen?{duration:0}:{duration:.5,ease:"easeOut"};e.to(Array.isArray(t.intensity)&&a.frozen?t.intensity[0]:t.intensity,r)}o.to(a.frozen?0:t.speed,{duration:0})});const f=w(()=>{var t;try{return{uniforms:k({color:a.color??C,intensity:e.value(),speed:o.value(),complexity:a.complexity??.5,volume:a.volume,bands:a.bands},(t=a.shader)==null?void 0:t.uniforms)}}catch(r){return{error:r instanceof Error?r.message:String(r)}}});let v=!1;g(()=>{const{error:t}=f();if(!t){v=!1;return}v||(v=!0,console.error(`<kai-audio-visualizer variant="custom">: ${t}`),a.onUnavailable())});const l=()=>({height:`${j[a.size]}px`,"aspect-ratio":"1"});return c(x,{get when(){var t;return(t=a.shader)==null?void 0:t.fragment},get fallback(){return(()=>{var t=b();return m(r=>{var n=a.state,i=a.class,u=l();return n!==r.e&&p(t,"data-kai-state",r.e=n),i!==r.t&&y(t,r.t=i),r.a=h(t,u,r.a),r},{e:void 0,t:void 0,a:void 0}),t})()},children:t=>c(x,{get when(){return f().uniforms},get fallback(){return(()=>{var r=b();return m(n=>{var i=a.state,u=a.class,d=l();return i!==n.e&&p(r,"data-kai-state",n.e=i),u!==n.t&&y(r,n.t=u),n.a=h(r,d,n.a),n},{e:void 0,t:void 0,a:void 0}),r})()},children:r=>(()=>{var n=b();return S(n,c(A,{get fragment(){return t()},get precision(){return a.size==="icon"||a.size==="sm"?"mediump":"highp"},get uniforms(){return r()},get animateWhenNotVisible(){return a.animateWhenNotVisible},onError:i=>{/not available/i.test(i)?console.warn('<kai-audio-visualizer variant="custom">: shader unavailable',i):console.error('<kai-audio-visualizer variant="custom">: shader error',i),a.onUnavailable()}})),m(i=>{var u=a.state,d=a.class,z=l();return u!==i.e&&p(n,"data-kai-state",i.e=u),d!==i.t&&y(n,i.t=d),i.a=h(n,z,i.a),i},{e:void 0,t:void 0,a:void 0}),n})()})})}export{k as customUniforms,I as default};
1
+ import{j as g,k as w,c,S as x,i as S,a as m,d as p,b as y,n as h,t as M}from"./define-CGGX-7Vg.js";import{c as $,S as A,h as j,D as N}from"./create-tween-DUSQUKpr.js";import{s as C,a as E,C as U}from"./audio-visualizer-B-79y1Tj.js";var b=M("<div>");const F={"1f":!0,"1i":!0,"1fv":!0,"2f":!0,"3f":!0,"3fv":!0,"4f":!0,"4fv":!0,Matrix2fv:!0,Matrix3fv:!0,Matrix4fv:!0},O=new Set(["1f","1i"]),V={"2f":2,"3f":3,"4f":4,Matrix2fv:4,Matrix3fv:9,Matrix4fv:16};function I(a,e){if(e==null||typeof e!="object")return`uniform "${a}" is not a valid declaration (expected an object with "type" and "value").`;if(F[e.type]!==!0)return`uniform "${a}" has an unrecognized type "${String(e.type)}".`;if(O.has(e.type))return typeof e.value!="number"||!Number.isFinite(e.value)?`uniform "${a}" is declared "${e.type}" (a number) but its value is not a finite number.`:void 0;if(!Array.isArray(e.value)||e.value.some(s=>typeof s!="number"||!Number.isFinite(s)))return`uniform "${a}" is declared "${e.type}" (an array) but its value is not an array of finite numbers.`;const o=V[e.type];if(o!==void 0&&e.value.length!==o)return`uniform "${a}" is declared "${e.type}", which takes exactly ${o} numbers, but its value has ${e.value.length}.`}function k(a,e){const o=a.bands.length?a.bands:[0],s={uColor:{type:"3fv",value:j(a.color)},uIntensity:{type:"1f",value:a.intensity},uSpeed:{type:"1f",value:a.speed},uComplexity:{type:"1f",value:a.complexity},uVolume:{type:"1f",value:a.volume},uBands:{type:"1fv",value:o,arraySize:o.length}};if(!e)return s;for(const[f,v]of Object.entries(e)){const l=I(f,v);if(l)throw new Error(l)}return{...s,...e}}function W(a){const e=$(.3),o=$(1),s=()=>E(a.state,a.listeningAmplitude);g(()=>{const t=C(s());if(s()==="speaking")e.to(.3+.7*a.volume,{duration:0});else{const r=a.frozen?{duration:0}:{duration:.5,ease:"easeOut"};e.to(Array.isArray(t.intensity)&&a.frozen?t.intensity[0]:t.intensity,r)}o.to(a.frozen?0:t.speed,{duration:0})});const f=w(()=>{var t;try{return{uniforms:k({color:a.color??N,intensity:e.value(),speed:o.value(),complexity:a.complexity??.5,volume:a.volume,bands:a.bands},(t=a.shader)==null?void 0:t.uniforms)}}catch(r){return{error:r instanceof Error?r.message:String(r)}}});let v=!1;g(()=>{const{error:t}=f();if(!t){v=!1;return}v||(v=!0,console.error(`<kai-audio-visualizer variant="custom">: ${t}`),a.onUnavailable())});const l=()=>({height:`${U[a.size]}px`,"aspect-ratio":"1"});return c(x,{get when(){var t;return(t=a.shader)==null?void 0:t.fragment},get fallback(){return(()=>{var t=b();return m(r=>{var n=a.state,i=a.class,u=l();return n!==r.e&&p(t,"data-kai-state",r.e=n),i!==r.t&&y(t,r.t=i),r.a=h(t,u,r.a),r},{e:void 0,t:void 0,a:void 0}),t})()},children:t=>c(x,{get when(){return f().uniforms},get fallback(){return(()=>{var r=b();return m(n=>{var i=a.state,u=a.class,d=l();return i!==n.e&&p(r,"data-kai-state",n.e=i),u!==n.t&&y(r,n.t=u),n.a=h(r,d,n.a),n},{e:void 0,t:void 0,a:void 0}),r})()},children:r=>(()=>{var n=b();return S(n,c(A,{get fragment(){return t()},get precision(){return a.size==="icon"||a.size==="sm"?"mediump":"highp"},get uniforms(){return r()},get animateWhenNotVisible(){return a.animateWhenNotVisible},onError:i=>{/not available/i.test(i)?console.warn('<kai-audio-visualizer variant="custom">: shader unavailable',i):console.error('<kai-audio-visualizer variant="custom">: shader error',i),a.onUnavailable()}})),m(i=>{var u=a.state,d=a.class,z=l();return u!==i.e&&p(n,"data-kai-state",i.e=u),d!==i.t&&y(n,i.t=d),i.a=h(n,z,i.a),i},{e:void 0,t:void 0,a:void 0}),n})()})})}export{k as customUniforms,W as default};
@@ -1,7 +1,7 @@
1
1
  import { ssr as h, ssrAttribute as d, escape as o, ssrStyleProperty as l, createComponent as p } from "solid-js/web";
2
2
  import { createEffect as v } from "solid-js";
3
- import { c, S as g, h as x, D as y } from "./create-tween-BFT6c-Y8.js";
4
- import { C as b, a as w, w as C } from "./solid-CnavwBye.js";
3
+ import { c, S as g, h as x, D as y } from "./create-tween-CnMHviKB.js";
4
+ import { C as b, a as w, w as C } from "./solid-DFhsce3O.js";
5
5
  const S = `
6
6
  const float TAU = 6.28318530718;
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { insert as h, createComponent as p, effect as g, setAttribute as x, className as y, setStyleProperty as b, template as w } from "solid-js/web";
2
2
  import { createEffect as d } from "solid-js";
3
- import { c as r, S as C, h as S, D as z } from "./create-tween-CJNlzoaO.js";
4
- import { C as A, a as U, w as F } from "./solid-BtdqNZI7.js";
3
+ import { c as r, S as C, h as S, D as z } from "./create-tween-D1aiGZZh.js";
4
+ import { C as A, a as U, w as F } from "./solid-BE5ui6sy.js";
5
5
  const R = `
6
6
  const float TAU = 6.28318530718;
7
7