@kitn.ai/ui 0.27.0 → 0.29.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 (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.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-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  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 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  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 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  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 -518
  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 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,165 +0,0 @@
1
- import { createEffect, createSignal, untrack } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Select } from '../ui/select';
4
- // Public shape of the `options` prop; lives in ./element-data-types so the ROOT
5
- // entry can re-export it (see that file's header).
6
- import type { KaiSelectOption } from './element-data-types';
7
-
8
- interface Props extends Record<string, unknown> {
9
- /** The choices, in display order. Set as a JS PROPERTY (array), never an attribute.
10
- * Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
11
- options: KaiSelectOption[];
12
- /** Controlled selected value. Settable and reflected to the `value` attribute.
13
- * `el.value = 'high'` drives it; choosing an option updates it and fires
14
- * `kai-change`. Read `el.value` for live state; for a `multiple` select read
15
- * `el.values` instead. */
16
- value?: string;
17
- /** Text for a leading, disabled, empty option: the "nothing chosen yet" row.
18
- * Omitted means no such row at all; there is no default wording, because inventing
19
- * one would put words in your UI. */
20
- placeholder?: string;
21
- /** Allow more than one selection. Turns the control into the platform's list box, so
22
- * the kit's chevron is not drawn. */
23
- multiple?: boolean;
24
- /** Force the invalid (destructive-border) state. */
25
- invalid?: boolean;
26
- /** Disable interaction. */
27
- disabled?: boolean;
28
- /** Set the native `required` attribute, and nothing more. Whether an empty select is
29
- * an error is the application's rule, not the kit's. */
30
- required?: boolean;
31
- /** Accessible label for the control. */
32
- label?: string;
33
- /** Form-control name, for a native form submit. */
34
- name?: string;
35
- }
36
-
37
- /** Events fired by `<kai-select>`. */
38
- interface Events {
39
- /** A choice was made. `value` is the first selected option (empty when nothing is
40
- * selected); `values` is every selected option, which is what a `multiple` select
41
- * needs. Both are always present, so neither shape silently loses the other. */
42
- 'kai-change': { value: string; values: string[] };
43
- }
44
-
45
- /**
46
- * `<kai-select>` — a select over a REAL native `<select>`, in the kit's field box with
47
- * the kit's own chevron. Native, not a hand-built listbox: that is what keeps the
48
- * platform picker on mobile, type-ahead on desktop, form participation and the OS
49
- * accessibility tree.
50
- *
51
- * The dropdown list itself stays OS chrome — it renders outside the page and no
52
- * stylesheet reaches it. What the element does do is make it follow the kit's
53
- * light/dark mode rather than the OS's.
54
- *
55
- * Feed it `options` (a JS-property array of `{ value, label?, disabled? }`), drive and
56
- * read the selection with the `value` property (settable + reflected to the `value`
57
- * attribute, so `:host([value])` and `el.value` see live state), and listen for
58
- * `kai-change`.
59
- *
60
- * Re-rendering follows the kit's reactivity contract: hand it a NEW array reference,
61
- * and a new object for any option whose content changed — the list is
62
- * reference-keyed, so mutating an option in place changes nothing on screen.
63
- *
64
- * ```html
65
- * <kai-select value="high" placeholder="Choose a severity…" label="Severity"></kai-select>
66
- * <script type="module">
67
- * import '@kitn.ai/ui/elements';
68
- * const select = document.querySelector('kai-select');
69
- * // ARRAY prop — a JS property, never an attribute.
70
- * select.options = [
71
- * { value: 'low', label: 'Low' },
72
- * { value: 'high', label: 'High priority' },
73
- * { value: 'legacy', label: 'Legacy', disabled: true },
74
- * ];
75
- * select.addEventListener('kai-change', (e) => console.log(e.detail.value, e.detail.values));
76
- * select.value = 'low'; // drive it (no kai-change — the host already knows)
77
- * </script>
78
- * ```
79
- */
80
- defineWebComponent<Props, Events>('kai-select', {
81
- options: [],
82
- value: undefined,
83
- placeholder: undefined,
84
- multiple: undefined,
85
- invalid: undefined,
86
- disabled: undefined,
87
- required: undefined,
88
- label: undefined,
89
- name: undefined,
90
- }, (props, ctx) => {
91
- const { element, dispatch, flag, expose } = ctx;
92
-
93
- // Lift the selection into the facade and drive Select CONTROLLED so the host can read
94
- // it (`el.value` / `:host([value])`) and set it after mount. Seed from the `value`
95
- // property/attribute present on mount; nothing is auto-selected, because `options`
96
- // normally arrives as a property AFTER upgrade (kai-radio-group's structure).
97
- const seed = (props.value as string | undefined) ?? element.getAttribute('value') ?? '';
98
- const [values, setValues] = createSignal<string[]>(seed ? [seed] : []);
99
- const first = () => values()[0] ?? '';
100
-
101
- // Coerce anything arriving through the `value` setter (a JS assignment, or the
102
- // attributeChangedCallback write-back the reflect effect below triggers) to a string,
103
- // falling back to the live attribute when nullish so the write-back equals the signal
104
- // and the guards absorb it — no attr⇄prop feedback loop.
105
- const coerce = (v: unknown): string =>
106
- v == null ? (element.getAttribute('value') ?? '') : String(v);
107
-
108
- // Apply a new selection and fire kai-change once (the user-choice path).
109
- const apply = (next: string[]) => {
110
- const prev = untrack(values);
111
- if (prev.length === next.length && prev.every((v, i) => v === next[i])) return;
112
- setValues(next);
113
- dispatch('kai-change', { value: next[0] ?? '', values: next });
114
- };
115
-
116
- Object.defineProperty(element, 'value', {
117
- get: () => first(),
118
- set: (v: unknown) => {
119
- const next = coerce(v);
120
- if (untrack(first) !== next) setValues(next ? [next] : []);
121
- },
122
- configurable: true,
123
- enumerable: true,
124
- });
125
-
126
- // The multi-selection read/write side. `value` alone cannot represent it, and
127
- // returning only the first option from a `multiple` select would be a silent drop.
128
- Object.defineProperty(element, 'values', {
129
- get: () => values(),
130
- set: (v: unknown) => setValues(Array.isArray(v) ? v.map(String) : []),
131
- configurable: true,
132
- enumerable: true,
133
- });
134
-
135
- // Reflect the primary value → the `[value]` host attribute (for `:host([value])`).
136
- createEffect(() => {
137
- const v = first();
138
- if (v) {
139
- if (element.getAttribute('value') !== v) element.setAttribute('value', v);
140
- } else if (element.hasAttribute('value')) {
141
- element.removeAttribute('value');
142
- }
143
- });
144
-
145
- expose({
146
- /** Focus the inner select (the host element can't reach it). */
147
- focus: (options?: FocusOptions) =>
148
- element.shadowRoot?.querySelector<HTMLSelectElement>('select')?.focus(options),
149
- });
150
-
151
- return (
152
- <Select
153
- options={(props.options ?? []) as KaiSelectOption[]}
154
- value={values()}
155
- placeholder={props.placeholder as string | undefined}
156
- multiple={flag('multiple')}
157
- invalid={flag('invalid')}
158
- disabled={flag('disabled')}
159
- required={flag('required')}
160
- aria-label={props.label as string | undefined}
161
- name={props.name as string | undefined}
162
- onChange={(e) => apply([...e.currentTarget.selectedOptions].map((o) => o.value))}
163
- />
164
- );
165
- });
@@ -1,36 +0,0 @@
1
- import { Separator } from '../ui/separator';
2
- import { defineWebComponent } from './define';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** `horizontal` (default, block + full-width) or `vertical` (a rule inside a
6
- * flex/grid row, stretching to the row height). */
7
- orientation?: 'horizontal' | 'vertical';
8
- }
9
-
10
- /**
11
- * `<kai-separator>` — a themed divider between groups of content (toolbar
12
- * sections, menu groups, header/sidebar splits). Carries `role="separator"`.
13
- * Restyle via `::part(separator)`.
14
- *
15
- * ```html
16
- * <kai-separator></kai-separator>
17
- * <div style="display:flex; gap:.5rem">
18
- * <span>A</span><kai-separator orientation="vertical"></kai-separator><span>B</span>
19
- * </div>
20
- * ```
21
- */
22
- defineWebComponent<Props>('kai-separator', {
23
- orientation: 'horizontal',
24
- }, (props) => {
25
- const vertical = () => props.orientation === 'vertical';
26
- return (
27
- <>
28
- {/* The host owns its layout box: a horizontal rule is block + full-width;
29
- a vertical rule is an inline-block flex item that stretches to the row. */}
30
- <style>{vertical()
31
- ? ':host{display:inline-block;align-self:stretch}'
32
- : ':host{display:block}'}</style>
33
- <Separator orientation={vertical() ? 'vertical' : 'horizontal'} part="separator" />
34
- </>
35
- );
36
- });
@@ -1,50 +0,0 @@
1
- import { createSignal, onCleanup, onMount } from 'solid-js';
2
- import { SettingItem } from '../ui/settings-group';
3
- import { defineWebComponent } from './define';
4
-
5
- interface Props extends Record<string, unknown> {
6
- /** Row label (primary text). Attribute: `label`. */
7
- label?: string;
8
- /** Optional secondary description under the label. Attribute: `description`. */
9
- description?: string;
10
- }
11
-
12
- /**
13
- * `<kai-setting-item>` — one row inside a `<kai-settings-group>`: a left
14
- * label/description block and an optional right-aligned control. Slot the control
15
- * (a `<kai-switch>`, segmented control, select, …) into `slot="control"`; omit it
16
- * for a plain label row.
17
- *
18
- * Themeable `::part`s: `label` (the label/description block) and `control`.
19
- *
20
- * ```html
21
- * <kai-setting-item label="Reduce motion" description="Minimize animations.">
22
- * <kai-switch slot="control"></kai-switch>
23
- * </kai-setting-item>
24
- * ```
25
- */
26
- defineWebComponent<Props>('kai-setting-item', {
27
- label: '',
28
- description: undefined,
29
- }, (props, { element }) => {
30
- // The control region only renders when `slot="control"` is actually filled, so
31
- // a plain label row has no stray right-side wrapper. An empty `<slot>` is always
32
- // a truthy node, so we track occupancy and gate on it (the kai-card approach).
33
- // Re-read on child/attribute mutations so a late-slotted control lights up.
34
- const [hasControl, setHasControl] = createSignal(false);
35
- onMount(() => {
36
- const read = () => setHasControl(!!element.querySelector(':scope > [slot="control"]'));
37
- read();
38
- const observer = new MutationObserver(read);
39
- observer.observe(element, { childList: true, attributes: true, subtree: true });
40
- onCleanup(() => observer.disconnect());
41
- });
42
-
43
- return (
44
- <SettingItem
45
- label={props.label ?? ''}
46
- description={props.description}
47
- control={hasControl() ? <slot name="control" /> : undefined}
48
- />
49
- );
50
- });
@@ -1,37 +0,0 @@
1
- import { SettingsGroup } from '../ui/settings-group';
2
- import { defineWebComponent } from './define';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** Small section heading shown above the card. Attribute: `heading`. */
6
- heading?: string;
7
- /** Optional muted description under the heading. Attribute: `description`. */
8
- description?: string;
9
- }
10
-
11
- /**
12
- * `<kai-settings-group>` — a settings section: a small heading + optional muted
13
- * description over a bordered, rounded card that stacks `<kai-setting-item>` rows
14
- * with hairline dividers. Put the rows as light-DOM children (the default slot).
15
- *
16
- * Host-agnostic chrome: the SAME group drops into a modal or a full settings
17
- * page; only the rows change per app.
18
- *
19
- * Themeable `::part`s: `header` (the heading/description block) and `body` (the
20
- * rows card).
21
- *
22
- * ```html
23
- * <kai-settings-group heading="Appearance" description="How the app looks.">
24
- * <kai-setting-item label="Theme">
25
- * <kai-switch slot="control"></kai-switch>
26
- * </kai-setting-item>
27
- * </kai-settings-group>
28
- * ```
29
- */
30
- defineWebComponent<Props>('kai-settings-group', {
31
- heading: '',
32
- description: undefined,
33
- }, (props) => (
34
- <SettingsGroup heading={props.heading ?? ''} description={props.description}>
35
- <slot />
36
- </SettingsGroup>
37
- ));
@@ -1,45 +0,0 @@
1
- import { Skeleton, type SkeletonVariant } from '../ui/skeleton';
2
- import { defineWebComponent } from './define';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** `text` (one or more lines), `rect` (a block), or `circle` (round).
6
- * Defaults to `text`. */
7
- variant?: SkeletonVariant;
8
- /** CSS width (e.g. `'12rem'`, `'60%'`). Defaults to full width (responsive);
9
- * for `circle` it is the diameter. */
10
- width?: string;
11
- /** CSS height. Defaults per variant (a text line height; circle = width). */
12
- height?: string;
13
- /** `text` only: number of lines; the last is shorter. Defaults to 1. */
14
- lines?: number;
15
- }
16
-
17
- /**
18
- * `<kai-skeleton>` — a pulsing loading placeholder that preserves layout while
19
- * content arrives. Responsive by default (fills its container's width). It is
20
- * prop-driven because utility classes can't cross the shadow boundary: pick a
21
- * `variant` and optionally set `width` / `height` / `lines`.
22
- *
23
- * ```html
24
- * <kai-skeleton variant="text" lines="3"></kai-skeleton>
25
- * <kai-skeleton variant="circle" width="2.5rem"></kai-skeleton>
26
- * <kai-skeleton variant="rect" height="10rem"></kai-skeleton>
27
- * ```
28
- * Recolor by overriding the `--color-muted` token.
29
- */
30
- defineWebComponent<Props>('kai-skeleton', {
31
- variant: 'text',
32
- width: undefined,
33
- height: undefined,
34
- lines: undefined,
35
- }, (props) => (
36
- <>
37
- <style>{':host{display:block}'}</style>
38
- <Skeleton
39
- variant={props.variant ?? 'text'}
40
- width={props.width}
41
- height={props.height}
42
- lines={props.lines != null ? Number(props.lines) : undefined}
43
- />
44
- </>
45
- ));
@@ -1,171 +0,0 @@
1
- import { createEffect, createSignal, untrack } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Slider } from '../ui/slider';
4
-
5
- interface Props extends Record<string, unknown> {
6
- /** Lowest selectable value. Required: a range with no bounds is a guess, and the
7
- * guess belongs to whoever knows what the number means. */
8
- min?: number;
9
- /** Highest selectable value. Required, for the same reason as `min`. */
10
- max?: number;
11
- /** Granularity. Omitted means the native default of 1; `any` means continuous. */
12
- step?: number | 'any';
13
- /** Controlled value. Settable and reflected to the `value` attribute. `el.value = 40`
14
- * drives it; dragging updates it and fires `kai-input` per step, `kai-change` on
15
- * release. Read `el.value` for live state. */
16
- value?: number;
17
- /** Disable interaction. */
18
- disabled?: boolean;
19
- /** Accessible label for the slider. */
20
- label?: string;
21
- /** Form-control name, for a native form submit. */
22
- name?: string;
23
- /** Show the current value beside the track. Off by default.
24
- *
25
- * Two ways in, because one of them is not a scalar. As a bare ATTRIBUTE
26
- * (`<kai-slider value-label>`) it renders the raw number. As a JS PROPERTY it also
27
- * accepts a formatter function (`el.valueLabel = (v) => v + '%'`), for a slider that
28
- * is not counting bare numbers. A function cannot survive an attribute, so that half
29
- * is property-only.
30
- *
31
- * The readout is hidden from assistive tech: the slider already reports the same
32
- * number, and an exposed copy would be announced twice. */
33
- valueLabel?: boolean | ((value: number) => string);
34
- }
35
-
36
- /** Events fired by `<kai-slider>`. */
37
- interface Events {
38
- /** The thumb moved. Fires per step during a drag or a key press. */
39
- 'kai-input': { value: number };
40
- /** The value was committed: pointer released, or a key press finished. */
41
- 'kai-change': { value: number };
42
- }
43
-
44
- /**
45
- * `<kai-slider>` — a slider over a real `<input type="range">`, with the kit's filled
46
- * track and thumb. Arrows, Home, End and PageUp/PageDown all work because the control
47
- * underneath is the browser's, not a reimplementation.
48
- *
49
- * Give it `min` and `max` (there are no defaults on purpose), drive and read the
50
- * position with the `value` property, and listen for `kai-input` while dragging or
51
- * `kai-change` on release.
52
- *
53
- * ```html
54
- * <kai-slider min="0" max="100" step="5" value="40" label="Temperature"></kai-slider>
55
- * <script type="module">
56
- * import '@kitn.ai/ui/elements';
57
- * const slider = document.querySelector('kai-slider');
58
- * slider.addEventListener('kai-input', (e) => console.log(e.detail.value));
59
- * slider.value = 70; // drive it (no event — the host already knows)
60
- * </script>
61
- * ```
62
- */
63
- defineWebComponent<Props, Events>('kai-slider', {
64
- min: undefined,
65
- max: undefined,
66
- step: undefined,
67
- value: undefined,
68
- disabled: undefined,
69
- label: undefined,
70
- name: undefined,
71
- valueLabel: undefined,
72
- }, (props, ctx) => {
73
- const { element, dispatch, flag, expose } = ctx;
74
-
75
- // `Number(null)` is 0 and `Number('')` is 0, both FINITE, so a naive
76
- // `Number.isFinite(Number(v))` treats a missing attribute as a real zero and the
77
- // fallbacks below never fire. Reject the empty cases before coercing.
78
- const num = (v: unknown, fallback: number): number => {
79
- if (v == null || (typeof v === 'string' && v.trim() === '')) return fallback;
80
- const n = Number(v);
81
- return Number.isFinite(n) ? n : fallback;
82
- };
83
- // No invented bounds: these mirror the native `<input type="range">` defaults, which
84
- // is what an author who wrote neither attribute is already going to get.
85
- const min = () => num(props.min, 0);
86
- const max = () => num(props.max, 100);
87
-
88
- // Lift the position into the facade and drive Slider CONTROLLED so the host can read
89
- // it (`el.value` / `:host([value])`) and set it after mount. Seed from the `value`
90
- // property/attribute present on mount, falling back to the midpoint — HTML's own rule
91
- // for a range with no value. kai-checkbox / kai-radio-group's structure, deliberately.
92
- const [value, setValue] = createSignal(
93
- props.value != null
94
- ? num(props.value, (min() + max()) / 2)
95
- : num(element.getAttribute('value'), (min() + max()) / 2),
96
- );
97
-
98
- // Coerce anything arriving through the `value` setter (a JS assignment, or the
99
- // write-back `attributeChangedCallback` fires when the reflect effect below writes the
100
- // attribute) to a number, falling back to the live attribute when nullish so the
101
- // write-back equals the signal and the guard absorbs it — no attr⇄prop feedback loop.
102
- const coerce = (v: unknown): number =>
103
- v == null ? num(element.getAttribute('value'), untrack(value)) : num(v, untrack(value));
104
-
105
- // Apply a new value and fire once (the user path). No-op while disabled.
106
- const apply = (next: number, type: 'kai-input' | 'kai-change') => {
107
- if (flag('disabled')) return;
108
- // kai-change fires on commit EVEN IF the value equals the last one this element
109
- // reported, because "you let go here" is information the host cannot derive; the
110
- // equality guard applies to the per-step stream only.
111
- if (type === 'kai-input' && untrack(value) === next) return;
112
- setValue(next);
113
- dispatch(type, { value: next });
114
- };
115
-
116
- // Reads return LIVE state; host writes drive it WITHOUT firing an event — the host
117
- // already knows what it set. The equality guard kills the reflect write-back.
118
- Object.defineProperty(element, 'value', {
119
- get: () => value(),
120
- set: (v: unknown) => { const next = coerce(v); if (untrack(value) !== next) setValue(next); },
121
- configurable: true,
122
- enumerable: true,
123
- });
124
-
125
- // Reflect internal value → the `[value]` host attribute (for `:host([value])`).
126
- createEffect(() => {
127
- const v = String(value());
128
- if (element.getAttribute('value') !== v) element.setAttribute('value', v);
129
- });
130
-
131
- expose({
132
- /** Focus the inner range input (the host element can't reach it). */
133
- focus: (options?: FocusOptions) =>
134
- element.shadowRoot?.querySelector<HTMLInputElement>('input[type="range"]')?.focus(options),
135
- });
136
-
137
- // `step` arrives as a string when it came from an attribute. Resolve the one literal
138
- // the spec allows (`any`, continuous) and treat everything else as a number.
139
- const step = (): number | 'any' | undefined => {
140
- const raw = props.step;
141
- if (raw == null) return undefined;
142
- if (String(raw) === 'any') return 'any';
143
- const n = Number(raw);
144
- return Number.isFinite(n) ? n : undefined;
145
- };
146
-
147
- // `valueLabel` arrives either as a bare attribute (the boolean half) or as a property
148
- // holding a formatter (the half an attribute cannot carry). `flag` handles the first,
149
- // a typeof check the second.
150
- const valueLabel = (): boolean | ((v: number) => string) => {
151
- const raw = props.valueLabel;
152
- if (typeof raw === 'function') return raw as (v: number) => string;
153
- return flag('valueLabel');
154
- };
155
-
156
- // Base sets `:host{display:block}`, which is right for a full-width track.
157
- return (
158
- <Slider
159
- min={min()}
160
- max={max()}
161
- step={step()}
162
- value={value()}
163
- disabled={flag('disabled')}
164
- aria-label={props.label as string | undefined}
165
- name={props.name as string | undefined}
166
- valueLabel={valueLabel()}
167
- onInput={(e) => apply(e.currentTarget.valueAsNumber, 'kai-input')}
168
- onChange={(e) => apply(e.currentTarget.valueAsNumber, 'kai-change')}
169
- />
170
- );
171
- });
@@ -1,73 +0,0 @@
1
- import { createSignal, type Accessor } from 'solid-js';
2
-
3
- /**
4
- * Track whether a `<slot>` is projecting VISIBLE TEXT, so a facade can tell
5
- * "this control shows its own name" from "this control is icon-only and needs
6
- * one".
7
- *
8
- * WHY IT EXISTS. Slotted light-DOM text is part of the flattened tree, so it
9
- * names the shadow `<button>` all by itself — measured, not assumed:
10
- * `scripts/probe-button-accessible-name.mjs` reads chromium's AX tree and
11
- * `<kai-button>Save</kai-button>` computes the name "Save" from `contents`,
12
- * with no `aria-label` anywhere. An `aria-label` on top of that does not add a
13
- * name, it REPLACES one, and a replacement that disagrees with the visible text
14
- * is a WCAG 2.5.3 (Label in Name) failure: speech-input users say what they
15
- * see, so a button reading "Save" whose accessible name is "Submit" cannot be
16
- * activated by voice at all. `kai-checkpoint` already resolved this the same
17
- * way; this is the reusable form of that decision.
18
- *
19
- * WHY A SIGNAL AND NOT A ONE-OFF READ. The facade renders while the HTML parser
20
- * is still inside the element's own tag, so the light DOM is usually EMPTY at
21
- * that moment and any synchronous read of `element.childNodes` reports "no text"
22
- * for the most common case there is. `slotchange` is the event that tells the
23
- * truth, and it fires on the initial assignment too.
24
- *
25
- * The initial value is therefore `false`, meaning "assume icon-only", which
26
- * makes the pre-`slotchange` frame emit the `aria-label`. That direction is
27
- * deliberate: an overridden name is a defect, an ABSENT name is a worse one, so
28
- * the transient state is the named one. `slotchange` is queued as a mutation
29
- * observer microtask, so it lands before paint and no assistive technology
30
- * observes the transient.
31
- */
32
- export function createSlotText(options: {
33
- /**
34
- * Follow `assignedNodes({ flatten: true })`, which descends into nested
35
- * light-DOM `<slot>` elements (a consumer wrapping the element in their OWN
36
- * component and forwarding a slot) — and, when nothing is assigned, returns
37
- * the slot's FALLBACK content.
38
- *
39
- * Only safe on a slot whose fallback is exactly the visible label. Do NOT set
40
- * it on a slot whose fallback can render a non-name (an icon that happens to
41
- * be plain text, say): the fallback would count as visible text and suppress
42
- * the very `aria-label` that names the control. `kai-button`'s default slot
43
- * has no fallback at all, so flatten there only buys the nested case;
44
- * `kai-menu`'s trigger slot falls back to an icon, so it must not use it.
45
- */
46
- flatten?: boolean;
47
- } = {}): {
48
- /** Whether the slot is currently showing text. */
49
- hasText: Accessor<boolean>;
50
- /** `ref` for the `<slot>`. Re-reads on every `slotchange`. */
51
- ref: (slot: HTMLSlotElement) => void;
52
- } {
53
- const [hasText, setHasText] = createSignal(false);
54
-
55
- const read = (slot: HTMLSlotElement) => {
56
- const nodes = slot.assignedNodes({ flatten: options.flatten ?? false });
57
- setHasText(nodes.some((node) => (node.textContent ?? '').trim() !== ''));
58
- };
59
-
60
- return {
61
- hasText,
62
- ref: (slot: HTMLSlotElement) => {
63
- // A slot outside a shadow root assigns nothing, and this ref runs before
64
- // solid inserts it — so this first read is normally `false` and the
65
- // slotchange below is what carries the answer. It is here for the case
66
- // where the element is created with its children already in place
67
- // (`el.textContent = 'Save'` then appended), where no assignment CHANGE
68
- // happens after insertion and slotchange may never fire.
69
- read(slot);
70
- slot.addEventListener('slotchange', () => read(slot));
71
- },
72
- };
73
- }