@kitn.ai/ui 0.28.0 → 0.30.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 (615) hide show
  1. package/README.md +11 -7
  2. package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
  3. package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-D783iMJj.js +1 -0
  7. package/dist/arrow-left-0VLM5kyg.js +1 -0
  8. package/dist/artifact-DGjzHYUT.js +1 -0
  9. package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
  10. package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
  11. package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
  12. package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
  13. package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
  14. package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
  15. package/dist/check-CiEOVnEN.js +1 -0
  16. package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
  17. package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
  18. package/dist/chevron-down-CSobuZRG.js +1 -0
  19. package/dist/chevron-right-DR9ZAP-2.js +1 -0
  20. package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
  21. package/dist/circle-BC66EYF7.js +1 -0
  22. package/dist/circle-check-BqmahW0O.js +1 -0
  23. package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
  24. package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
  25. package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
  26. package/dist/components/builder-composer-triggers.d.ts +62 -0
  27. package/dist/components/builder-layout.d.ts +54 -0
  28. package/dist/components/builder-message-actions.d.ts +72 -0
  29. package/dist/components/builder-panel.d.ts +189 -0
  30. package/dist/components/builder-preview.d.ts +11 -0
  31. package/dist/components/builder-shell-controls.d.ts +69 -0
  32. package/dist/components/builder-skeleton.d.ts +58 -0
  33. package/dist/components/builder-start.d.ts +75 -0
  34. package/dist/components/builder-workspace-variants.d.ts +23 -0
  35. package/dist/components/captions.d.ts +66 -0
  36. package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
  37. package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
  38. package/dist/construct-cli.es.js +3 -3
  39. package/dist/construct.d.ts +5 -0
  40. package/dist/construct.js +327 -0
  41. package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
  42. package/dist/controllable-BagRpyHv.js +1 -0
  43. package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
  44. package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
  45. package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
  46. package/dist/core-C8fzo39E.js +1 -12
  47. package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
  48. package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
  49. package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
  50. package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
  51. package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
  52. package/dist/define-CI0y3eE4.js +1 -0
  53. package/dist/define.js +40 -40
  54. package/dist/define.server.js +45 -45
  55. package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
  56. package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
  57. package/dist/elements/agent-card.js +1 -1
  58. package/dist/elements/artifact.js +1 -1
  59. package/dist/elements/attachments.js +1 -1
  60. package/dist/elements/audio-visualizer.js +1 -1
  61. package/dist/elements/avatar.js +1 -1
  62. package/dist/elements/badge.js +1 -1
  63. package/dist/elements/button.js +1 -1
  64. package/dist/elements/card.js +1 -1
  65. package/dist/elements/cards.js +1 -1
  66. package/dist/elements/chain-of-thought.js +1 -1
  67. package/dist/elements/chat-scope-picker.js +1 -1
  68. package/dist/elements/chat-workspace.js +1 -1
  69. package/dist/elements/chat.js +1 -1
  70. package/dist/elements/checkbox-group.js +1 -1
  71. package/dist/elements/checkbox.js +1 -1
  72. package/dist/elements/checkpoint.js +1 -1
  73. package/dist/elements/choice.js +1 -1
  74. package/dist/elements/coachmark.js +1 -1
  75. package/dist/elements/code-block.js +1 -1
  76. package/dist/elements/command.js +1 -1
  77. package/dist/elements/compare.js +1 -1
  78. package/dist/elements/composer.js +1 -1
  79. package/dist/elements/confirm-card.js +1 -1
  80. package/dist/elements/context-meter.js +1 -1
  81. package/dist/elements/conversation-item.js +1 -1
  82. package/dist/elements/conversation-list.js +1 -1
  83. package/dist/elements/dialog.js +1 -1
  84. package/dist/elements/dock.js +1 -1
  85. package/dist/elements/dropdown.js +1 -1
  86. package/dist/elements/editable-label.js +1 -1
  87. package/dist/elements/embed.js +1 -1
  88. package/dist/elements/empty.js +1 -1
  89. package/dist/elements/feedback-bar.js +1 -1
  90. package/dist/elements/file-tree.js +1 -1
  91. package/dist/elements/file-upload.js +1 -1
  92. package/dist/elements/form.js +1 -1
  93. package/dist/elements/hover-card.js +1 -1
  94. package/dist/elements/icon.js +1 -1
  95. package/dist/elements/image.js +1 -1
  96. package/dist/elements/input.js +1 -1
  97. package/dist/elements/kbd.js +1 -1
  98. package/dist/elements/link-preview.js +1 -1
  99. package/dist/elements/loader.js +1 -1
  100. package/dist/elements/markdown.js +1 -1
  101. package/dist/elements/menu.js +1 -1
  102. package/dist/elements/message-skills.js +1 -1
  103. package/dist/elements/message.js +1 -1
  104. package/dist/elements/model-switcher.js +1 -1
  105. package/dist/elements/nav.js +1 -1
  106. package/dist/elements/notice.js +1 -1
  107. package/dist/elements/pane-grid.js +1 -1
  108. package/dist/elements/pane-group.js +1 -1
  109. package/dist/elements/pane.js +1 -1
  110. package/dist/elements/popover.js +1 -1
  111. package/dist/elements/progress-bar.js +1 -1
  112. package/dist/elements/prompt-dock.js +1 -1
  113. package/dist/elements/prompt-input.js +1 -1
  114. package/dist/elements/prompt-suggestions.js +1 -1
  115. package/dist/elements/radio-group.js +1 -1
  116. package/dist/elements/reasoning.js +1 -1
  117. package/dist/elements/remote.js +1 -1
  118. package/dist/elements/resizable.js +1 -1
  119. package/dist/elements/response-stream.js +1 -1
  120. package/dist/elements/screen.js +1 -1
  121. package/dist/elements/scroll-area.js +1 -1
  122. package/dist/elements/scroll-button.js +1 -1
  123. package/dist/elements/search.js +1 -1
  124. package/dist/elements/segmented.js +1 -1
  125. package/dist/elements/select.js +1 -1
  126. package/dist/elements/separator.js +1 -1
  127. package/dist/elements/setting-item.js +1 -1
  128. package/dist/elements/settings-group.js +1 -1
  129. package/dist/elements/skeleton.js +1 -1
  130. package/dist/elements/slider.js +1 -1
  131. package/dist/elements/source.js +1 -1
  132. package/dist/elements/status.js +1 -1
  133. package/dist/elements/switch.js +1 -1
  134. package/dist/elements/tabs.js +1 -1
  135. package/dist/elements/tasks.js +1 -1
  136. package/dist/elements/text-shimmer.js +1 -1
  137. package/dist/elements/thinking-bar.js +1 -1
  138. package/dist/elements/thread.js +1 -1
  139. package/dist/elements/toast.js +1 -1
  140. package/dist/elements/tool.js +1 -1
  141. package/dist/elements/tooltip.js +1 -1
  142. package/dist/elements/voice-input.js +1 -1
  143. package/dist/elements/voice-output.js +1 -1
  144. package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
  145. package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
  146. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  147. package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
  148. package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
  149. package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
  150. package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
  151. package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
  152. package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
  153. package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
  154. package/dist/index.js +1741 -1725
  155. package/dist/index.server.js +1582 -1566
  156. package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
  157. package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
  158. package/dist/kai.es.js +1 -1
  159. package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
  160. package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
  161. package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
  162. package/dist/loader-KvJB6NrT.js +1 -0
  163. package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
  164. package/dist/mcp.es.js +9 -5
  165. package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
  166. package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
  167. package/dist/message-circle-BPpp5QKv.js +1 -0
  168. package/dist/message-square-BLbsd9BJ.js +1 -0
  169. package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
  170. package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
  171. package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
  172. package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
  173. package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
  174. package/dist/play-BXy1u7rW.js +1 -0
  175. package/dist/primitives/use-auto-resize.d.ts +11 -0
  176. package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
  177. package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
  178. package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
  179. package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
  180. package/dist/register-impl-DvEnhIxx.js +424 -0
  181. package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
  182. package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
  183. package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
  184. package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
  185. package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
  186. package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
  187. package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
  188. package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
  189. package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
  190. package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
  191. package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
  192. package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
  193. package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
  194. package/dist/solid.d.ts +6 -0
  195. package/dist/solid.js +259 -254
  196. package/dist/solid.server.js +259 -254
  197. package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
  198. package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
  199. package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
  200. package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
  201. package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
  202. package/dist/text-shimmer-BSzgEnDH.js +1 -0
  203. package/dist/textarea-DrYNt_0z.js +1 -0
  204. package/dist/theme.tokens.css +22 -21
  205. package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
  206. package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
  207. package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
  208. package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
  209. package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
  210. package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
  211. package/dist/ui/color-field.d.ts +48 -0
  212. package/dist/ui/textarea.d.ts +4 -0
  213. package/dist/ui/toggle-chip.d.ts +40 -0
  214. package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
  215. package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
  216. package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
  217. package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
  218. package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
  219. package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
  220. package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
  221. package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
  222. package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
  223. package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
  224. package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
  225. package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
  226. package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
  227. package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
  228. package/dist/x-eiO9V6J6.js +1 -0
  229. package/{src/elements/styles.css → kit-base.css} +27 -44
  230. package/package.json +32 -17
  231. package/solid.css +33 -0
  232. package/theme.css +39 -23
  233. package/bin/route.test.js +0 -58
  234. package/dist/arrow-down-CjRU3JgV.js +0 -1
  235. package/dist/arrow-left-Bnpb1UEW.js +0 -1
  236. package/dist/artifact-Bwt7OgcR.js +0 -1
  237. package/dist/check-njkVdZu2.js +0 -1
  238. package/dist/chevron-down-B72s6PXR.js +0 -1
  239. package/dist/chevron-right-BatuHzUm.js +0 -1
  240. package/dist/circle-check-B62pODB3.js +0 -1
  241. package/dist/circle-zx0ByzY9.js +0 -1
  242. package/dist/controllable-CnGpMF6r.js +0 -1
  243. package/dist/define-By-uL588.js +0 -1
  244. package/dist/loader-BM4CEz4G.js +0 -1
  245. package/dist/message-circle-DruwObfX.js +0 -1
  246. package/dist/message-square-BG6q6mlm.js +0 -1
  247. package/dist/play-BvKKq3fX.js +0 -1
  248. package/dist/register-impl-B1hLkrI8.js +0 -424
  249. package/dist/text-shimmer-Dcj1MHuq.js +0 -1
  250. package/dist/textarea-Dpvbngbg.js +0 -1
  251. package/dist/x-Z5UntkIJ.js +0 -1
  252. package/src/agent-tooling/README.md +0 -192
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -147
  263. package/src/agent-tooling/construct/codegen.ts +0 -1635
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
  269. package/src/agent-tooling/construct/schema.ts +0 -452
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -1014
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -241
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/conversation-panel.tsx +0 -118
  338. package/src/components/dismissed-stub.tsx +0 -80
  339. package/src/components/embed.tsx +0 -200
  340. package/src/components/empty.tsx +0 -177
  341. package/src/components/feedback-bar.tsx +0 -166
  342. package/src/components/file-tree.tsx +0 -530
  343. package/src/components/file-upload.tsx +0 -167
  344. package/src/components/form-widgets.tsx +0 -525
  345. package/src/components/form.tsx +0 -1296
  346. package/src/components/home-panel.tsx +0 -159
  347. package/src/components/image.tsx +0 -65
  348. package/src/components/link-preview.tsx +0 -195
  349. package/src/components/loader.tsx +0 -367
  350. package/src/components/markdown.tsx +0 -162
  351. package/src/components/message-skills.tsx +0 -40
  352. package/src/components/message.tsx +0 -765
  353. package/src/components/model-switcher.tsx +0 -132
  354. package/src/components/prompt-input.tsx +0 -188
  355. package/src/components/prompt-suggestion.tsx +0 -150
  356. package/src/components/reasoning.tsx +0 -293
  357. package/src/components/response-compare-types.ts +0 -152
  358. package/src/components/response-compare.tsx +0 -455
  359. package/src/components/response-stream.tsx +0 -109
  360. package/src/components/screen.tsx +0 -181
  361. package/src/components/scroll-button.tsx +0 -93
  362. package/src/components/source.tsx +0 -192
  363. package/src/components/tasks-card.tsx +0 -801
  364. package/src/components/text-shimmer.tsx +0 -37
  365. package/src/components/thinking-bar.tsx +0 -50
  366. package/src/components/thread.tsx +0 -228
  367. package/src/components/toast.tsx +0 -503
  368. package/src/components/tool-classify.ts +0 -26
  369. package/src/components/tool-types.ts +0 -49
  370. package/src/components/tool.tsx +0 -190
  371. package/src/components/use-card-resolution.ts +0 -44
  372. package/src/components/voice-input.tsx +0 -222
  373. package/src/components/voice-output.tsx +0 -242
  374. package/src/components/widget-tab-bar.tsx +0 -73
  375. package/src/components/workspace-shell.tsx +0 -285
  376. package/src/diagnostics/hook.ts +0 -352
  377. package/src/diagnostics/index.ts +0 -82
  378. package/src/diagnostics/report-request.ts +0 -296
  379. package/src/elements/agent-card.tsx +0 -67
  380. package/src/elements/artifact.tsx +0 -194
  381. package/src/elements/attachments.tsx +0 -140
  382. package/src/elements/audio-visualizer.tsx +0 -227
  383. package/src/elements/autoloader.ts +0 -89
  384. package/src/elements/avatar.tsx +0 -33
  385. package/src/elements/badge.tsx +0 -32
  386. package/src/elements/button.tsx +0 -149
  387. package/src/elements/card.tsx +0 -133
  388. package/src/elements/cards.tsx +0 -266
  389. package/src/elements/chain-of-thought.tsx +0 -141
  390. package/src/elements/chat-scope-picker.tsx +0 -65
  391. package/src/elements/chat-types.ts +0 -102
  392. package/src/elements/chat-workspace.tsx +0 -188
  393. package/src/elements/chat.tsx +0 -304
  394. package/src/elements/checkbox-group.tsx +0 -164
  395. package/src/elements/checkbox.tsx +0 -134
  396. package/src/elements/checkpoint.tsx +0 -47
  397. package/src/elements/choice.tsx +0 -100
  398. package/src/elements/coachmark.tsx +0 -90
  399. package/src/elements/code-block.tsx +0 -60
  400. package/src/elements/command.tsx +0 -197
  401. package/src/elements/compare.tsx +0 -111
  402. package/src/elements/compiled.css +0 -2
  403. package/src/elements/composer.tsx +0 -162
  404. package/src/elements/confirm-card.tsx +0 -76
  405. package/src/elements/context-meter.tsx +0 -107
  406. package/src/elements/conversation-item.tsx +0 -120
  407. package/src/elements/conversation-list.tsx +0 -203
  408. package/src/elements/css.ts +0 -5
  409. package/src/elements/default-input.tsx +0 -392
  410. package/src/elements/define-entry.ts +0 -12
  411. package/src/elements/define.tsx +0 -563
  412. package/src/elements/diagnostic-events.ts +0 -114
  413. package/src/elements/dialog.tsx +0 -145
  414. package/src/elements/disclosure.ts +0 -95
  415. package/src/elements/dock.tsx +0 -215
  416. package/src/elements/dropdown.tsx +0 -123
  417. package/src/elements/editable-label.tsx +0 -140
  418. package/src/elements/element-data-types.ts +0 -152
  419. package/src/elements/element-diagnostics.ts +0 -392
  420. package/src/elements/element-manifest.json +0 -354
  421. package/src/elements/element-nonscalar.json +0 -187
  422. package/src/elements/element-types.d.ts +0 -4353
  423. package/src/elements/embed.tsx +0 -35
  424. package/src/elements/empty.tsx +0 -29
  425. package/src/elements/feedback-bar.tsx +0 -66
  426. package/src/elements/file-tree.tsx +0 -62
  427. package/src/elements/file-upload.tsx +0 -44
  428. package/src/elements/form.tsx +0 -94
  429. package/src/elements/hover-card.tsx +0 -80
  430. package/src/elements/icon.tsx +0 -41
  431. package/src/elements/image.tsx +0 -32
  432. package/src/elements/input.tsx +0 -492
  433. package/src/elements/kbd.tsx +0 -45
  434. package/src/elements/link-preview.tsx +0 -34
  435. package/src/elements/loader.tsx +0 -25
  436. package/src/elements/markdown.tsx +0 -38
  437. package/src/elements/menu.tsx +0 -241
  438. package/src/elements/message-skills.tsx +0 -83
  439. package/src/elements/message.tsx +0 -361
  440. package/src/elements/model-switcher.tsx +0 -121
  441. package/src/elements/nav.tsx +0 -87
  442. package/src/elements/notice.tsx +0 -53
  443. package/src/elements/pane-grid.tsx +0 -111
  444. package/src/elements/pane-group.tsx +0 -119
  445. package/src/elements/pane.tsx +0 -129
  446. package/src/elements/popover.tsx +0 -81
  447. package/src/elements/progress-bar.tsx +0 -39
  448. package/src/elements/prompt-dock.tsx +0 -82
  449. package/src/elements/prompt-input.tsx +0 -240
  450. package/src/elements/prompt-suggestions.tsx +0 -113
  451. package/src/elements/radio-group.tsx +0 -129
  452. package/src/elements/reasoning.tsx +0 -71
  453. package/src/elements/register-impl.ts +0 -148
  454. package/src/elements/register.ts +0 -76
  455. package/src/elements/remote.tsx +0 -225
  456. package/src/elements/resizable.globals.d.ts +0 -36
  457. package/src/elements/resizable.tsx +0 -704
  458. package/src/elements/response-stream.tsx +0 -40
  459. package/src/elements/screen.tsx +0 -90
  460. package/src/elements/scroll-area.tsx +0 -33
  461. package/src/elements/scroll-button.tsx +0 -179
  462. package/src/elements/search.tsx +0 -185
  463. package/src/elements/segmented.tsx +0 -129
  464. package/src/elements/select.tsx +0 -165
  465. package/src/elements/separator.tsx +0 -36
  466. package/src/elements/setting-item.tsx +0 -50
  467. package/src/elements/settings-group.tsx +0 -37
  468. package/src/elements/skeleton.tsx +0 -45
  469. package/src/elements/slider.tsx +0 -171
  470. package/src/elements/slot-text.ts +0 -73
  471. package/src/elements/slots.ts +0 -787
  472. package/src/elements/source.tsx +0 -126
  473. package/src/elements/status.tsx +0 -42
  474. package/src/elements/switch.tsx +0 -118
  475. package/src/elements/tabs.tsx +0 -95
  476. package/src/elements/tasks.tsx +0 -103
  477. package/src/elements/text-shimmer.tsx +0 -28
  478. package/src/elements/thinking-bar.tsx +0 -43
  479. package/src/elements/thread.tsx +0 -139
  480. package/src/elements/toast.tsx +0 -106
  481. package/src/elements/tool.tsx +0 -78
  482. package/src/elements/tooltip.tsx +0 -85
  483. package/src/elements/validate-messages.ts +0 -76
  484. package/src/elements/voice-input.tsx +0 -100
  485. package/src/elements/voice-output.tsx +0 -82
  486. package/src/index.ts +0 -430
  487. package/src/primitives/audio-bands.ts +0 -174
  488. package/src/primitives/card-component-types.ts +0 -63
  489. package/src/primitives/card-contract.ts +0 -80
  490. package/src/primitives/card-data-types.ts +0 -361
  491. package/src/primitives/card-host.tsx +0 -37
  492. package/src/primitives/card-recovery.ts +0 -160
  493. package/src/primitives/card-registry.tsx +0 -78
  494. package/src/primitives/card-resolution.ts +0 -36
  495. package/src/primitives/card-routing.ts +0 -85
  496. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  497. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  498. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  499. package/src/primitives/card-schemas/choice.schema.json +0 -75
  500. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  501. package/src/primitives/card-schemas/embed.schema.json +0 -63
  502. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  503. package/src/primitives/card-schemas/form.schema.json +0 -53
  504. package/src/primitives/card-schemas/link.schema.json +0 -54
  505. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  506. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  507. package/src/primitives/card-tags.ts +0 -61
  508. package/src/primitives/card-validate-cards.ts +0 -255
  509. package/src/primitives/card-validate-schemas.ts +0 -58
  510. package/src/primitives/card-validate.ts +0 -131
  511. package/src/primitives/chat-config.tsx +0 -103
  512. package/src/primitives/composer-model.ts +0 -49
  513. package/src/primitives/composer-triggers.ts +0 -35
  514. package/src/primitives/controllable.ts +0 -21
  515. package/src/primitives/conversation-store.ts +0 -248
  516. package/src/primitives/create-kai-chat.ts +0 -66
  517. package/src/primitives/create-tween.ts +0 -266
  518. package/src/primitives/embed-providers.ts +0 -254
  519. package/src/primitives/field-mask.ts +0 -256
  520. package/src/primitives/field-semantics.ts +0 -115
  521. package/src/primitives/highlighter.ts +0 -157
  522. package/src/primitives/input-mask.ts +0 -853
  523. package/src/primitives/link-preview.ts +0 -87
  524. package/src/primitives/message-feedback.ts +0 -124
  525. package/src/primitives/pdf-preview.ts +0 -121
  526. package/src/primitives/toast-store.ts +0 -338
  527. package/src/primitives/url-scheme-policy.ts +0 -70
  528. package/src/primitives/use-audio-analysis.ts +0 -340
  529. package/src/primitives/use-auto-resize.ts +0 -31
  530. package/src/primitives/use-resize-observer.ts +0 -45
  531. package/src/primitives/use-sequencer.ts +0 -72
  532. package/src/primitives/use-speech-recognition.ts +0 -146
  533. package/src/primitives/use-stick-to-bottom.ts +0 -75
  534. package/src/primitives/use-text-stream.ts +0 -143
  535. package/src/primitives/use-voice-recorder.ts +0 -62
  536. package/src/primitives/visualizer-sequences.ts +0 -350
  537. package/src/remote/host-embed.ts +0 -345
  538. package/src/remote/index.ts +0 -2
  539. package/src/remote/origin.ts +0 -30
  540. package/src/remote/provider-runtime.ts +0 -262
  541. package/src/remote/provider.ts +0 -2
  542. package/src/remote/validate.ts +0 -22
  543. package/src/remote/version.ts +0 -12
  544. package/src/remote/wire.ts +0 -48
  545. package/src/schemas/from-tool-call.ts +0 -151
  546. package/src/schemas/index.ts +0 -341
  547. package/src/schemas/provider-subsets.ts +0 -538
  548. package/src/schemas/registry.ts +0 -355
  549. package/src/schemas/tool-defs.ts +0 -793
  550. package/src/solid.ts +0 -173
  551. package/src/state/index.ts +0 -44
  552. package/src/state/messages.ts +0 -53
  553. package/src/state/mock.ts +0 -297
  554. package/src/state/parts.ts +0 -295
  555. package/src/state/persistence.ts +0 -180
  556. package/src/state/stream.ts +0 -246
  557. package/src/state/suggestions.ts +0 -9
  558. package/src/state/threads.ts +0 -142
  559. package/src/test-utils/fake-clock.ts +0 -88
  560. package/src/types.ts +0 -95
  561. package/src/ui/action-icons.ts +0 -53
  562. package/src/ui/agent-card.tsx +0 -218
  563. package/src/ui/avatar.tsx +0 -23
  564. package/src/ui/badge.tsx +0 -21
  565. package/src/ui/button.tsx +0 -49
  566. package/src/ui/card.tsx +0 -245
  567. package/src/ui/checkbox-group.tsx +0 -153
  568. package/src/ui/checkbox.tsx +0 -63
  569. package/src/ui/collapsible.tsx +0 -163
  570. package/src/ui/command.tsx +0 -103
  571. package/src/ui/dialog.tsx +0 -223
  572. package/src/ui/dock.tsx +0 -630
  573. package/src/ui/dropdown.tsx +0 -636
  574. package/src/ui/editable-label.tsx +0 -112
  575. package/src/ui/hover-card.tsx +0 -345
  576. package/src/ui/icon.tsx +0 -167
  577. package/src/ui/input.tsx +0 -391
  578. package/src/ui/kbd.tsx +0 -118
  579. package/src/ui/nav.tsx +0 -282
  580. package/src/ui/notice.tsx +0 -84
  581. package/src/ui/overlay.tsx +0 -277
  582. package/src/ui/pane-grid.tsx +0 -117
  583. package/src/ui/pane-group.tsx +0 -291
  584. package/src/ui/pane.tsx +0 -193
  585. package/src/ui/popover.tsx +0 -106
  586. package/src/ui/progress-bar.tsx +0 -83
  587. package/src/ui/prompt-dock.tsx +0 -145
  588. package/src/ui/radio.tsx +0 -150
  589. package/src/ui/resizable.tsx +0 -693
  590. package/src/ui/scroll-area.tsx +0 -26
  591. package/src/ui/segmented.tsx +0 -109
  592. package/src/ui/select.tsx +0 -168
  593. package/src/ui/separator.tsx +0 -10
  594. package/src/ui/settings-group.tsx +0 -67
  595. package/src/ui/skeleton.tsx +0 -73
  596. package/src/ui/slider.tsx +0 -178
  597. package/src/ui/status.tsx +0 -48
  598. package/src/ui/switch.tsx +0 -119
  599. package/src/ui/tabs.tsx +0 -168
  600. package/src/ui/textarea.tsx +0 -21
  601. package/src/ui/tooltip.tsx +0 -118
  602. package/src/utils/cn.ts +0 -30
  603. package/src/wire/chunk.ts +0 -248
  604. package/src/wire/consume.ts +0 -599
  605. package/src/wire/diagnostics.ts +0 -727
  606. package/src/wire/encode-probe.ts +0 -214
  607. package/src/wire/encode.ts +0 -947
  608. package/src/wire/files.ts +0 -342
  609. package/src/wire/formats/anthropic.ts +0 -274
  610. package/src/wire/formats/openai.ts +0 -228
  611. package/src/wire/index.ts +0 -95
  612. package/src/wire/media-types.ts +0 -344
  613. package/src/wire/read.ts +0 -396
  614. package/src/wire/sink-helpers.ts +0 -50
  615. package/src/wire/sse.ts +0 -153
@@ -1,26 +0,0 @@
1
- import { type JSX, splitProps } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export type ScrollOrientation = 'vertical' | 'horizontal' | 'both';
5
-
6
- export interface ScrollAreaProps extends JSX.HTMLAttributes<HTMLDivElement> {
7
- children: JSX.Element;
8
- /** Which axis scrolls. `vertical` (default) · `horizontal` · `both`. The cross
9
- * axis is clamped to `hidden` so content can't overflow it. */
10
- orientation?: ScrollOrientation;
11
- }
12
-
13
- export function ScrollArea(props: ScrollAreaProps) {
14
- const [local, rest] = splitProps(props, ['children', 'class', 'orientation']);
15
- const overflow = () =>
16
- local.orientation === 'horizontal' ? 'overflow-x-auto overflow-y-hidden'
17
- : local.orientation === 'both' ? 'overflow-auto'
18
- : 'overflow-y-auto overflow-x-hidden';
19
- return (
20
- // tabindex=0 keeps the scroll region reachable by keyboard when it has no
21
- // focusable descendants (WCAG 2.1.1 — axe `scrollable-region-focusable`).
22
- <div tabindex={0} class={cn(overflow(), 'scrollbar-thin', local.class)} {...rest}>
23
- {local.children}
24
- </div>
25
- );
26
- }
@@ -1,109 +0,0 @@
1
- import { type JSX, For, Show, mergeProps } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export interface SegmentedOption {
5
- value: string;
6
- label: string;
7
- /** Optional leading icon (a JSX node, e.g. a lucide-solid icon). */
8
- icon?: JSX.Element;
9
- }
10
-
11
- export interface SegmentedProps {
12
- /** The selectable segments, left to right. */
13
- options: SegmentedOption[];
14
- /** The selected segment's `value` (controlled). */
15
- value: string;
16
- /** Fires with the next `value` when a segment is chosen. */
17
- onChange: (value: string) => void;
18
- /** Control density. Defaults to `md`. */
19
- size?: 'sm' | 'md';
20
- class?: string;
21
- }
22
-
23
- const SIZE: Record<'sm' | 'md', string> = {
24
- sm: 'h-7 px-2 text-xs',
25
- md: 'h-8 px-3 text-sm',
26
- };
27
-
28
- /**
29
- * `Segmented`: a single-select pill track (a.k.a. segmented / toggle-group). A
30
- * recessed `bg-surface-sunken` rail of segment buttons where the selected segment
31
- * lifts onto a raised `bg-background` chip. Token-driven, light + dark.
32
- *
33
- * a11y: `role="group"` of real `<button>`s, each carrying `aria-pressed`; a roving
34
- * tabindex (only the selected segment is in the tab order) with Arrow / Home / End
35
- * key navigation that moves selection between segments.
36
- */
37
- export function Segmented(props: SegmentedProps): JSX.Element {
38
- const merged = mergeProps({ size: 'md' as const }, props);
39
- const buttons: HTMLButtonElement[] = [];
40
-
41
- const currentIndex = () => merged.options.findIndex((o) => o.value === merged.value);
42
-
43
- const select = (i: number) => {
44
- const opt = merged.options[i];
45
- if (!opt) return;
46
- merged.onChange(opt.value);
47
- buttons[i]?.focus();
48
- };
49
-
50
- const onKeyDown = (e: KeyboardEvent) => {
51
- const count = merged.options.length;
52
- if (count === 0) return;
53
- const cur = currentIndex();
54
- if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
55
- e.preventDefault();
56
- select((Math.max(cur, 0) + 1) % count);
57
- } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
58
- e.preventDefault();
59
- select((Math.max(cur, 0) - 1 + count) % count);
60
- } else if (e.key === 'Home') {
61
- e.preventDefault();
62
- select(0);
63
- } else if (e.key === 'End') {
64
- e.preventDefault();
65
- select(count - 1);
66
- }
67
- };
68
-
69
- return (
70
- <div
71
- role="group"
72
- part="track"
73
- onKeyDown={onKeyDown}
74
- class={cn('inline-flex items-center gap-0.5 rounded-lg bg-surface-sunken p-0.5', merged.class)}
75
- >
76
- <For each={merged.options}>
77
- {(opt, i) => {
78
- const selected = () => opt.value === merged.value;
79
- // Roving tabindex: the selected segment is tabbable; if nothing matches,
80
- // the first segment falls back to tabbable so the group is reachable.
81
- const focusable = () => selected() || (currentIndex() === -1 && i() === 0);
82
- return (
83
- <button
84
- type="button"
85
- part="segment"
86
- ref={(el) => { buttons[i()] = el; }}
87
- aria-pressed={selected()}
88
- tabindex={focusable() ? 0 : -1}
89
- onClick={() => merged.onChange(opt.value)}
90
- class={cn(
91
- 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium transition-colors',
92
- 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
93
- SIZE[merged.size],
94
- selected()
95
- ? 'bg-background text-foreground shadow-sm'
96
- : 'text-muted-foreground hover:text-foreground',
97
- )}
98
- >
99
- <Show when={opt.icon}>
100
- <span class="inline-flex shrink-0 items-center" aria-hidden="true">{opt.icon}</span>
101
- </Show>
102
- <span>{opt.label}</span>
103
- </button>
104
- );
105
- }}
106
- </For>
107
- </div>
108
- );
109
- }
package/src/ui/select.tsx DELETED
@@ -1,168 +0,0 @@
1
- import { type JSX, For, Show, createEffect, splitProps } from 'solid-js';
2
- import { ChevronDown } from 'lucide-solid';
3
- import { cn } from '../utils/cn';
4
- import { FIELD_BASE, FIELD_INVALID } from './input';
5
-
6
- /** One choice in a {@link Select}. */
7
- export interface SelectOption<T = string> {
8
- /** The value this row selects. Compared to the select's `value` by identity. */
9
- value: T;
10
- /** Visible text. Defaults to `String(value)`. Native `<option>`s hold text, not markup. */
11
- label?: string;
12
- /** Disable this option alone (the select's `disabled` disables the whole control). */
13
- disabled?: boolean;
14
- }
15
-
16
- export interface SelectProps<T = string>
17
- extends Omit<JSX.SelectHTMLAttributes<HTMLSelectElement>, 'value' | 'children'> {
18
- /**
19
- * The choices, in display order. Rendered in full: the kit never truncates,
20
- * re-orders or de-duplicates a consumer's option list.
21
- *
22
- * Omit it and pass `children` instead when you need `<optgroup>`s or anything else
23
- * a flat list cannot express.
24
- */
25
- options?: readonly SelectOption<T>[];
26
- /**
27
- * The selected value, matched against each option's `value` by IDENTITY (so a
28
- * numeric enum selects on the number, not on its string form). Pass an array for a
29
- * `multiple` select.
30
- */
31
- value?: T | readonly T[];
32
- /**
33
- * Text for a leading, disabled, empty-valued option — the "nothing chosen yet" row.
34
- * Omitted means no such row is rendered at all; there is no default placeholder,
35
- * because inventing one would put words in the consumer's UI.
36
- */
37
- placeholder?: string;
38
- /** Force the invalid (destructive-border) state. Matches `Input`'s. */
39
- invalid?: boolean;
40
- /** Raw `<option>` / `<optgroup>` children, for lists `options` cannot express.
41
- * `value` still drives the selection when you use these: it is applied to the
42
- * rendered options rather than quietly doing nothing. */
43
- children?: JSX.Element;
44
- /** Extra classes for the positioning wrapper that holds the chevron. */
45
- containerClass?: string;
46
- }
47
-
48
- /**
49
- * A select. A REAL native `<select>` behind `appearance: none`, in a box consistent
50
- * with {@link Input}, with the kit's own chevron drawn over it.
51
- *
52
- * **Native, not a listbox, and that is the design.** A hand-built popup can be made to
53
- * look identical and cannot be made to behave identically: the native control brings
54
- * the platform picker on mobile, type-ahead on desktop, form participation, and the
55
- * OS's own accessibility tree. This kit's control audit found every one of its
56
- * accessibility defects in a control that had replaced a native element.
57
- *
58
- * The trade is that the *dropdown list itself* stays OS chrome — it renders outside the
59
- * page and no stylesheet reaches it. What the kit can do is make it follow the kit's
60
- * light/dark mode rather than the OS's, which `color-scheme` on the element host
61
- * already does (`src/elements/styles.css`). Styling the closed control and leaving the
62
- * open list to the platform is the whole of the bargain.
63
- *
64
- * Everything not listed in `SelectProps` is forwarded to the `<select>`, so `id`,
65
- * `name`, `required`, `disabled`, `multiple`, `size`, `aria-*`, any `data-*` hook and
66
- * the DOM events behave exactly as they do on a plain select. No validation is
67
- * applied: `required` reaches the native attribute and stops there.
68
- *
69
- * ```tsx
70
- * <Select
71
- * options={[{ value: 'low' }, { value: 'high', label: 'High priority' }]}
72
- * value={sev()}
73
- * placeholder="Choose a severity…"
74
- * onChange={(e) => setSev(e.currentTarget.value)}
75
- * />
76
- * ```
77
- */
78
- export function Select<T = string>(props: SelectProps<T>): JSX.Element {
79
- const [local, rest] = splitProps(props, [
80
- 'class', 'containerClass', 'options', 'value', 'placeholder', 'invalid', 'children', 'ref',
81
- ]);
82
-
83
- // A `multiple` select is a scrolling list box, not a closed control: there is no
84
- // collapsed state for a chevron to point at, and `appearance: none` on one buys
85
- // nothing. So the custom chrome applies to the single-value shape only.
86
- const isMulti = () => !!rest.multiple;
87
-
88
- const isSelected = (v: T): boolean => {
89
- const sel = local.value;
90
- if (Array.isArray(sel)) return (sel as readonly T[]).includes(v);
91
- return sel === v;
92
- };
93
-
94
- // Nothing chosen yet, for deciding whether the placeholder row is the selected one.
95
- // Array-aware on purpose: an empty array means nothing is selected, and without this
96
- // branch the browser would fall through to auto-selecting the first NON-disabled
97
- // option — i.e. showing a real choice while the caller's state said none was made.
98
- const isEmpty = (): boolean => {
99
- const v = local.value;
100
- if (Array.isArray(v)) return v.length === 0;
101
- return v === undefined || v === null || (v as unknown) === '';
102
- };
103
-
104
- return (
105
- <div class={cn('relative block w-full', local.containerClass)}>
106
- <select
107
- {...rest}
108
- ref={(el) => {
109
- // `ref` is split out and re-applied by hand because this component needs the
110
- // element itself for the `children` path below. Solid always hands a component
111
- // a ref FUNCTION (a variable ref compiles into one), so the typeof guard is for
112
- // the hand-written object case only.
113
- const forward = local.ref;
114
- if (typeof forward === 'function') (forward as (el: HTMLSelectElement) => void)(el);
115
-
116
- // `value` drives the `options` list declaratively (each `<option selected>`),
117
- // which cannot reach options the CALLER rendered as `children`. Applying it
118
- // imperatively for that path is the difference between "children are an
119
- // escape hatch" and "`value` silently does nothing once you use one".
120
- createEffect(() => {
121
- if (local.children === undefined) return;
122
- const v = local.value;
123
- if (v === undefined || v === null) return;
124
- if (Array.isArray(v)) {
125
- const wanted = new Set((v as readonly unknown[]).map(String));
126
- for (const o of el.options) o.selected = wanted.has(o.value);
127
- } else {
128
- el.value = String(v);
129
- }
130
- });
131
- }}
132
- class={cn(
133
- FIELD_BASE,
134
- // `peer` so the chevron beside it can dim with the control.
135
- 'peer',
136
- // `pr-9` reserves the lane the chevron sits in, so a long option label never
137
- // slides under it.
138
- !isMulti() && 'cursor-pointer appearance-none pr-9',
139
- local.invalid && FIELD_INVALID,
140
- local.class,
141
- )}
142
- >
143
- <Show when={local.placeholder !== undefined}>
144
- <option value="" disabled selected={isEmpty()}>
145
- {local.placeholder}
146
- </option>
147
- </Show>
148
- <For each={local.options}>
149
- {(opt) => (
150
- <option value={String(opt.value)} disabled={opt.disabled} selected={isSelected(opt.value)}>
151
- {opt.label ?? String(opt.value)}
152
- </option>
153
- )}
154
- </For>
155
- {local.children}
156
- </select>
157
- <Show when={!isMulti()}>
158
- {/* `pointer-events-none` so the chevron is decoration and every click, including
159
- one landing on the arrow, still opens the native picker. `aria-hidden`
160
- because the select already announces itself as a combo box. */}
161
- <ChevronDown
162
- aria-hidden="true"
163
- class="pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground peer-disabled:opacity-50"
164
- />
165
- </Show>
166
- </div>
167
- );
168
- }
@@ -1,10 +0,0 @@
1
- import { type JSX, splitProps } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export interface SeparatorProps extends JSX.HTMLAttributes<HTMLDivElement> { orientation?: 'horizontal' | 'vertical'; }
5
-
6
- export function Separator(props: SeparatorProps) {
7
- const [local, rest] = splitProps(props, ['orientation', 'class']);
8
- const isVertical = () => local.orientation === 'vertical';
9
- return <div role="separator" class={cn('shrink-0 bg-border', isVertical() ? 'h-full w-px' : 'h-px w-full', local.class)} {...rest} />;
10
- }
@@ -1,67 +0,0 @@
1
- import { type JSX, Show } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export interface SettingsGroupProps {
5
- /** Small section heading shown above the card. */
6
- heading: string;
7
- /** Optional muted description under the heading. */
8
- description?: string;
9
- /** The stacked `SettingItem` rows. */
10
- children: JSX.Element;
11
- class?: string;
12
- }
13
-
14
- /**
15
- * A settings section: a small heading + optional muted description over a bordered,
16
- * rounded card that stacks `SettingItem` rows with hairline dividers between them.
17
- * Host-agnostic chrome: the SAME group drops into a modal or a full settings page;
18
- * only the content (the rows) changes per app.
19
- */
20
- export function SettingsGroup(props: SettingsGroupProps): JSX.Element {
21
- return (
22
- <section class={cn('flex flex-col gap-2', props.class)}>
23
- <div part="header" class="flex flex-col gap-0.5 px-1">
24
- <h3 class="text-xs font-semibold uppercase tracking-wide text-muted-foreground">
25
- {props.heading}
26
- </h3>
27
- <Show when={props.description}>
28
- <p class="text-xs text-muted-foreground">{props.description}</p>
29
- </Show>
30
- </div>
31
- <div part="body" class="divide-y divide-border overflow-hidden rounded-xl border border-border bg-surface">
32
- {props.children}
33
- </div>
34
- </section>
35
- );
36
- }
37
-
38
- export interface SettingItemProps {
39
- /** Row label (primary text). */
40
- label: string;
41
- /** Optional secondary description under the label. */
42
- description?: string;
43
- /** The control on the right (a `Switch`, `Segmented`, select, ...). Omit for a
44
- * plain label row. */
45
- control?: JSX.Element;
46
- class?: string;
47
- }
48
-
49
- /**
50
- * One row inside a `SettingsGroup`: a left label/description block and an optional
51
- * right-aligned `control`, vertically centered with comfortable padding.
52
- */
53
- export function SettingItem(props: SettingItemProps): JSX.Element {
54
- return (
55
- <div class={cn('flex items-center justify-between gap-4 px-4 py-3', props.class)}>
56
- <div part="label" class="flex min-w-0 flex-col gap-0.5">
57
- <span class="text-sm text-foreground">{props.label}</span>
58
- <Show when={props.description}>
59
- <span class="text-xs leading-snug text-muted-foreground">{props.description}</span>
60
- </Show>
61
- </div>
62
- <Show when={props.control}>
63
- <div part="control" class="shrink-0">{props.control}</div>
64
- </Show>
65
- </div>
66
- );
67
- }
@@ -1,73 +0,0 @@
1
- import { type JSX, splitProps, For, Show } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export type SkeletonVariant = 'text' | 'rect' | 'circle';
5
-
6
- export interface SkeletonProps extends JSX.HTMLAttributes<HTMLDivElement> {
7
- /** Shape preset. `text` = one or more lines; `rect` = a block; `circle` =
8
- * round. Omit for the bare, class-driven block (size it with utility classes
9
- * yourself — the original low-level usage). */
10
- variant?: SkeletonVariant;
11
- /** CSS width (a number is treated as px). With a `variant` and no width it
12
- * fills its container (responsive); for `circle` it is the diameter. */
13
- width?: string | number;
14
- /** CSS height (a number is treated as px). Defaults per variant. */
15
- height?: string | number;
16
- /** `text` only: how many lines to render (the last is shorter). Default 1. */
17
- lines?: number;
18
- }
19
-
20
- const len = (v?: string | number) => (typeof v === 'number' ? `${v}px` : v);
21
-
22
- const rounding = (variant?: SkeletonVariant) =>
23
- variant === 'circle' ? 'rounded-full' : variant === 'text' ? 'rounded' : 'rounded-md';
24
-
25
- function Skeleton(props: SkeletonProps) {
26
- const [local, rest] = splitProps(props, ['class', 'variant', 'width', 'height', 'lines', 'style']);
27
-
28
- const hasWidth = () => local.width != null;
29
- const hasHeight = () => local.height != null;
30
- // The responsive default applies only to the variant API; bare class-driven
31
- // usage is left untouched so `<Skeleton class="h-4 w-64" />` keeps working.
32
- const fills = () => !hasWidth() && local.variant != null && local.variant !== 'circle';
33
-
34
- const blockStyle = (shortLast: boolean): JSX.CSSProperties => {
35
- const style: JSX.CSSProperties = typeof local.style === 'object' && local.style ? { ...local.style } : {};
36
- if (local.variant === 'circle') {
37
- const d = len(local.width) ?? len(local.height) ?? '2.5rem';
38
- style.width = d;
39
- style.height = d;
40
- return style;
41
- }
42
- if (shortLast) style.width = '70%';
43
- else if (hasWidth()) style.width = len(local.width);
44
- if (hasHeight()) style.height = len(local.height);
45
- else if (local.variant === 'text') style.height = '0.75rem';
46
- return style;
47
- };
48
-
49
- const block = (shortLast = false) => (
50
- <div
51
- part="skeleton"
52
- // `bg-foreground/10` tints from the theme foreground, so it keeps a visible
53
- // ~10% contrast against the background in BOTH light and dark (the old
54
- // `bg-muted` was nearly invisible on a light surface). Recolor / restyle
55
- // opacity from outside via `::part(skeleton)`.
56
- class={cn('animate-pulse bg-foreground/10', rounding(local.variant), fills() && 'w-full', local.class)}
57
- style={blockStyle(shortLast)}
58
- {...rest}
59
- />
60
- );
61
-
62
- const lineCount = () => (local.variant === 'text' ? Math.max(1, local.lines ?? 1) : 1);
63
-
64
- return (
65
- <Show when={lineCount() > 1} fallback={block()}>
66
- <div class="flex w-full flex-col gap-2">
67
- <For each={Array.from({ length: lineCount() })}>{(_, i) => block(i() === lineCount() - 1)}</For>
68
- </div>
69
- </Show>
70
- );
71
- }
72
-
73
- export { Skeleton };
package/src/ui/slider.tsx DELETED
@@ -1,178 +0,0 @@
1
- import { type JSX, Show, splitProps, createSignal } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export interface SliderProps
5
- extends Omit<JSX.InputHTMLAttributes<HTMLInputElement>, 'type' | 'children' | 'min' | 'max' | 'step' | 'value'> {
6
- /**
7
- * Lowest selectable value. REQUIRED, and deliberately so.
8
- *
9
- * A range with no `min`/`max` is not a slider, it is a slider-shaped guess, and the
10
- * guess belongs to whoever knows what the number means. `SliderWidget` reading a
11
- * JSON-Schema field still defaults an absent `minimum` to 0 — that is the WIDGET's
12
- * decision about a consumer-authored schema, and it stays there rather than being
13
- * quietly adopted by every caller of this component.
14
- */
15
- min: number;
16
- /** Highest selectable value. REQUIRED for the same reason as `min`. */
17
- max: number;
18
- /** Granularity. Omitted means the native default (1); `'any'` means continuous. */
19
- step?: number | 'any';
20
- /** The current value. Controlled — drive it from `onInput`. Omit for uncontrolled. */
21
- value?: number;
22
- /** Initial value when uncontrolled. */
23
- defaultValue?: number;
24
- /**
25
- * Show the current value beside the track. Off by default.
26
- *
27
- * Two shapes, because one is not enough and three would be too many. `true` renders
28
- * the raw number, which is what most sliders want. A FUNCTION renders whatever it
29
- * returns, because plenty of sliders are not counting bare numbers: `60%`, `3 of 5`,
30
- * `1m 30s`. A boolean alone cannot express those, and a formatter alone would make
31
- * the common case read `valueLabel={(v) => v}`.
32
- *
33
- * The readout is `aria-hidden`. The input already reports the same number through
34
- * `aria-valuenow` / `aria-valuetext`, so an exposed copy would be announced twice.
35
- *
36
- * NOTE ON STRUCTURE: with a readout the component renders a flex row around the
37
- * input; without one it is still a bare `<input>` and nothing changes for existing
38
- * callers. Toggling this at runtime therefore rebuilds the input element, which is
39
- * fine for a control panel and not something a real app does mid-drag.
40
- */
41
- valueLabel?: boolean | ((value: number) => JSX.Element);
42
- }
43
-
44
- /**
45
- * A slider. A REAL `<input type="range">` behind `appearance: none`, styled by the
46
- * kit's `.kai-range` rule, never a `<div>` with a drag handler.
47
- *
48
- * The native control brings the whole keyboard contract (arrows, Home, End,
49
- * PageUp/PageDown), pointer and touch dragging, form participation via `name`, and
50
- * the `slider` role with a live value announcement — all of it for free and all of it
51
- * correct. Every accessibility defect this kit's control audit found was in a control
52
- * that had replaced the native element with something hand-rolled.
53
- *
54
- * What the component adds is the **filled track**. `.kai-range` paints the portion
55
- * left of the thumb from a `--kai-range-fill` custom property, and until now every
56
- * caller computed that percentage itself. It is arithmetic over `min`, `max` and the
57
- * current value — three things this component already has — so no consumer should
58
- * ever write it again.
59
- *
60
- * Everything not listed in `SliderProps` is forwarded to the input, so `id`, `name`,
61
- * `disabled`, `required`, `aria-*` and any `data-*` hook behave exactly as they do on
62
- * a plain `<input>`. No clamping and no validation is applied: a value outside
63
- * `min`..`max` is the browser's business, not ours.
64
- *
65
- * ```tsx
66
- * <Slider min={0} max={100} step={5} value={v()} onInput={(e) => setV(e.currentTarget.valueAsNumber)} />
67
- * ```
68
- */
69
- export function Slider(props: SliderProps): JSX.Element {
70
- const [local, rest] = splitProps(props, [
71
- 'class', 'style', 'min', 'max', 'step', 'value', 'defaultValue', 'ref', 'valueLabel',
72
- ]);
73
-
74
- // The uncontrolled mirror. A slider's fill has to follow the thumb even when nobody
75
- // is holding the value in a signal, so the component tracks the live value itself
76
- // through a NATIVE `on:input` listener. That is `on:` and not `onInput` on purpose:
77
- // `onInput` stays in `rest` and reaches the input untouched, so a caller's handler
78
- // is neither wrapped nor swallowed, and the two listeners simply both run.
79
- const [live, setLive] = createSignal<number | undefined>(props.defaultValue);
80
-
81
- // HTML's own rule for a range with no value: the midpoint of the span. Restated here
82
- // rather than left to the browser because the fill has to agree with the thumb on the
83
- // very first paint, before any input event exists.
84
- const current = () => local.value ?? live() ?? (local.min + local.max) / 2;
85
-
86
- const fill = (): string => {
87
- const lo = local.min;
88
- const hi = local.max;
89
- if (!(hi > lo)) return '0%';
90
- // Clamp: a value outside the range is the caller's to fix, but a track painted
91
- // 140% wide is a rendering artefact nobody asked for.
92
- const pct = ((current() - lo) / (hi - lo)) * 100;
93
- return `${Math.min(100, Math.max(0, pct))}%`;
94
- };
95
-
96
- // Merge rather than replace: `style` is a legitimate thing to pass a slider, and the
97
- // fill is a custom property that has to survive alongside it. Solid accepts either a
98
- // string or an object here, so both shapes are handled.
99
- const style = (): string | JSX.CSSProperties => {
100
- const s = local.style;
101
- if (typeof s === 'string') return `${s.replace(/;\s*$/, '')};--kai-range-fill:${fill()}`;
102
- return { ...(s ?? {}), '--kai-range-fill': fill() } as JSX.CSSProperties;
103
- };
104
-
105
- // CONTROLLED-MODE RECONCILIATION. A controlled `<input type="range">` in Solid can
106
- // drift: the browser moves the thumb on a drag, and if the caller's `value` does not
107
- // change in response, the bound expression is unchanged, so Solid never writes the
108
- // DOM back. The thumb ends up somewhere the component's own state says it is not —
109
- // and because the fill is derived from `value`, the two visibly DISAGREE. That is the
110
- // exact symptom reported against the Storybook Playground: thumb slides, track does
111
- // not. A pinned, writer-less `<Slider value={40} />` is a legitimate thing to render,
112
- // and it should look pinned rather than half-moved.
113
- //
114
- // WHY A MICROTASK AND NOT THE HANDLER OR A BARE EFFECT. Both of those run too early
115
- // and would break the ordinary controlled case. The `on:input` listener above is
116
- // attached to the TARGET, so it runs before the caller's `onInput`, which Solid
117
- // delegates at the document; snapping back there would hand the caller's handler a
118
- // value we had already reset. A `createEffect` is flushed at the end of the update
119
- // that `setLive` starts, which is still inside the target listener and therefore also
120
- // before the delegated one. A microtask runs after the whole event turn: every input
121
- // listener has run and any signal the caller set has propagated, so a value that
122
- // still disagrees means the caller genuinely did not accept the edit.
123
- let el: HTMLInputElement | undefined;
124
- const reconcileControlled = () => {
125
- const v = local.value;
126
- // Uncontrolled: `live` is the truth and the DOM is already showing it.
127
- if (v === undefined || el === undefined) return;
128
- if (el.valueAsNumber !== v) el.value = String(v);
129
- };
130
-
131
- const readout = (): JSX.Element => {
132
- const vl = local.valueLabel;
133
- return typeof vl === 'function' ? vl(current()) : current();
134
- };
135
-
136
- const control = () => (
137
- <input
138
- {...rest}
139
- type="range"
140
- class={cn('kai-range', local.class)}
141
- style={style()}
142
- min={local.min}
143
- max={local.max}
144
- step={local.step}
145
- value={local.value ?? live() ?? undefined}
146
- ref={(node) => {
147
- // `ref` is split out and re-applied by hand because this component needs the
148
- // element for the reconciliation above. Solid always hands a component a ref
149
- // FUNCTION (a variable ref compiles into one), so the typeof guard is for the
150
- // hand-written object case only.
151
- el = node;
152
- const forward = local.ref;
153
- if (typeof forward === 'function') (forward as (n: HTMLInputElement) => void)(node);
154
- }}
155
- on:input={(e) => {
156
- setLive((e.currentTarget as HTMLInputElement).valueAsNumber);
157
- queueMicrotask(reconcileControlled);
158
- }}
159
- />
160
- );
161
-
162
- return (
163
- <Show when={local.valueLabel} fallback={control()}>
164
- <div class="flex items-center gap-3">
165
- {control()}
166
- {/* aria-hidden: the input already announces this number. The readout is a
167
- second copy for the eyes only, and exposing it would double the
168
- announcement on every step of a drag. */}
169
- <span
170
- aria-hidden="true"
171
- class="min-w-9 shrink-0 rounded-md bg-background px-2 py-1 text-center text-sm font-medium tabular-nums text-foreground shadow-sm"
172
- >
173
- {readout()}
174
- </span>
175
- </div>
176
- </Show>
177
- );
178
- }