@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,367 +0,0 @@
1
- import { Switch, Match, For, Show } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
-
4
- export type LoaderVariant =
5
- | 'circular'
6
- | 'classic'
7
- | 'pulse'
8
- | 'pulse-dot'
9
- | 'dots'
10
- | 'typing'
11
- | 'wave'
12
- | 'bars'
13
- | 'terminal'
14
- | 'text-blink'
15
- | 'text-shimmer'
16
- | 'loading-dots';
17
-
18
- export type LoaderSize = 'sm' | 'md' | 'lg';
19
-
20
- export interface LoaderProps {
21
- variant?: LoaderVariant;
22
- size?: LoaderSize;
23
- text?: string;
24
- class?: string;
25
- }
26
-
27
- /** Props of the shape-only loader variants (no label). */
28
- export interface LoaderShapeProps {
29
- class?: string;
30
- size?: LoaderSize;
31
- }
32
-
33
- /** Props of the text-based loader variants, which also take the label. */
34
- export interface LoaderTextProps extends LoaderShapeProps {
35
- text?: string;
36
- }
37
-
38
- // Every variant shortcut ships its own `<Name>Props` alias: a consumer typing a
39
- // wrapper around `<DotsLoader>` must be able to name its props without knowing
40
- // that nine components happen to share one shape.
41
- export type CircularLoaderProps = LoaderShapeProps;
42
- export type ClassicLoaderProps = LoaderShapeProps;
43
- export type PulseLoaderProps = LoaderShapeProps;
44
- export type PulseDotLoaderProps = LoaderShapeProps;
45
- export type DotsLoaderProps = LoaderShapeProps;
46
- export type TypingLoaderProps = LoaderShapeProps;
47
- export type WaveLoaderProps = LoaderShapeProps;
48
- export type BarsLoaderProps = LoaderShapeProps;
49
- export type TerminalLoaderProps = LoaderShapeProps;
50
- export type TextBlinkLoaderProps = LoaderTextProps;
51
- export type TextShimmerLoaderProps = LoaderTextProps;
52
- export type TextDotsLoaderProps = LoaderTextProps;
53
-
54
- // --- CircularLoader ---
55
-
56
- export function CircularLoader(props: CircularLoaderProps) {
57
- const size = () => props.size ?? 'md';
58
- const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
59
- return (
60
- <div
61
- class={cn(
62
- 'border-primary animate-spin rounded-full border-2 border-t-transparent',
63
- sizeClasses[size()],
64
- props.class
65
- )}
66
- >
67
- <span class="sr-only">Loading</span>
68
- </div>
69
- );
70
- }
71
-
72
- // --- ClassicLoader ---
73
-
74
- export function ClassicLoader(props: ClassicLoaderProps) {
75
- const size = () => props.size ?? 'md';
76
- const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
77
- const barSizes = {
78
- sm: { height: '6px', width: '1.5px' },
79
- md: { height: '8px', width: '2px' },
80
- lg: { height: '10px', width: '2.5px' },
81
- };
82
- return (
83
- <div class={cn('relative', sizeClasses[size()], props.class)}>
84
- <div class="absolute h-full w-full">
85
- <For each={Array.from({ length: 12 }, (_, i) => i)}>
86
- {(i) => (
87
- <div
88
- class="bg-primary absolute animate-[spinner-fade_1.2s_linear_infinite] rounded-full"
89
- style={{
90
- top: '0',
91
- left: '50%',
92
- 'margin-left': size() === 'sm' ? '-0.75px' : size() === 'lg' ? '-1.25px' : '-1px',
93
- 'transform-origin': `${size() === 'sm' ? '0.75px' : size() === 'lg' ? '1.25px' : '1px'} ${size() === 'sm' ? '10px' : size() === 'lg' ? '14px' : '12px'}`,
94
- transform: `rotate(${i * 30}deg)`,
95
- opacity: 0,
96
- 'animation-delay': `${i * 0.1}s`,
97
- height: barSizes[size()].height,
98
- width: barSizes[size()].width,
99
- }}
100
- />
101
- )}
102
- </For>
103
- </div>
104
- <span class="sr-only">Loading</span>
105
- </div>
106
- );
107
- }
108
-
109
- // --- PulseLoader ---
110
-
111
- export function PulseLoader(props: PulseLoaderProps) {
112
- const size = () => props.size ?? 'md';
113
- const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
114
- return (
115
- <div class={cn('relative', sizeClasses[size()], props.class)}>
116
- <div class="border-primary absolute inset-0 animate-[thin-pulse_1.5s_ease-in-out_infinite] rounded-full border-2" />
117
- <span class="sr-only">Loading</span>
118
- </div>
119
- );
120
- }
121
-
122
- // --- PulseDotLoader ---
123
-
124
- export function PulseDotLoader(props: PulseDotLoaderProps) {
125
- const size = () => props.size ?? 'md';
126
- const sizeClasses = { sm: 'size-1', md: 'size-2', lg: 'size-3' };
127
- return (
128
- <div
129
- class={cn(
130
- 'bg-primary animate-[pulse-dot_1.2s_ease-in-out_infinite] rounded-full',
131
- sizeClasses[size()],
132
- props.class
133
- )}
134
- >
135
- <span class="sr-only">Loading</span>
136
- </div>
137
- );
138
- }
139
-
140
- // --- DotsLoader ---
141
-
142
- export function DotsLoader(props: DotsLoaderProps) {
143
- const size = () => props.size ?? 'md';
144
- const dotSizes = { sm: 'h-1.5 w-1.5', md: 'h-2 w-2', lg: 'h-2.5 w-2.5' };
145
- const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
146
- return (
147
- <div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
148
- <For each={[0, 1, 2]}>
149
- {(i) => (
150
- <div
151
- class={cn(
152
- 'bg-primary animate-[bounce-dots_1.4s_ease-in-out_infinite] rounded-full',
153
- dotSizes[size()]
154
- )}
155
- style={{ 'animation-delay': `${i * 160}ms` }}
156
- />
157
- )}
158
- </For>
159
- <span class="sr-only">Loading</span>
160
- </div>
161
- );
162
- }
163
-
164
- // --- TypingLoader ---
165
-
166
- export function TypingLoader(props: TypingLoaderProps) {
167
- const size = () => props.size ?? 'md';
168
- const dotSizes = { sm: 'h-1 w-1', md: 'h-1.5 w-1.5', lg: 'h-2 w-2' };
169
- const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
170
- return (
171
- <div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
172
- <For each={[0, 1, 2]}>
173
- {(i) => (
174
- <div
175
- class={cn(
176
- 'bg-primary animate-[typing_1s_infinite] rounded-full',
177
- dotSizes[size()]
178
- )}
179
- style={{ 'animation-delay': `${i * 250}ms` }}
180
- />
181
- )}
182
- </For>
183
- <span class="sr-only">Loading</span>
184
- </div>
185
- );
186
- }
187
-
188
- // --- WaveLoader ---
189
-
190
- export function WaveLoader(props: WaveLoaderProps) {
191
- const size = () => props.size ?? 'md';
192
- const barWidths = { sm: 'w-0.5', md: 'w-0.5', lg: 'w-1' };
193
- const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
194
- const heights: Record<LoaderSize, string[]> = {
195
- sm: ['6px', '9px', '12px', '9px', '6px'],
196
- md: ['8px', '12px', '16px', '12px', '8px'],
197
- lg: ['10px', '15px', '20px', '15px', '10px'],
198
- };
199
- return (
200
- <div class={cn('flex items-center gap-0.5', containerSizes[size()], props.class)}>
201
- <For each={[0, 1, 2, 3, 4]}>
202
- {(i) => (
203
- <div
204
- class={cn(
205
- 'bg-primary animate-[wave_1s_ease-in-out_infinite] rounded-full',
206
- barWidths[size()]
207
- )}
208
- style={{
209
- 'animation-delay': `${i * 100}ms`,
210
- height: heights[size()][i],
211
- }}
212
- />
213
- )}
214
- </For>
215
- <span class="sr-only">Loading</span>
216
- </div>
217
- );
218
- }
219
-
220
- // --- BarsLoader ---
221
-
222
- export function BarsLoader(props: BarsLoaderProps) {
223
- const size = () => props.size ?? 'md';
224
- const barWidths = { sm: 'w-1', md: 'w-1.5', lg: 'w-2' };
225
- const containerSizes = { sm: 'h-4 gap-1', md: 'h-5 gap-1.5', lg: 'h-6 gap-2' };
226
- return (
227
- <div class={cn('flex', containerSizes[size()], props.class)}>
228
- <For each={[0, 1, 2]}>
229
- {(i) => (
230
- <div
231
- class={cn(
232
- 'bg-primary h-full animate-[wave-bars_1.2s_ease-in-out_infinite]',
233
- barWidths[size()]
234
- )}
235
- style={{ 'animation-delay': `${i * 0.2}s` }}
236
- />
237
- )}
238
- </For>
239
- <span class="sr-only">Loading</span>
240
- </div>
241
- );
242
- }
243
-
244
- // --- TerminalLoader ---
245
-
246
- export function TerminalLoader(props: TerminalLoaderProps) {
247
- const size = () => props.size ?? 'md';
248
- const cursorSizes = { sm: 'h-3 w-1.5', md: 'h-4 w-2', lg: 'h-5 w-2.5' };
249
- const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
250
- const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
251
- return (
252
- <div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
253
- {/* Decorative status chrome, not a control — was the BRAND token
254
- (text-primary). The sibling TextShimmerLoader below already renders
255
- its "Thinking" text purely in --color-foreground/--color-muted-foreground,
256
- with no brand color at all; matches that precedent. */}
257
- <span class={cn('text-foreground font-mono', textSizes[size()])}>{'>'}</span>
258
- <div class={cn('bg-primary animate-[blink_1s_step-end_infinite]', cursorSizes[size()])} />
259
- <span class="sr-only">Loading</span>
260
- </div>
261
- );
262
- }
263
-
264
- // --- TextBlinkLoader ---
265
-
266
- export function TextBlinkLoader(props: TextBlinkLoaderProps) {
267
- const size = () => props.size ?? 'md';
268
- const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
269
- return (
270
- <div
271
- class={cn(
272
- 'animate-[text-blink_2s_ease-in-out_infinite] font-medium',
273
- textSizes[size()],
274
- props.class
275
- )}
276
- >
277
- {props.text ?? 'Thinking'}
278
- </div>
279
- );
280
- }
281
-
282
- // --- TextShimmerLoader ---
283
-
284
- export function TextShimmerLoader(props: TextShimmerLoaderProps) {
285
- const size = () => props.size ?? 'md';
286
- const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
287
- return (
288
- <div
289
- class={cn(
290
- 'bg-[linear-gradient(to_right,var(--color-muted-foreground)_40%,var(--color-foreground)_60%,var(--color-muted-foreground)_80%)]',
291
- 'bg-size-[200%_auto] bg-clip-text font-medium text-transparent',
292
- 'animate-[shimmer_4s_infinite_linear]',
293
- textSizes[size()],
294
- props.class
295
- )}
296
- >
297
- {props.text ?? 'Thinking'}
298
- </div>
299
- );
300
- }
301
-
302
- // --- TextDotsLoader ---
303
-
304
- export function TextDotsLoader(props: TextDotsLoaderProps) {
305
- const size = () => props.size ?? 'md';
306
- const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
307
- return (
308
- <div class={cn('inline-flex items-center', props.class)}>
309
- {/* Content/chrome, not a control — was `text-primary` on the label AND
310
- the dots (both must match: one phrase, "Thinking..."). Matches
311
- TextShimmerLoader's neutral precedent above. */}
312
- <span class={cn('text-foreground font-medium', textSizes[size()])}>
313
- {props.text ?? 'Thinking'}
314
- </span>
315
- <span class="inline-flex">
316
- <span class="text-foreground animate-[loading-dots_1.4s_infinite_0.2s]">.</span>
317
- <span class="text-foreground animate-[loading-dots_1.4s_infinite_0.4s]">.</span>
318
- <span class="text-foreground animate-[loading-dots_1.4s_infinite_0.6s]">.</span>
319
- </span>
320
- </div>
321
- );
322
- }
323
-
324
- // --- Loader (variant dispatcher) ---
325
-
326
- export function Loader(props: LoaderProps) {
327
- return (
328
- <Switch fallback={<CircularLoader size={props.size} class={props.class} />}>
329
- <Match when={props.variant === 'circular'}>
330
- <CircularLoader size={props.size} class={props.class} />
331
- </Match>
332
- <Match when={props.variant === 'classic'}>
333
- <ClassicLoader size={props.size} class={props.class} />
334
- </Match>
335
- <Match when={props.variant === 'pulse'}>
336
- <PulseLoader size={props.size} class={props.class} />
337
- </Match>
338
- <Match when={props.variant === 'pulse-dot'}>
339
- <PulseDotLoader size={props.size} class={props.class} />
340
- </Match>
341
- <Match when={props.variant === 'dots'}>
342
- <DotsLoader size={props.size} class={props.class} />
343
- </Match>
344
- <Match when={props.variant === 'typing'}>
345
- <TypingLoader size={props.size} class={props.class} />
346
- </Match>
347
- <Match when={props.variant === 'wave'}>
348
- <WaveLoader size={props.size} class={props.class} />
349
- </Match>
350
- <Match when={props.variant === 'bars'}>
351
- <BarsLoader size={props.size} class={props.class} />
352
- </Match>
353
- <Match when={props.variant === 'terminal'}>
354
- <TerminalLoader size={props.size} class={props.class} />
355
- </Match>
356
- <Match when={props.variant === 'text-blink'}>
357
- <TextBlinkLoader text={props.text} size={props.size} class={props.class} />
358
- </Match>
359
- <Match when={props.variant === 'text-shimmer'}>
360
- <TextShimmerLoader text={props.text} size={props.size} class={props.class} />
361
- </Match>
362
- <Match when={props.variant === 'loading-dots'}>
363
- <TextDotsLoader text={props.text} size={props.size} class={props.class} />
364
- </Match>
365
- </Switch>
366
- );
367
- }
@@ -1,162 +0,0 @@
1
- import { splitProps, createMemo, createUniqueId, For, Show, Switch, Match } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
- import { Marked } from 'marked';
4
- import { CodeBlock, CodeBlockCode } from './code-block';
5
- import { useChatConfig, textClass } from '../primitives/chat-config';
6
- import { isSafeUrl } from '../primitives/card-routing';
7
-
8
- // --- The markdown sink -------------------------------------------------------
9
- //
10
- // `MarkdownBlock` writes this parser's output to `innerHTML`, so THIS is the one
11
- // place in the kit where a string the model produced becomes live DOM in the
12
- // host page's origin. `marked` passes raw HTML through verbatim by default and
13
- // dropped its own URL sanitizing in v5, so both have to be handled here.
14
- //
15
- // The threat model is NOT a hostile provider. An attacker only needs to
16
- // influence the model's OUTPUT -- a user asking to be shown an `<img onerror>`
17
- // example, a prompt-injected model, or RAG over an untrusted document all reach
18
- // this sink against a perfectly trusted provider.
19
- //
20
- // WHY ESCAPE RATHER THAN SANITIZE (no DOMPurify):
21
- // - A sanitizer needs a DOM. In Node this package's ESM build has no
22
- // `sanitize` at all (`isSupported === false`), so the SSR path either throws
23
- // or gets "guarded" into returning the payload UNCHANGED -- a silent
24
- // passthrough of exactly the string we were trying to neutralise. Escaping
25
- // is pure string work and behaves identically on server and client.
26
- // - It costs no dependency. Escaping is the ~20 lines below; DOMPurify is
27
- // ~35 KB gzipped of ESM in a package that gates its own footprint.
28
- // - For a CHAT UI it is also the better RENDERING, not just the safer one.
29
- // Raw HTML in model output is either the model quoting markup -- which the
30
- // reader should SEE as text -- or an injection. Escaping serves the first
31
- // case correctly and defuses the second. Nothing in this repo emits markdown
32
- // that relies on inline HTML.
33
- // There is deliberately NO opt-in to restore raw HTML: nothing needs it today,
34
- // and an unsafe switch is the hole again for whoever flips it.
35
- //
36
- // This is a PRIVATE `Marked` instance, and that is load-bearing rather than
37
- // tidiness. Configuring the shared `marked` singleton would mean a consumer's
38
- // own `marked.use({ renderer })` elsewhere in the same app silently replaces
39
- // this renderer and reopens the vulnerability. It also stops the kit mutating
40
- // global `marked` options out from under a consumer, which it used to do.
41
-
42
- /** Escape for HTML TEXT content. */
43
- function escapeText(s: string): string {
44
- return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
45
- }
46
-
47
- /** Escape for a double-quoted ATTRIBUTE value. */
48
- function escapeAttr(s: string): string {
49
- return escapeText(s).replace(/"/g, '&quot;');
50
- }
51
-
52
- const md = new Marked({
53
- gfm: true,
54
- breaks: true,
55
- renderer: {
56
- /** Raw HTML -- block (`Tokens.HTML`) and inline (`Tokens.Tag`) both land
57
- * here. Rendered as visible text instead of markup. */
58
- html({ text }) {
59
- return escapeText(text);
60
- },
61
-
62
- /** Markdown link syntax. marked BUILDS this anchor itself, so escaping raw
63
- * HTML does not cover it and it needs the scheme allowlist of its own.
64
- * A blocked link keeps its LABEL -- the reader still sees what the model
65
- * wrote, we simply refuse to make it clickable. */
66
- link({ href, title, tokens }) {
67
- const text = this.parser.parseInline(tokens);
68
- if (!isSafeUrl(href)) return text;
69
- const t = title ? ` title="${escapeAttr(title)}"` : '';
70
- return `<a href="${escapeAttr(href)}"${t}>${text}</a>`;
71
- },
72
-
73
- /** Markdown image syntax. Same reasoning as `link`; a blocked image falls
74
- * back to its alt text. NOTE this also blocks `data:` image URIs, which
75
- * are inert inside `<img>` -- one allowlist for both is worth more than
76
- * the rare inline-data-image case it costs. */
77
- image({ href, title, text }) {
78
- if (!isSafeUrl(href)) return escapeText(text);
79
- const t = title ? ` title="${escapeAttr(title)}"` : '';
80
- return `<img src="${escapeAttr(href)}" alt="${escapeAttr(text)}"${t}>`;
81
- },
82
- },
83
- });
84
-
85
- export interface MarkdownProps {
86
- content: string;
87
- id?: string;
88
- class?: string;
89
- codeTheme?: string;
90
- /** Optional `::part` name(s) to expose on the rendered root. Lets callers
91
- * (e.g. the message bubble) surface a styleable part through the shadow. */
92
- part?: string;
93
- }
94
-
95
- interface ParsedBlock {
96
- type: 'markdown' | 'code';
97
- content: string;
98
- language?: string;
99
- }
100
-
101
- function parseMarkdownIntoBlocks(markdown: string): ParsedBlock[] {
102
- const tokens = md.lexer(markdown);
103
- return tokens.map((token) => {
104
- if (token.type === 'code') {
105
- return {
106
- type: 'code' as const,
107
- content: token.text,
108
- language: token.lang || undefined,
109
- };
110
- }
111
- return {
112
- type: 'markdown' as const,
113
- content: token.raw,
114
- };
115
- });
116
- }
117
-
118
- function MarkdownBlock(props: { content: string }) {
119
- const html = createMemo(() => {
120
- try {
121
- return md.parse(props.content, { async: false }) as string;
122
- } catch {
123
- // The parse failed, so nothing has been escaped -- the raw source must
124
- // NOT go to `innerHTML`. Escape it and show it as text.
125
- return escapeText(props.content);
126
- }
127
- });
128
-
129
- return <div innerHTML={html()} />;
130
- }
131
-
132
- function Markdown(props: MarkdownProps) {
133
- const [local] = splitProps(props, ['content', 'id', 'class', 'codeTheme', 'part']);
134
- const config = useChatConfig();
135
- const blockId = () => local.id ?? createUniqueId();
136
- const blocks = createMemo(() => parseMarkdownIntoBlocks(local.content));
137
-
138
- return (
139
- <div part={local.part} class={cn('chat-markdown max-w-none break-words whitespace-normal [&>div:first-child>p:first-child]:mt-0 [&>div:last-child>p:last-child]:mb-0', textClass(config.proseSize()), local.class)}>
140
- <For each={blocks()}>
141
- {(block) => (
142
- <Switch>
143
- <Match when={block.type === 'code'}>
144
- <CodeBlock class="my-4">
145
- <CodeBlockCode
146
- code={block.content}
147
- language={block.language}
148
- theme={local.codeTheme ?? config.codeTheme()}
149
- />
150
- </CodeBlock>
151
- </Match>
152
- <Match when={block.type === 'markdown'}>
153
- <MarkdownBlock content={block.content} />
154
- </Match>
155
- </Switch>
156
- )}
157
- </For>
158
- </div>
159
- );
160
- }
161
-
162
- export { Markdown };
@@ -1,40 +0,0 @@
1
- import { Show, For, type JSX, splitProps } from "solid-js";
2
- import { cn } from "../utils/cn";
3
-
4
- // --- MessageSkills ---
5
-
6
- /** One skill badge. Also the shape of `<kai-skills>`' `skills` property and of a
7
- * `<kai-skill>` light-DOM child. */
8
- export interface Skill {
9
- /** Stable identifier for the skill. */
10
- id: string;
11
- /** Human-readable skill name shown on the badge. */
12
- name: string;
13
- }
14
-
15
- export interface MessageSkillsProps {
16
- skills: Skill[];
17
- class?: string;
18
- }
19
-
20
- /**
21
- * Displays skill badges above a message to indicate which skills
22
- * were active when the message was generated.
23
- */
24
- function MessageSkills(props: MessageSkillsProps) {
25
- return (
26
- <Show when={props.skills.length > 0}>
27
- <div class={cn("flex items-center gap-1 flex-wrap", props.class)}>
28
- <For each={props.skills}>
29
- {(skill) => (
30
- <span class="inline-flex items-center px-1.5 py-0.5 rounded text-micro font-medium bg-violet-400/10 text-violet-600 dark:text-violet-400">
31
- {skill.name}
32
- </span>
33
- )}
34
- </For>
35
- </div>
36
- </Show>
37
- );
38
- }
39
-
40
- export { MessageSkills };