@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,361 +0,0 @@
1
- import { Show, createSignal, createEffect, onMount, onCleanup, type JSX } from 'solid-js';
2
- import { Dynamic } from 'solid-js/web';
3
- import { defineWebComponent } from './define';
4
- import { readSlots, MESSAGE_SLOTS } from './slots';
5
- import { ChatConfig, useChatConfig, type ProseSize } from '../primitives/chat-config';
6
- import { Message, MessageAvatar, MessageBody } from '../components/message';
7
- import { createMessageFeedback } from '../primitives/message-feedback';
8
- import {
9
- mergeCardTags,
10
- BUILTIN_CARD_TAGS,
11
- BUILTIN_CARD_COMPONENTS,
12
- type CardTagMap,
13
- type CardComponentMap,
14
- } from '../primitives/card-registry';
15
- import type { CardEnvelope } from '../primitives/card-contract';
16
- import { hasParts } from './validate-messages';
17
- import type { ChatMessage } from './chat-types';
18
-
19
- /**
20
- * Bridges the web-component-facing `cardTypes` (envelope type -> custom-element
21
- * TAG name, e.g. `{ 'my-widget': 'my-widget-el' }`) into the `CardComponentMap`
22
- * that `MessageBody`/`Thread` expect. A type the consumer did NOT override keeps
23
- * rendering its built-in Solid component directly (no extra custom-element
24
- * indirection); an overridden built-in or a brand-new consumer type renders as a
25
- * dynamically-created custom element instead, mirroring `<kai-cards>`'s
26
- * `CardSlot`. A type with no tag at all (unregistered) simply gets no entry, so
27
- * `CardRenderer`'s own fallback (`CardFallback`) takes over.
28
- */
29
- export function cardComponentsFromTags(types?: CardTagMap, theme = 'auto'): CardComponentMap {
30
- const tags = mergeCardTags(types);
31
- const map: CardComponentMap = {};
32
- for (const type of Object.keys(tags)) {
33
- const tag = tags[type];
34
- map[type] = tag === BUILTIN_CARD_TAGS[type] && BUILTIN_CARD_COMPONENTS[type]
35
- ? BUILTIN_CARD_COMPONENTS[type]
36
- : (p) => <CardTagSlot tag={tag} envelope={p.envelope} theme={theme} />;
37
- }
38
- return map;
39
- }
40
-
41
- /** Renders one envelope as a dynamically-created custom element, setting the
42
- * envelope's data/id/title/resolution as DOM properties (reactive) plus the
43
- * `theme` + `data-card-id` chrome, mirroring `<kai-cards>`'s `CardSlot` so a
44
- * custom card behaves identically whether it arrives via `<kai-cards>` or a
45
- * `card` message part here. */
46
- function CardTagSlot(props: { tag: string; envelope: CardEnvelope; theme: string }): JSX.Element {
47
- let ref: HTMLElement | undefined;
48
- createEffect(() => {
49
- if (!ref) return;
50
- (ref as unknown as { data: unknown }).data = props.envelope.data;
51
- (ref as unknown as { cardId: string }).cardId = props.envelope.id;
52
- if (props.envelope.title != null) (ref as unknown as { heading: string }).heading = props.envelope.title;
53
- (ref as unknown as { resolution: unknown }).resolution = props.envelope.resolution;
54
- ref.setAttribute('theme', props.theme);
55
- ref.setAttribute('data-card-id', props.envelope.id);
56
- });
57
- return <Dynamic component={props.tag} ref={ref} />;
58
- }
59
-
60
- interface Props extends Record<string, unknown> {
61
- /** The full message object. Set as a JS property. */
62
- message?: ChatMessage;
63
- /** Who is speaking: `'user'` or `'assistant'`. Convenience for simple cases when
64
- * not passing a `message` object.
65
- *
66
- * This is the SEMANTIC role of the message, not an ARIA role. The name collides
67
- * with the global ARIA `role` attribute, which is why the facade lifts it off
68
- * the host (see `liftRoleOffHost`). Neither speaker is a valid ARIA role,
69
- * so a `role="user"` left on `<kai-message>` is a CRITICAL axe `aria-roles`
70
- * violation. The accessible role lives on the row inside the shadow root
71
- * instead: `role="article"` plus an `aria-label` naming the speaker, matching
72
- * the SolidJS `<Message>` component. */
73
- role?: 'user' | 'assistant';
74
- /** Force markdown on/off. Defaults to on for assistant, off for user. */
75
- markdown?: boolean;
76
- /** Text/markdown sizing for the message body. */
77
- proseSize?: ProseSize;
78
- /** Shiki theme name used for fenced code blocks in the content. */
79
- codeTheme?: string;
80
- /** Disable syntax highlighting for code blocks (no Shiki loads). */
81
- codeHighlight?: boolean;
82
- /** Whether the action bar is always visible (`'always'`, default) or only
83
- * revealed on hover of the message row (`'hover'`). */
84
- actionsReveal?: 'always' | 'hover';
85
- /** Convenience avatar image URL (used when `message.avatar` is not set). */
86
- avatarSrc?: string;
87
- /** Convenience avatar fallback text (used when `message.avatar` is not set). */
88
- avatarFallback?: string;
89
- /** Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans
90
- * the full row (predictable layout when you never show avatars). Any other
91
- * value keeps the default behaviour: the built-in avatar when one resolves, or
92
- * your `slot="avatar"` content when projected (which REPLACES the built-in). */
93
- avatar?: 'none' | string;
94
- /** Optional card type -> custom-element tag overrides/additions for `card`
95
- * parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
96
- * plain string map (not the `CardTagMap` alias) so the generated React
97
- * wrapper inlines it instead of emitting an unresolved named type. */
98
- cardTypes?: Record<string, string>;
99
- /** JSON Schemas for the card types this app renders, keyed by envelope type. The
100
- * companion of `cardTypes`, which says what DRAWS a card while this says what a
101
- * VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
102
- * = { 'pricing-table': pricingSchema }`, never an attribute.
103
- * `createCardRegistry(...).validationSchemas` is exactly this shape.
104
- *
105
- * Without it the kit validates its own seven built-ins and leaves your own card
106
- * type, the one your app actually cares about, as the only unchecked thing on
107
- * screen. A schema here WINS over a built-in of the same name.
108
- *
109
- * Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
110
- * deliberately: an imported `.json` schema widens `"type"` to `string`, and an
111
- * authored one carries `$schema`/`title`/`description`/`additionalProperties`,
112
- * so the tighter type would reject both of the normal ways to supply one. */
113
- cardSchemas?: Record<string, object>;
114
- }
115
-
116
- /**
117
- * Move a `role` the consumer put on the host into the element's own prop store,
118
- * and off the DOM.
119
- *
120
- * `role` names the SPEAKER here (`'user'` / `'assistant'`) — the correct domain
121
- * word, and the documented attribute — but it is also the global ARIA `role`
122
- * attribute, and neither speaker is a valid ARIA role. Measured in a real chromium:
123
- * a host left carrying `role="user"` is a CRITICAL axe `aria-roles` violation
124
- * ("Role must be one of the valid ARIA roles: user"), and chromium discards the
125
- * unknown token and computes `generic`, so the row is left with no accessible role
126
- * and no accessible name rather than a mis-announced one.
127
- *
128
- * Capture the value, remove the attribute, then write it back as a PROPERTY.
129
- * component-register's prop accessors do not reflect, so the write cannot put it
130
- * back on the DOM, and it feeds the same reactive prop the facade already reads.
131
- *
132
- * The ORDER is load-bearing: `removeAttribute` fires component-register's
133
- * `attributeChangedCallback` with `null`, which sets the property to `null`. The
134
- * write-back has to come after that, or the scrub destroys the speaker it was
135
- * meant to preserve.
136
- *
137
- * NOTE — this covers every path where the attribute is still on the host by the
138
- * time the facade runs (`setAttribute` before or after connection, and any later
139
- * change, via the observer below). It does NOT cover an element authored in HTML
140
- * and upgraded at registration time: `defineWebComponent` installs its
141
- * non-reflecting `role` accessor AFTER `customElements.define()`, so for elements
142
- * already in the document the native ARIAMixin setter runs first in the constructor
143
- * (`this[prop] = undefined` → `role` is a nullable reflected IDL attribute →
144
- * `removeAttribute`) and the value is gone before any of this code executes. That
145
- * is a separate defect in `src/elements/define.tsx`, not something the facade can
146
- * reach; this function composes correctly with the fix once it lands.
147
- */
148
- function liftRoleOffHost(element: HTMLElement): void {
149
- const attr = element.getAttribute('role');
150
- if (attr === null) return;
151
- element.removeAttribute('role');
152
- (element as unknown as { role?: string }).role = attr;
153
- }
154
-
155
- /** Events fired by `<kai-message>`. */
156
- interface Events {
157
- /** An action button was clicked. `action` is the built-in name or custom id.
158
- * `state` is present only for the toggleable feedback votes: `'on'` when a
159
- * like/dislike is set, `'off'` when re-tapped to clear. */
160
- 'kai-message-action': { messageId: string; action: string; state?: 'on' | 'off' };
161
- }
162
-
163
- /**
164
- * `<kai-message>` — a single message row: markdown/plain content, reasoning,
165
- * tool calls, attachments, and action buttons, rendered from one `message`
166
- * object (the same shape `<kai-chat>` uses per message). The keystone of the
167
- * "compose your own message list" pattern. Emits `kai-message-action`.
168
- */
169
- defineWebComponent<Props, Events>('kai-message', {
170
- message: undefined,
171
- role: 'assistant',
172
- markdown: undefined,
173
- proseSize: 'sm',
174
- codeTheme: 'github-dark-dimmed',
175
- codeHighlight: true,
176
- actionsReveal: 'always',
177
- avatarSrc: undefined,
178
- avatarFallback: undefined,
179
- avatar: undefined,
180
- cardTypes: undefined,
181
- cardSchemas: undefined,
182
- }, (props, { dispatch, flag, element, expose }) => {
183
- const outer = useChatConfig();
184
- // Do this FIRST, before anything reads `props.role`: it rewrites that prop as a
185
- // side effect of taking the invalid ARIA role off the host.
186
- liftRoleOffHost(element);
187
- const msg = (): ChatMessage =>
188
- props.message ?? {
189
- id: 'message',
190
- role: props.role ?? 'assistant',
191
- parts: [],
192
- };
193
- // `message` is an untyped boundary: a consumer can hand it anything at
194
- // runtime (a pre-0.20.0 `{ id, role, content }` object, in particular).
195
- // `parts` is a REQUIRED field, so validate it here rather than let
196
- // `MessageBody`/`groupMessageParts` throw deep inside a Solid render pass;
197
- // an uncaught exception there blanks the whole element instead of just this
198
- // one message. Warn once per bad message (not on every unrelated re-render)
199
- // and render nothing for it, matching the old pre-parts fallback behavior
200
- // (an unusable message rendered an empty body, not a crash).
201
- let lastWarnedMessage: unknown;
202
- const hasValidParts = (): boolean => {
203
- const m = msg();
204
- if (hasParts(m)) return true;
205
- if (m !== lastWarnedMessage) {
206
- lastWarnedMessage = m;
207
- console.error(
208
- "<kai-message>: 'message' must have a 'parts' array. The 'content' string field was removed in 0.20.0.",
209
- );
210
- }
211
- return false;
212
- };
213
- // Copy + vote state lives here (above the rendered body) so it survives a
214
- // re-render when the host swaps in a fresh `message` object during streaming.
215
- const feedback = createMessageFeedback({
216
- emit: (detail) => dispatch('kai-message-action', detail),
217
- // No `target`: a STANDALONE <kai-message> must not anchor its copy/feedback
218
- // toast to the individual message (that lands mid-thread in a compose-your-own
219
- // list). Let them route to the global region (top of the viewport), which is
220
- // where a confirmation belongs across a hand-built thread. (Inside <kai-chat>
221
- // the chat owns feedback and targets ITSELF, so in-chat toasts still stay in-chat.)
222
- });
223
-
224
- // Imperative method API — `copy()` runs the exact path of the built-in copy
225
- // action (`feedback.handleAction(msg, 'copy')`): writes the content to the
226
- // clipboard, shows the transient copied-check on the bar, and emits
227
- // `kai-message-action{action:'copy'}`.
228
- expose({
229
- /** Copy the message content to the clipboard and show the copied check. */
230
- copy: () => { if (hasValidParts()) feedback.handleAction(msg(), 'copy'); },
231
- });
232
-
233
- // Read declarative <kai-action> children from light DOM.
234
- // Shadow DOM with no <slot> suppresses them visually — they're invisible data carriers.
235
- const [slottedActions, setSlottedActions] = createSignal<import('../elements/chat-types').CustomAction[]>([]);
236
- // Which composition slots (before-body / after-body / avatar) the consumer filled.
237
- const [slots, setSlots] = createSignal<Record<string, boolean>>({});
238
- onMount(() => {
239
- const read = () => {
240
- const nodes = [...element.querySelectorAll('kai-action')];
241
- setSlottedActions(nodes.map(n => ({
242
- id: n.id || n.getAttribute('action') || '',
243
- label: n.textContent?.trim() || n.getAttribute('label') || n.id || '',
244
- icon: n.getAttribute('icon') ?? undefined,
245
- tooltip: n.getAttribute('tooltip') ?? undefined,
246
- })));
247
- setSlots(readSlots(element, MESSAGE_SLOTS));
248
- };
249
- read();
250
- const observer = new MutationObserver(read);
251
- observer.observe(element, { childList: true, attributes: true, subtree: true });
252
- onCleanup(() => observer.disconnect());
253
- });
254
- // A consumer can set `role` at any point after the element is live
255
- // (`el.setAttribute('role', 'user')`), which puts the invalid ARIA role back on
256
- // the host. Keep lifting it off. Scoped to the one attribute so this cannot be
257
- // mistaken for general attribute handling; no loop, because the write-back is a
258
- // property and the removal leaves nothing for the next callback to find.
259
- onMount(() => {
260
- const roleObserver = new MutationObserver(() => liftRoleOffHost(element));
261
- roleObserver.observe(element, { attributes: true, attributeFilter: ['role'] });
262
- onCleanup(() => roleObserver.disconnect());
263
- });
264
- const isUser = () => msg().role === 'user';
265
- const avatar = () =>
266
- msg().avatar ??
267
- (props.avatarSrc || props.avatarFallback
268
- ? { src: props.avatarSrc as string | undefined, fallback: props.avatarFallback as string | undefined }
269
- : undefined);
270
- // Avatar rail state. `avatar="none"` omits the rail; a filled `slot="avatar"`
271
- // REPLACES the built-in; otherwise the built-in renders when one resolves.
272
- const noAvatar = () => props.avatar === 'none';
273
- const hasAvatarSlot = () => !!slots()['avatar'];
274
- // The rail shows when not suppressed and there's either a slot or a resolved avatar.
275
- const showRail = () => !noAvatar() && (hasAvatarSlot() || !!avatar());
276
- const reveal = () => (props.actionsReveal === 'hover' ? 'hover' : 'always');
277
- // markdown: explicit prop/attribute wins; otherwise default by role.
278
- const markdownExplicit = () =>
279
- element.hasAttribute('markdown') || props.markdown === true || props.markdown === false;
280
- const useMarkdown = () => (markdownExplicit() ? flag('markdown') : !isUser());
281
-
282
- const mergedActions = () => [...(msg().actions ?? []), ...slottedActions()];
283
- const body = () => (
284
- <MessageBody
285
- parts={msg().parts}
286
- cardTypes={cardComponentsFromTags(props.cardTypes, (props as { theme?: string }).theme)}
287
- cardSchemas={props.cardSchemas}
288
- /* F-26: card parts emit off THIS element as the bubbling `kai-card` event. */
289
- cardHostElement={element}
290
- isUser={isUser()}
291
- markdown={useMarkdown()}
292
- actions={mergedActions()}
293
- actionsReveal={reveal()}
294
- activeFeedback={feedback.resolveFeedback(msg())}
295
- copied={feedback.isCopied(msg().id)}
296
- onAction={(action) => feedback.handleAction(msg(), action)}
297
- beforeBody={slots()['before-body'] ? <slot name="before-body" /> : undefined}
298
- afterBody={slots()['after-body'] ? <slot name="after-body" /> : undefined}
299
- />
300
- );
301
-
302
- // Row carries `group` so a hover-revealed action bar fades in on row hover.
303
- const rowGroup = () => (reveal() === 'hover' ? 'group ' : '');
304
-
305
- // The avatar rail: a filled `slot="avatar"` REPLACES the built-in MessageAvatar
306
- // (the consumer owns that node, wrapped in `part="avatar"` so it's still
307
- // styleable + consistent with the built-in part name).
308
- const avatarRail = () => (
309
- <Show
310
- when={hasAvatarSlot()}
311
- fallback={
312
- <Show when={avatar()}>
313
- {(av) => <MessageAvatar src={av().src ?? ''} alt={av().alt ?? ''} fallback={av().fallback} />}
314
- </Show>
315
- }
316
- >
317
- <div part="avatar" class="shrink-0">
318
- <slot name="avatar" />
319
- </div>
320
- </Show>
321
- );
322
-
323
- return (
324
- // No fallback: an invalid `message` (missing `parts`) renders nothing for
325
- // this element rather than crashing. `hasValidParts()` already logged why.
326
- <Show when={hasValidParts()}>
327
- <ChatConfig
328
- proseSize={props.proseSize}
329
- codeTheme={props.codeTheme}
330
- codeHighlight={flag('codeHighlight')}
331
- portalMount={outer.portalMount()}
332
- >
333
- <Show
334
- when={showRail()}
335
- fallback={
336
- // `role` here is `<Message>`'s SPEAKER prop, not an ARIA role: the
337
- // component turns it into `role="article"` + an `aria-label` naming the
338
- // speaker, so the row an assistive technology sees has a valid role and
339
- // a name. This is the same treatment the SolidJS `<Message>` gets when
340
- // used directly — the facade just always knows its speaker, so unlike
341
- // the bare component (where `role` is optional and usually omitted) the
342
- // row is never left unlabelled.
343
- <Message
344
- role={msg().role}
345
- class={`${rowGroup()}${isUser() ? 'flex-col items-end' : 'flex-col items-start'}`}
346
- >
347
- {body()}
348
- </Message>
349
- }
350
- >
351
- <Message role={msg().role} class={rowGroup()}>
352
- {avatarRail()}
353
- <div class={`flex min-w-0 flex-1 flex-col ${isUser() ? 'items-end' : 'items-start'}`}>
354
- {body()}
355
- </div>
356
- </Message>
357
- </Show>
358
- </ChatConfig>
359
- </Show>
360
- );
361
- });
@@ -1,121 +0,0 @@
1
- import { createSignal, onCleanup, onMount } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { ModelSwitcher } from '../components/model-switcher';
4
- import { wireDisclosure } from './disclosure';
5
- import type { DropdownController } from '../ui/dropdown';
6
- import type { ModelOption } from '../types';
7
-
8
- interface Props extends Record<string, unknown> {
9
- /** The selectable models. Set as a JS property (array). Omit to supply them as
10
- * `<kai-model>` light-DOM children instead; when both are present the
11
- * property's models come first. */
12
- models?: ModelOption[];
13
- /** The currently-selected model id. Defaults to the first model. */
14
- currentModel?: string;
15
- /** Drive/observe the dropdown's open state (Shoelace-style: settable + reflected
16
- * to the `open` attribute, the dropdown still self-manages on click/keyboard).
17
- * Set `el.open = true`, or `<kai-model-switcher open>`; listen for `kai-open-change`. */
18
- open?: boolean;
19
- /** Initial open state on mount (uncontrolled seed). */
20
- defaultOpen?: boolean;
21
- /** Disable the trigger: click/keyboard and `show()` no longer open the dropdown. */
22
- disabled?: boolean;
23
- }
24
-
25
- /** Events fired by `<kai-model-switcher>`. */
26
- interface Events {
27
- /** A model was selected. */
28
- 'kai-model-change': { modelId: string };
29
- /** The model dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method). */
30
- 'kai-open-change': { open: boolean };
31
- }
32
-
33
- /**
34
- * Parse a single light-DOM `<kai-model>` element into a `ModelOption` descriptor.
35
- * Attribute mapping:
36
- * - `id` → ModelOption.id
37
- * - textContent → ModelOption.name
38
- * - `provider` → ModelOption.provider (optional)
39
- * - `description` → ModelOption.description (optional subtitle)
40
- * - `group` → ModelOption.group (optional collapsible section)
41
- */
42
- export function parseKaiModelElement(n: Element): ModelOption {
43
- return {
44
- id: n.getAttribute('id') ?? '',
45
- name: n.textContent?.trim() ?? '',
46
- provider: n.getAttribute('provider') ?? undefined,
47
- description: n.getAttribute('description') ?? undefined,
48
- group: n.getAttribute('group') ?? undefined,
49
- };
50
- }
51
-
52
- /**
53
- * `<kai-model-switcher>` — an event-emitting leaf element. Data in via the
54
- * `models` property, selection out via a `kai-model-change` event. Mirrors the
55
- * header switcher inside `<kai-chat>` as a standalone, composable piece.
56
- *
57
- * Note: like the underlying primitive, this only renders when more than one
58
- * model is provided.
59
- *
60
- * **How to use:**
61
- *
62
- * _Property API_ — set `models` as a JS property and listen for `kai-model-change`:
63
- * ```js
64
- * el.models = [{ id: 'gpt-4o', name: 'GPT-4o', provider: 'OpenAI' }];
65
- * el.addEventListener('kai-model-change', (e) => console.log(e.detail.modelId));
66
- * ```
67
- *
68
- * _Declarative child API_ — compose `<kai-model>` light-DOM children (no JS needed):
69
- * ```html
70
- * <kai-model-switcher>
71
- * <kai-model id="gpt-4o" provider="OpenAI">GPT-4o</kai-model>
72
- * <kai-model id="gpt-4o-mini" provider="OpenAI">GPT-4o mini</kai-model>
73
- * </kai-model-switcher>
74
- * ```
75
- * Each `<kai-model>` child carries `id` (required), `provider` (optional), and
76
- * a text label as its `textContent`. Children are light-DOM data carriers hidden
77
- * by Shadow DOM. Prop `models` items render first; declarative children follow.
78
- */
79
- defineWebComponent<Props, Events>('kai-model-switcher', {
80
- models: [],
81
- currentModel: undefined,
82
- open: undefined,
83
- defaultOpen: undefined,
84
- disabled: undefined,
85
- }, (props, ctx) => {
86
- const { dispatch, element, flag } = ctx;
87
- let api: DropdownController | undefined;
88
-
89
- // The standard overlay surface: settable+reflecting `open`, kai-open-change,
90
- // show/hide/toggle, disabled-gating. See ./disclosure. When <=1 model the inner
91
- // Dropdown never mounts, so `api` stays undefined and these methods no-op.
92
- wireDisclosure(ctx, () => api, () => props.open);
93
-
94
- // Read declarative <kai-model> children from light DOM.
95
- // Shadow DOM with no <slot> suppresses them visually — they're invisible data carriers.
96
- const [slottedModels, setSlottedModels] = createSignal<ModelOption[]>([]);
97
- onMount(() => {
98
- const read = () => {
99
- const nodes = [...element.querySelectorAll('kai-model')];
100
- setSlottedModels(nodes.map(parseKaiModelElement));
101
- };
102
- read();
103
- const observer = new MutationObserver(read);
104
- observer.observe(element, { childList: true, attributes: true, subtree: true });
105
- onCleanup(() => observer.disconnect());
106
- });
107
-
108
- // Merge prop models (first) with declarative children (after).
109
- const allModels = () => [...(props.models ?? []), ...slottedModels()];
110
-
111
- return (
112
- <ModelSwitcher
113
- models={allModels()}
114
- currentModelId={props.currentModel ?? allModels()[0]?.id ?? ''}
115
- onModelChange={(modelId) => dispatch('kai-model-change', { modelId })}
116
- defaultOpen={flag('defaultOpen')}
117
- disabled={flag('disabled')}
118
- controllerRef={(a) => (api = a)}
119
- />
120
- );
121
- });
@@ -1,87 +0,0 @@
1
- import { createSignal } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Nav, type KaiNavItem } from '../ui/nav';
4
-
5
- interface Props extends Record<string, unknown> {
6
- /** The nav items. Set as a JS property (array, not an attribute). Each item may
7
- * carry `children` (a collapsible group), a `status` dot, and trailing `meta`
8
- * text. */
9
- items?: KaiNavItem[];
10
- /** Active item id (controlled). */
11
- value?: string;
12
- /** Initial active id when uncontrolled. */
13
- defaultValue?: string;
14
- /** Ids of group items collapsed on first render (groups default to expanded).
15
- * Set as a JS property (array). */
16
- defaultCollapsed?: string[];
17
- }
18
-
19
- interface Events {
20
- /** A nav item was activated. */
21
- 'kai-nav-select': { id: string };
22
- /** A row's trailing `action` button was activated (not a select). `value` is
23
- * the item id; `action` echoes the item's `{ icon, label }`. */
24
- 'kai-nav-item-action': { value: string; action?: { icon: string; label: string } };
25
- /** A `closable` row's trailing close button was activated (not a select).
26
- * `value` is the item id. */
27
- 'kai-nav-item-close': { value: string };
28
- }
29
-
30
- /**
31
- * `<kai-nav>` — a vertical navigation list driven by a JSON `items` tree
32
- * (id + label + optional leading `icon`, a trailing text `badge`, a trailing
33
- * icon). Items may nest via `children` (a collapsible group with a disclosure
34
- * chevron), carry a `status` dot (`{ tone, label?, pulse? }`), and a trailing
35
- * `meta` string (e.g. a relative time). The active item is `value`; selecting a
36
- * leaf fires `kai-nav-select` (group rows toggle expand/collapse instead).
37
- *
38
- * Items may also carry an `action` (`{ icon, label }`) or `closable: true`, which
39
- * render a trailing button — firing `kai-nav-item-action` `{ value, action }` or
40
- * `kai-nav-item-close` `{ value }` (never `kai-nav-select`). Style it via
41
- * `::part(item-action)`.
42
- *
43
- * ```html
44
- * <kai-nav default-value="home"></kai-nav>
45
- * <script type="module">
46
- * const nav = document.querySelector('kai-nav');
47
- * nav.items = [
48
- * { id: 'home', label: 'New task', icon: 'plus', trailing: 'pencil' },
49
- * { id: 'acme', label: 'Acme', icon: 'folder', children: [
50
- * { id: 't1', label: 'Refactor auth', status: { tone: 'info', label: 'Working', pulse: true }, meta: '2m' },
51
- * { id: 't2', label: 'Landing page', status: { tone: 'success', label: 'Done' }, meta: '1d' },
52
- * ] },
53
- * { id: 'dispatch', label: 'Dispatch', icon: 'share', badge: 'Beta' },
54
- * ];
55
- * nav.addEventListener('kai-nav-select', (e) => console.log(e.detail.id));
56
- * </script>
57
- * ```
58
- * Restyle via `::part(nav)` / `::part(item)` (active items carry `aria-current`),
59
- * plus `::part(group)` / `::part(chevron)` / `::part(status)` / `::part(meta)`.
60
- */
61
- defineWebComponent<Props, Events>('kai-nav', {
62
- items: undefined,
63
- value: undefined,
64
- defaultValue: undefined,
65
- defaultCollapsed: undefined,
66
- }, (props, { dispatch, expose }) => {
67
- const [internal, setInternal] = createSignal(props.defaultValue as string | undefined);
68
- const value = () => (props.value as string | undefined) ?? internal();
69
- const select = (id: string) => { setInternal(id); dispatch('kai-nav-select', { id }); };
70
-
71
- expose({
72
- /** Activate an item by id (fires kai-nav-select). */
73
- select: (id: string) => select(id),
74
- });
75
-
76
- return (
77
- <Nav
78
- items={props.items as KaiNavItem[] | undefined}
79
- value={value()}
80
- defaultCollapsed={props.defaultCollapsed as string[] | undefined}
81
- onItemSelect={select}
82
- onItemAction={(id, action) => dispatch('kai-nav-item-action', { value: id, action })}
83
- onItemClose={(id) => dispatch('kai-nav-item-close', { value: id })}
84
- part="nav"
85
- />
86
- );
87
- });
@@ -1,53 +0,0 @@
1
- import { Notice, noticeIconNode } from '../ui/notice';
2
- import { defineWebComponent } from './define';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** `neutral` (default) · `info` · `warning` · `error` · `success`. Drives the
6
- * leading icon's color and the a11y role (`alert` for errors, else `status`). */
7
- severity?: 'neutral' | 'info' | 'warning' | 'error' | 'success';
8
- /** Leading icon: omit for the severity default, `"none"` to hide it, or a named
9
- * icon to override. */
10
- icon?: string;
11
- /** Show a dismiss (×) that hides the notice and emits `kai-dismiss`. */
12
- dismissible?: boolean;
13
- }
14
-
15
- /** Events fired by `<kai-notice>`. */
16
- interface Events {
17
- /** The notice was dismissed via its × (it also hides itself). */
18
- 'kai-dismiss': void;
19
- }
20
-
21
- /**
22
- * `<kai-notice>` — a self-contained inline notice / alert. Put the message as
23
- * light-DOM text and an optional `slot="action"` (e.g. a link); it carries the
24
- * severity icon, the right a11y role, and an optional self-dismissing ×.
25
- *
26
- * It owns the notice box, not its placement — you position it in your own layout
27
- * (above a composer, at the top of a panel, …).
28
- *
29
- * For a custom leading icon, slot any inline SVG via `slot="icon"` (it wins over
30
- * the severity/`icon` default — the same escape hatch as `kai-button`).
31
- *
32
- * ```html
33
- * <kai-notice severity="warning" dismissible>
34
- * Claude Fable 5 is currently unavailable.
35
- * <a slot="action" href="#">Learn more</a>
36
- * </kai-notice>
37
- * ```
38
- */
39
- defineWebComponent<Props, Events>('kai-notice', {
40
- severity: 'neutral',
41
- icon: undefined,
42
- dismissible: false,
43
- }, (props, { dispatch, flag }) => (
44
- <Notice
45
- severity={props.severity ?? 'neutral'}
46
- iconSlot={<slot name="icon">{noticeIconNode(props.severity ?? 'neutral', props.icon)}</slot>}
47
- dismissible={flag('dismissible')}
48
- onDismiss={() => dispatch('kai-dismiss')}
49
- action={<slot name="action" />}
50
- >
51
- <slot />
52
- </Notice>
53
- ));