@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,200 +0,0 @@
1
- import {
2
- type JSX,
3
- splitProps,
4
- createSignal,
5
- createEffect,
6
- createMemo,
7
- on,
8
- onMount,
9
- Show,
10
- } from 'solid-js';
11
- import { cn } from '../utils/cn';
12
- import { Play, Video, ExternalLink, TriangleAlert } from 'lucide-solid';
13
- import type { CardEvent } from '../primitives/card-contract';
14
- import {
15
- type EmbedCardData,
16
- type ResolvedEmbed,
17
- resolveEmbed,
18
- watchUrl,
19
- providerLabel,
20
- aspectRatioValue,
21
- } from '../primitives/embed-providers';
22
-
23
- export interface EmbedProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'onError'> {
24
- /** The card id correlating every emitted event. */
25
- cardId: string;
26
- /** The embed payload (data-down). */
27
- data: EmbedCardData;
28
- /** Emit a contract CardEvent up (host routes it). */
29
- onEmit?: (event: CardEvent) => void;
30
- }
31
-
32
- /**
33
- * `Embed` — a privacy-first lazy media facade. Initial render is a poster + a play
34
- * button: NO provider iframe, NO provider JS, NO cookies until the user opts in.
35
- * On play it swaps in the provider `<iframe>` (youtube-nocookie / vimeo dnt /
36
- * allowlisted generic). A persistent "Open on {provider}" affordance routes the
37
- * contract `open` verb so a blocked embed is never a dead end. The only verbs it
38
- * emits are lifecycle `ready`, `open`, and failure `error`.
39
- */
40
- export function Embed(props: EmbedProps): JSX.Element {
41
- const [local, rest] = splitProps(props, ['cardId', 'data', 'onEmit', 'class']);
42
-
43
- const emit = (event: CardEvent) => local.onEmit?.(event);
44
-
45
- const [playing, setPlaying] = createSignal(false);
46
- const [posterBroken, setPosterBroken] = createSignal(false);
47
- let playerRegion: HTMLDivElement | undefined;
48
-
49
- // Resolve the provider URL/poster/sandbox; capture a resolution error to render inline.
50
- const resolved = createMemo<{ ok: true; value: ResolvedEmbed } | { ok: false; error: string }>(
51
- () => {
52
- try {
53
- return { ok: true, value: resolveEmbed(local.data) };
54
- } catch (e) {
55
- return { ok: false, error: e instanceof Error ? e.message : String(e) };
56
- }
57
- },
58
- );
59
-
60
- const ratio = createMemo(() => aspectRatioValue(local.data.aspectRatio));
61
- const titleText = () => local.data.title ?? 'Embedded video';
62
- const poster = createMemo(() =>
63
- resolved().ok && !posterBroken() ? (resolved() as { value: ResolvedEmbed }).value.posterUrl : undefined,
64
- );
65
- const watch = createMemo(() => watchUrl(local.data));
66
- const label = () => providerLabel(local.data.provider);
67
-
68
- onMount(() => emit({ kind: 'ready', cardId: local.cardId }));
69
-
70
- // Resolution failure → a single `error` event (defense in depth; the schema allOf
71
- // and the origin allowlist should catch most of these earlier).
72
- createEffect(
73
- on(resolved, (r) => {
74
- if (!r.ok) emit({ kind: 'error', cardId: local.cardId, message: r.error });
75
- }),
76
- );
77
-
78
- // Reset facade state when the payload changes.
79
- createEffect(
80
- on(
81
- () => local.data,
82
- () => {
83
- setPlaying(false);
84
- setPosterBroken(false);
85
- },
86
- { defer: true },
87
- ),
88
- );
89
-
90
- const play = () => {
91
- if (!resolved().ok) return;
92
- setPlaying(true);
93
- // Move focus into the player region for SR/keyboard continuity.
94
- queueMicrotask(() => playerRegion?.focus());
95
- };
96
- const onPlayKeyDown = (e: KeyboardEvent) => {
97
- if (e.key === 'Enter' || e.key === ' ') {
98
- e.preventDefault();
99
- play();
100
- }
101
- };
102
- const openOnProvider = () => {
103
- const w = watch();
104
- if (w) emit({ kind: 'open', cardId: local.cardId, url: w, target: 'tab' });
105
- };
106
-
107
- return (
108
- <div
109
- class={cn('overflow-hidden rounded-xl border border-border bg-card text-card-foreground', local.class)}
110
- {...rest}
111
- >
112
- <div class="relative w-full bg-black" style={{ 'aspect-ratio': ratio() }}>
113
- <Show
114
- when={resolved().ok}
115
- fallback={
116
- <div
117
- role="img"
118
- aria-label="Can't load this video"
119
- class="absolute inset-0 flex flex-col items-center justify-center gap-2 bg-muted p-4 text-center text-sm text-muted-foreground"
120
- >
121
- <TriangleAlert size={28} aria-hidden="true" />
122
- <span>Can't load this video</span>
123
- </div>
124
- }
125
- >
126
- <Show
127
- when={playing()}
128
- fallback={
129
- <button
130
- type="button"
131
- aria-label={`Play ${local.data.title ?? 'video'}`}
132
- class="group absolute inset-0 flex h-full w-full items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset"
133
- onClick={() => play()}
134
- onKeyDown={onPlayKeyDown}
135
- >
136
- {/* Poster (or a neutral placeholder when absent/broken). */}
137
- <Show
138
- when={poster()}
139
- fallback={
140
- <div
141
- class="absolute inset-0 bg-gradient-to-br from-zinc-800 to-zinc-950"
142
- aria-hidden="true"
143
- />
144
- }
145
- >
146
- <img
147
- src={poster()}
148
- alt={local.data.title ?? ''}
149
- class="absolute inset-0 h-full w-full object-cover"
150
- onError={() => setPosterBroken(true)}
151
- />
152
- </Show>
153
- <span
154
- class="relative flex h-14 w-14 items-center justify-center rounded-full bg-black/60 text-white shadow-lg transition-transform motion-safe:group-hover:scale-110"
155
- aria-hidden="true"
156
- >
157
- <Play size={26} fill="currentColor" />
158
- </span>
159
- </button>
160
- }
161
- >
162
- {/* `outline-none` is DELIBERATE here and must stay: a `tabindex="-1"`
163
- wrapper focused programmatically after the user activates the
164
- player, so keyboard context lands on the embed. Not a tab stop —
165
- the iframe inside it takes focus from there. */}
166
- <div ref={(el) => (playerRegion = el)} tabindex="-1" class="absolute inset-0 outline-none">
167
- <iframe
168
- src={(resolved() as { value: ResolvedEmbed }).value.embedUrl}
169
- title={titleText()}
170
- sandbox={(resolved() as { value: ResolvedEmbed }).value.sandbox}
171
- allow={(resolved() as { value: ResolvedEmbed }).value.allow}
172
- allowfullscreen
173
- class="absolute inset-0 h-full w-full border-0"
174
- />
175
- </div>
176
- </Show>
177
- </Show>
178
- </div>
179
- {/* Footer: title + the always-available "Open on {provider}" fallback affordance. */}
180
- <div class="flex items-center justify-between gap-2 px-3 py-2">
181
- <span class="flex min-w-0 items-center gap-1.5 text-sm text-foreground">
182
- <Video size={14} class="shrink-0 opacity-70" aria-hidden="true" />
183
- <span class="truncate">{local.data.title ?? label()}</span>
184
- </span>
185
- <Show when={watch()}>
186
- <button
187
- type="button"
188
- class="inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
189
- onClick={() => openOnProvider()}
190
- >
191
- Open on {label()}
192
- <ExternalLink size={12} aria-hidden="true" />
193
- </button>
194
- </Show>
195
- </div>
196
- </div>
197
- );
198
- }
199
-
200
- export type { EmbedCardData } from '../primitives/embed-providers';
@@ -1,177 +0,0 @@
1
- import { type JSX, splitProps } from 'solid-js';
2
- import { cva, type VariantProps } from 'class-variance-authority';
3
- import { cn } from '../utils/cn';
4
-
5
- /**
6
- * Empty — a composable empty-state block, modeled on shadcn/ui's `Empty`.
7
- * Structure:
8
- * Empty
9
- * ├── EmptyHeader
10
- * │ ├── EmptyMedia (icon / avatar)
11
- * │ ├── EmptyTitle
12
- * │ └── EmptyDescription
13
- * └── EmptyContent (actions / suggestions)
14
- *
15
- * Styling is token-driven (`--color-*`), so it themes with the rest of the kit.
16
- * No visible border by default; add `border border-dashed` via `class` for a card.
17
- */
18
-
19
- // --- Empty (root) ---
20
-
21
- export interface EmptyProps extends JSX.HTMLAttributes<HTMLDivElement> {
22
- children: JSX.Element;
23
- }
24
-
25
- function Empty(props: EmptyProps) {
26
- const [local, rest] = splitProps(props, ['class', 'children']);
27
- return (
28
- <div
29
- // NO `text-center` / `text-balance` on the root. Both INHERIT, and
30
- // `EmptyContent` is an arbitrary-content slot — a `PromptInput` dropped in
31
- // it picked the centering up and rendered its placeholder and its typed
32
- // text centred (owner report). Centering is a fact about the empty state's
33
- // OWN title/description, so it lives on `EmptyTitle`/`EmptyDescription`
34
- // (and `EmptyHeader`, which wraps only those). The root still centres its
35
- // children as BOXES via `items-center`, which is what it actually wants.
36
- data-slot="empty"
37
- class={cn(
38
- 'flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg p-6',
39
- local.class,
40
- )}
41
- {...rest}
42
- >
43
- {local.children}
44
- </div>
45
- );
46
- }
47
-
48
- // --- EmptyHeader ---
49
-
50
- export interface EmptyHeaderProps extends JSX.HTMLAttributes<HTMLDivElement> {
51
- children: JSX.Element;
52
- }
53
-
54
- function EmptyHeader(props: EmptyHeaderProps) {
55
- const [local, rest] = splitProps(props, ['class', 'children']);
56
- return (
57
- <div
58
- data-slot="empty-header"
59
- class={cn('flex max-w-sm flex-col items-center gap-2 text-center', local.class)}
60
- {...rest}
61
- >
62
- {local.children}
63
- </div>
64
- );
65
- }
66
-
67
- // --- EmptyMedia ---
68
-
69
- const emptyMediaVariants = cva(
70
- 'flex shrink-0 items-center justify-center mb-2 [&_svg]:size-6',
71
- {
72
- variants: {
73
- variant: {
74
- default: 'bg-transparent',
75
- icon: 'bg-muted text-foreground size-10 rounded-lg',
76
- },
77
- },
78
- defaultVariants: { variant: 'default' },
79
- },
80
- );
81
-
82
- export interface EmptyMediaProps
83
- extends JSX.HTMLAttributes<HTMLDivElement>,
84
- VariantProps<typeof emptyMediaVariants> {
85
- children: JSX.Element;
86
- }
87
-
88
- function EmptyMedia(props: EmptyMediaProps) {
89
- const [local, rest] = splitProps(props, ['class', 'variant', 'children']);
90
- return (
91
- <div
92
- data-slot="empty-media"
93
- data-variant={local.variant ?? 'default'}
94
- class={cn(emptyMediaVariants({ variant: local.variant }), local.class)}
95
- {...rest}
96
- >
97
- {local.children}
98
- </div>
99
- );
100
- }
101
-
102
- // --- EmptyTitle ---
103
-
104
- export interface EmptyTitleProps extends JSX.HTMLAttributes<HTMLDivElement> {
105
- children: JSX.Element;
106
- }
107
-
108
- function EmptyTitle(props: EmptyTitleProps) {
109
- const [local, rest] = splitProps(props, ['class', 'children']);
110
- return (
111
- <div
112
- data-slot="empty-title"
113
- // Carries its own centering + balance (the root no longer broadcasts them
114
- // to every slotted child), so a title is centred wherever it is placed.
115
- class={cn('text-title font-medium tracking-tight text-center text-balance', local.class)}
116
- {...rest}
117
- >
118
- {local.children}
119
- </div>
120
- );
121
- }
122
-
123
- // --- EmptyDescription ---
124
-
125
- export interface EmptyDescriptionProps extends JSX.HTMLAttributes<HTMLParagraphElement> {
126
- children: JSX.Element;
127
- }
128
-
129
- function EmptyDescription(props: EmptyDescriptionProps) {
130
- const [local, rest] = splitProps(props, ['class', 'children']);
131
- return (
132
- <p
133
- data-slot="empty-description"
134
- class={cn(
135
- // Same as EmptyTitle: own the centering + balance rather than inheriting
136
- // it from a root that also reaches arbitrary slotted content.
137
- 'text-muted-foreground text-body text-center text-balance [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
138
- local.class,
139
- )}
140
- {...rest}
141
- >
142
- {local.children}
143
- </p>
144
- );
145
- }
146
-
147
- // --- EmptyContent ---
148
-
149
- export interface EmptyContentProps extends JSX.HTMLAttributes<HTMLDivElement> {
150
- children: JSX.Element;
151
- }
152
-
153
- function EmptyContent(props: EmptyContentProps) {
154
- const [local, rest] = splitProps(props, ['class', 'children']);
155
- return (
156
- <div
157
- data-slot="empty-content"
158
- class={cn(
159
- 'flex w-full max-w-sm min-w-0 flex-col items-center gap-2 text-sm text-balance',
160
- local.class,
161
- )}
162
- {...rest}
163
- >
164
- {local.children}
165
- </div>
166
- );
167
- }
168
-
169
- export {
170
- Empty,
171
- EmptyHeader,
172
- EmptyMedia,
173
- EmptyTitle,
174
- EmptyDescription,
175
- EmptyContent,
176
- emptyMediaVariants,
177
- };
@@ -1,166 +0,0 @@
1
- import { type JSX, Switch, Match, For, Show, createSignal } from 'solid-js';
2
- import { cn } from '../utils/cn';
3
- import { ThumbsUp, ThumbsDown, X, Check } from 'lucide-solid';
4
- import { Button } from '../ui/button';
5
- import { Textarea } from '../ui/textarea';
6
-
7
- export type FeedbackValue = 'helpful' | 'not-helpful';
8
-
9
- /** Payload of the optional detail form (phase 2). */
10
- export interface FeedbackDetail {
11
- value: FeedbackValue;
12
- /** The selected category chip, if any. */
13
- category?: string;
14
- /** The free-text comment, if entered. */
15
- comment?: string;
16
- }
17
-
18
- export interface FeedbackBarProps {
19
- class?: string;
20
- /** Prompt shown in the initial "ask" state. */
21
- title?: string;
22
- /** Optional leading icon shown before the title. */
23
- icon?: JSX.Element;
24
- /** When set, a not-helpful vote opens an optional detail form before the
25
- * thank-you confirmation. Off → a vote goes straight to thanks. */
26
- collectDetail?: boolean;
27
- /** Optional category chips offered in the detail form. */
28
- categories?: string[];
29
- /** Heading for the detail form. */
30
- detailTitle?: string;
31
- /** Placeholder for the detail comment box. */
32
- detailPlaceholder?: string;
33
- /** Submit button label in the detail form. */
34
- submitLabel?: string;
35
- /** Confirmation copy shown after a vote/submit. */
36
- thanksMessage?: string;
37
- /** Fired immediately when a rating button is clicked (the vote is recorded
38
- * even if the user never fills in the detail form). */
39
- onFeedback?: (value: FeedbackValue) => void;
40
- /** Fired when the optional detail form is submitted. */
41
- onSubmitDetail?: (detail: FeedbackDetail) => void;
42
- /** Fired when the bar is dismissed via the close (X) button. */
43
- onClose?: () => void;
44
- }
45
-
46
- type Phase = 'ask' | 'detail' | 'thanks';
47
-
48
- /**
49
- * An inline thumbs up/down feedback bar that owns its own flow: it asks, then
50
- * (optionally, on a not-helpful vote) collects a category + comment, then
51
- * confirms with a thank-you — all in place, the way ChatGPT/Claude do it. The
52
- * vote fires `onFeedback` immediately; the optional detail fires
53
- * `onSubmitDetail`; `onClose` dismisses the bar.
54
- */
55
- export function FeedbackBar(props: FeedbackBarProps) {
56
- const [phase, setPhase] = createSignal<Phase>('ask');
57
- const [vote, setVote] = createSignal<FeedbackValue>();
58
- const [category, setCategory] = createSignal<string>();
59
- const [comment, setComment] = createSignal('');
60
-
61
- const rate = (value: FeedbackValue) => {
62
- setVote(value);
63
- props.onFeedback?.(value);
64
- setPhase(value === 'not-helpful' && props.collectDetail ? 'detail' : 'thanks');
65
- };
66
-
67
- const submitDetail = () => {
68
- props.onSubmitDetail?.({ value: vote()!, category: category(), comment: comment() || undefined });
69
- setPhase('thanks');
70
- };
71
-
72
- const iconBtn =
73
- 'text-muted-foreground hover:text-foreground flex size-8 items-center justify-center rounded-md transition-colors';
74
-
75
- return (
76
- <div
77
- class={cn('bg-background border-border inline-flex rounded-[12px] border text-sm', props.class)}
78
- >
79
- <Switch>
80
- {/* ── Ask ── */}
81
- <Match when={phase() === 'ask'}>
82
- <div class="flex w-full items-center justify-between">
83
- <div class="flex flex-1 items-center justify-start gap-4 py-3 pl-4">
84
- <Show when={props.icon}>{props.icon}</Show>
85
- <span class="text-foreground font-medium">{props.title}</span>
86
- </div>
87
- <div class="flex items-center justify-center gap-0.5 px-3 py-0">
88
- <button type="button" class={iconBtn} aria-label="Helpful" onClick={() => rate('helpful')}>
89
- <ThumbsUp class="size-4" />
90
- </button>
91
- <button type="button" class={iconBtn} aria-label="Not helpful" onClick={() => rate('not-helpful')}>
92
- <ThumbsDown class="size-4" />
93
- </button>
94
- </div>
95
- <div class="border-border flex items-center justify-center border-l">
96
- <button
97
- type="button"
98
- onClick={() => props.onClose?.()}
99
- class="text-muted-foreground hover:text-foreground flex items-center justify-center rounded-md p-3"
100
- aria-label="Close"
101
- >
102
- <X class="size-5" />
103
- </button>
104
- </div>
105
- </div>
106
- </Match>
107
-
108
- {/* ── Detail (phase 2, not-helpful only) ── */}
109
- <Match when={phase() === 'detail'}>
110
- <div class="flex w-[min(22rem,80vw)] flex-col gap-2.5 p-3">
111
- <div class="flex items-center justify-between">
112
- <span class="text-foreground font-medium">{props.detailTitle ?? 'What went wrong?'}</span>
113
- <button
114
- type="button"
115
- aria-label="Skip"
116
- onClick={() => setPhase('thanks')}
117
- class="text-muted-foreground hover:text-foreground"
118
- >
119
- <X class="size-4" />
120
- </button>
121
- </div>
122
- <Show when={props.categories?.length}>
123
- <div class="flex flex-wrap gap-1.5">
124
- <For each={props.categories}>
125
- {(c) => (
126
- <button
127
- type="button"
128
- aria-pressed={category() === c}
129
- onClick={() => setCategory(category() === c ? undefined : c)}
130
- class={cn(
131
- 'rounded-full border px-2.5 py-1 text-xs transition-colors',
132
- category() === c
133
- ? 'border-primary bg-primary text-primary-foreground'
134
- : 'border-border text-muted-foreground hover:text-foreground',
135
- )}
136
- >
137
- {c}
138
- </button>
139
- )}
140
- </For>
141
- </div>
142
- </Show>
143
- <Textarea
144
- value={comment()}
145
- onInput={(e) => setComment(e.currentTarget.value)}
146
- placeholder={props.detailPlaceholder ?? 'Tell us more (optional)'}
147
- class="border-border min-h-[3rem] rounded-md border px-2 py-1.5"
148
- />
149
- <div class="flex justify-end gap-2">
150
- <Button variant="ghost" size="sm" onClick={() => setPhase('thanks')}>Skip</Button>
151
- <Button variant="default" size="sm" onClick={submitDetail}>{props.submitLabel ?? 'Submit'}</Button>
152
- </div>
153
- </div>
154
- </Match>
155
-
156
- {/* ── Thanks ── */}
157
- <Match when={phase() === 'thanks'}>
158
- <div class="flex items-center gap-2 px-4 py-3" role="status">
159
- <Check class="size-4 text-emerald-500" />
160
- <span class="text-foreground font-medium">{props.thanksMessage ?? 'Thanks for your feedback'}</span>
161
- </div>
162
- </Match>
163
- </Switch>
164
- </div>
165
- );
166
- }