@kitn.ai/ui 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -518
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,114 +0,0 @@
1
- // The ELEMENT-layer diagnostic events: what the `kai-*` custom elements SAW a
2
- // consumer do to them.
3
- //
4
- // The wire events answer "did the data arrive". These answer the other half —
5
- // "the data is right and the UI still is not updating" — which is a different
6
- // failure with a different cause and, until now, no evidence at all. All three
7
- // causes are documented in root CLAUDE.md's `kai-` contract section, and every
8
- // one of them is silent by construction:
9
- //
10
- // 1. An array or object prop set as an HTML ATTRIBUTE. `component-register`
11
- // parses attributes with a `JSON.parse` whose `catch` returns the raw
12
- // string, so `el.setAttribute('messages', arr)` assigns the literal text
13
- // `"[object Object],[object Object]"` to the property and pushes THAT into
14
- // the Solid signal. Nothing throws, nothing logs, nothing renders.
15
- // 2. The SAME array reference handed back. solid-element creates one signal
16
- // per prop and sets it with `set(() => v)`; Solid's default equality is
17
- // `===`, so re-assigning the identical reference notifies nothing.
18
- // 3. A NEW array whose items are all the previous item objects. The array
19
- // notifies, but the lists render through reference-keyed `<For>`s, so no
20
- // row is re-invoked and nothing on screen changes.
21
- //
22
- // ZERO IMPORTS, DELIBERATELY. These are type declarations only, so this file is
23
- // erased at build. That is what lets `wire/diagnostics.ts` name them in its
24
- // union without `wire/` acquiring a runtime dependency on `elements/` — which
25
- // would be a real layering inversion, and would drag the element bundle into
26
- // every consumer that only parses streams.
27
- //
28
- // METADATA ONLY, by the same rule the wire events follow: if a value comes from
29
- // the model, the end user, or the app's data it is PAYLOAD; if it describes the
30
- // shape, size, timing or identity of that value it is METADATA. A tag name, a
31
- // prop name, a kind, a count and a length are all identity or shape. A prop's
32
- // VALUE never appears in any field below — `valuePreview` is a shape
33
- // description built from a closed vocabulary, never the text itself. Pinned by
34
- // `element-diagnostics-payload.test.ts`, which plants a sentinel inside every
35
- // prop value it sets and asserts it never reaches a serialized event.
36
-
37
- /** The envelope, structurally identical to `WireDiagnosticBase`. Restated here
38
- * rather than imported so this file keeps its zero-import property; the two are
39
- * kept in step by `element-diagnostics.test.ts`, which asserts every emitted
40
- * element event carries a `type` and a numeric `t`. */
41
- export interface ElementDiagnosticBase {
42
- type: string;
43
- /** `Date.now()` at emission. */
44
- t: number;
45
- }
46
-
47
- /** Which contract was broken. A closed vocabulary, so a panel keys its own
48
- * explanation off the kind and never needs prose from the kit. */
49
- export type ElementViolationKind =
50
- /** A non-scalar prop received a value through the ATTRIBUTE channel. The
51
- * attribute cannot carry an array or an object, so the property now holds a
52
- * string and the element renders nothing. */
53
- | 'array-prop-as-attribute'
54
- /** A list prop was set to the array reference it already held. Solid compares
55
- * with `===`, so this notified nothing — a no-op write. */
56
- | 'same-array-reference'
57
- /** A list prop received a NEW array of the SAME length whose every item is
58
- * reference-identical to the previous array's. The array notified, but every
59
- * row's identity is unchanged, so a reference-keyed `<For>` re-invokes none
60
- * of them. The classic "I mutated the item and copied the array" case.
61
- *
62
- * NOTE what this deliberately does NOT claim: the kit cannot know an item
63
- * "changed" without comparing its CONTENT, and content is payload. So this
64
- * reports the structurally knowable fact — an update that cannot render —
65
- * and leaves the question of whether the consumer meant anything by it to
66
- * the consumer, who is the only one who can answer it. */
67
- | 'mutated-in-place';
68
-
69
- /** A consumer broke one of the three `kai-` contract rules on a live element. */
70
- export interface ElementViolationEvent extends ElementDiagnosticBase {
71
- type: 'element.violation';
72
- kind: ElementViolationKind;
73
- /** The custom-element tag, e.g. `kai-chat`. */
74
- tag: string;
75
- /** The camelCase prop name, e.g. `messages`. */
76
- prop: string;
77
- /**
78
- * SHAPE of the offending value, never its content. `array-prop-as-attribute`
79
- * only. A closed vocabulary:
80
- *
81
- * `[object Object]` one object stringified into the attribute
82
- * `[object Object] x N` an array of N objects stringified — the common case
83
- * `json:number` the attribute held valid JSON, but a scalar
84
- * `json:boolean` "
85
- * `json:null` "
86
- * `string(len=N)` anything else: the LENGTH of the text, never the text
87
- * `empty-attribute` a bare attribute on a prop that needs a value
88
- */
89
- valuePreview?: string;
90
- /** Element count of the array involved. `same-array-reference` and
91
- * `mutated-in-place` only. A length is shape, not content. */
92
- length?: number;
93
- }
94
-
95
- /** Which `kai-*` elements are DEFINED in this realm right now.
96
- *
97
- * The question behind it is hydration: an SSR page whose markup contains
98
- * `<kai-chat>` but whose element bundle never loaded shows empty boxes and no
99
- * error, because an undefined custom element is a valid, inert HTMLElement.
100
- * The SSR starters already answer this by hand for a hard-coded handful
101
- * (`HydrationBadge.tsx`); this is the same answer over the whole manifest. */
102
- export interface ElementRegistryEvent extends ElementDiagnosticBase {
103
- type: 'element.registry';
104
- /** Tags `customElements.get()` resolved. */
105
- defined: string[];
106
- /** Tags in the manifest that are NOT defined in this realm. Named for what it
107
- * is rather than `undefined`, which is a miserable key to read in a panel. */
108
- notDefined: string[];
109
- /** `defined.length + notDefined.length`. Present so a panel can show "62 of
110
- * 79" without trusting itself to add up two arrays it may have truncated. */
111
- total: number;
112
- }
113
-
114
- export type ElementDiagnosticEvent = ElementViolationEvent | ElementRegistryEvent;
@@ -1,145 +0,0 @@
1
- import { createSignal, onCleanup, onMount } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Dialog, type DialogController } from '../ui/dialog';
4
- import { wireDisclosure } from './disclosure';
5
-
6
- interface Props extends Record<string, unknown> {
7
- /** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
8
- * attribute; the element still self-manages on Escape/backdrop). Set
9
- * `el.open = true`, or `<kai-dialog open>`; listen for `kai-open-change`. */
10
- open?: boolean;
11
- /** Initial open state on mount (uncontrolled seed). */
12
- defaultOpen?: boolean;
13
- /**
14
- * Accessible name for the modal, used when no `header` slot is projected:
15
- * `<kai-dialog label="Delete workspace">`. A projected `header` WINS over this
16
- * (it becomes `aria-labelledby`), because ARIA resolves `aria-labelledby` ahead
17
- * of `aria-label` and the visible heading is the name both a sighted and a
18
- * screen-reader user can be talked through. Defaults to `Dialog` so a modal is
19
- * never nameless.
20
- */
21
- label?: string;
22
- }
23
-
24
- /**
25
- * The fallback accessible name.
26
- *
27
- * DELIBERATELY GENERIC, and a decision rather than a placeholder. A modal with no
28
- * name at all fails WCAG and axe's `aria-dialog-name`; "Dialog, dialog" is merely
29
- * redundant, and between the two the redundant one is strictly better — it is also
30
- * what Shoelace and WebAwesome ship. The kit cannot know what a given modal is about,
31
- * so inventing something specific here would be a worse default than saying nothing
32
- * extra. Consumers name it properly with `label` or by projecting a `header`.
33
- */
34
- const DEFAULT_LABEL = 'Dialog';
35
-
36
- /**
37
- * The consumer's label, or the fallback — with "no label" meaning every way a
38
- * consumer can arrive at one.
39
- *
40
- * The declared default is a SEED, not a floor: component-register writes the prop
41
- * back as `null` when the attribute is removed and does NOT restore the declared
42
- * value, so `props.label` is legitimately `null`/`undefined` at runtime. An empty or
43
- * whitespace-only string is the same situation wearing a name — `aria-label=""` is a
44
- * `role="dialog"` with no accessible name, i.e. the exact defect this exists to
45
- * prevent, reached through the attribute that was supposed to prevent it. Each of
46
- * those routes is a row in tests/elements/dialog.test.tsx, because a mutation run
47
- * showed the plain `??` was uncovered.
48
- */
49
- function resolveLabel(label: unknown): string {
50
- return typeof label === 'string' && label.trim() !== '' ? label : DEFAULT_LABEL;
51
- }
52
-
53
- /** Events fired by `<kai-dialog>`. */
54
- interface Events {
55
- /** The dialog opened or closed (Escape, backdrop click, a driven `open`, or a method). */
56
- 'kai-open-change': { open: boolean };
57
- }
58
-
59
- /**
60
- * `<kai-dialog>` — a centered modal: a dimmed backdrop over the page with a
61
- * centered panel of arbitrary content. It is the real primitive behind the kind
62
- * of modal that settings panels and broadcast composers reach for.
63
- *
64
- * **How to use** — slot the body, and optionally a `header` and `footer`:
65
- * ```html
66
- * <kai-dialog open>
67
- * <h2 slot="header">Broadcast a message</h2>
68
- * <textarea placeholder="What's on your mind?"></textarea>
69
- * <div slot="footer">
70
- * <button onclick="this.closest('kai-dialog').hide()">Cancel</button>
71
- * <button>Send</button>
72
- * </div>
73
- * </kai-dialog>
74
- * ```
75
- *
76
- * The default slot is the body; `header`/`footer` are optional regions with
77
- * dividers. The backdrop dims the page; clicking it (or pressing Escape) closes
78
- * the dialog. Focus moves into the panel on open and is restored on close, and a
79
- * basic Tab focus trap keeps keyboard focus inside while open.
80
- *
81
- * The dialog is always named: a projected `header` becomes its `aria-labelledby`,
82
- * and otherwise `label` becomes its `aria-label` (defaulting to `Dialog`). The
83
- * header wins when both are present, since ARIA ranks `aria-labelledby` first.
84
- *
85
- * Open state is the standard disclosure surface: settable+reflecting `open`,
86
- * `kai-open-change`, and `show()`/`hide()`/`toggle()`; seed with `default-open`.
87
- * It also exposes `focus()` to move focus to the panel. Parts: `backdrop` ·
88
- * `panel` · `header` · `body` · `footer`.
89
- */
90
- defineWebComponent<Props, Events>('kai-dialog', {
91
- open: undefined,
92
- defaultOpen: undefined,
93
- label: DEFAULT_LABEL,
94
- }, (props, ctx) => {
95
- const { flag, element, expose } = ctx;
96
- let api: DialogController | undefined;
97
- let panel: HTMLElement | undefined;
98
-
99
- // The standard disclosure surface: settable+reflecting `open`, kai-open-change,
100
- // show/hide/toggle. See ./disclosure. The SOLE emitter of kai-open-change — the
101
- // primitive's onOpenChange is intentionally NOT wired here to avoid a double
102
- // dispatch.
103
- wireDisclosure(ctx, () => api, () => props.open);
104
-
105
- // Only render the header/footer chrome (border + padding) when the consumer has
106
- // actually projected content for that slot — otherwise an empty bordered region
107
- // would show. Tracked off the host's light-DOM children.
108
- const [hasHeader, setHasHeader] = createSignal(false);
109
- const [hasFooter, setHasFooter] = createSignal(false);
110
- const recompute = () => {
111
- setHasHeader(!!element.querySelector(':scope > [slot="header"]'));
112
- setHasFooter(!!element.querySelector(':scope > [slot="footer"]'));
113
- };
114
- onMount(() => {
115
- recompute();
116
- if (typeof MutationObserver === 'function') {
117
- const obs = new MutationObserver(recompute);
118
- obs.observe(element, { childList: true });
119
- onCleanup(() => obs.disconnect());
120
- }
121
- });
122
-
123
- // focus() shadows the host's native focus so it targets the dialog panel inside
124
- // the shadow root (the WebAwesome/Shoelace convention).
125
- expose({
126
- /** Move focus to the dialog panel (no-op while closed). */
127
- focus: (options?: FocusOptions) => panel?.focus(options),
128
- });
129
-
130
- return (
131
- <Dialog
132
- defaultOpen={flag('defaultOpen')}
133
- // The primitive already ranks these correctly — it emits `aria-labelledby` when
134
- // a header is present and `aria-label` only when one is not — so the facade just
135
- // has to HAND the name over, which is the wiring that was missing.
136
- aria-label={resolveLabel(props.label)}
137
- header={hasHeader() ? <slot name="header" /> : undefined}
138
- footer={hasFooter() ? <slot name="footer" /> : undefined}
139
- controllerRef={(a) => (api = a)}
140
- panelRef={(el) => (panel = el)}
141
- >
142
- <slot />
143
- </Dialog>
144
- );
145
- });
@@ -1,95 +0,0 @@
1
- import { createEffect, untrack, type Accessor } from 'solid-js';
2
- import type { WebComponentContext } from './define';
3
-
4
- /** The open controller a primitive hands up via `controllerRef` so a facade can
5
- * drive + observe its open/closed state. */
6
- export interface OpenController {
7
- open: Accessor<boolean>;
8
- setOpen: (v: boolean) => void;
9
- }
10
-
11
- /**
12
- * Wire the standard Shoelace/WebAwesome-style overlay surface onto an internal
13
- * open controller — the kit's convention for every open/close element (hover-card,
14
- * tooltip, popover, menu, model-switcher, scope-picker, collapsibles, …). NOT
15
- * React-controlled: the element keeps self-managing; this layers the host-facing
16
- * conveniences on top.
17
- *
18
- * Given the primitive's `{ open, setOpen }` controller, it provides:
19
- * - **`open` reflects** to the host `[open]` attribute (for `:host([open])` CSS),
20
- * and is **settable** — `el.open = true` / `<el open>` drives it;
21
- * - **`kai-open-change` `{ open }`** fires once per change (a guarded reflect
22
- * avoids the attribute⇄prop feedback loop);
23
- * - **`show()` / `hide()` / `toggle()`** instance methods, gated by `disabled`.
24
- *
25
- * The facade still:
26
- * - declares the `open` / `defaultOpen` / `disabled` props (defaults `undefined`),
27
- * - seeds the primitive from `defaultOpen` (e.g. via the primitive's own prop),
28
- * - includes `'kai-open-change': { open: boolean }` in its `Events` map.
29
- *
30
- * @param ctx the facade's WebComponentContext (its Events must include kai-open-change).
31
- * @param getApi returns the open controller once the primitive has handed it up (may be undefined early).
32
- * @param openProp reads the raw reactive `open` prop (e.g. `() => props.open`) — used to tell
33
- * "consumer explicitly set open" from "unset" so a `defaultOpen` seed isn't clobbered.
34
- */
35
- export function wireDisclosure<E extends { 'kai-open-change': { open: boolean } }>(
36
- ctx: WebComponentContext<E>,
37
- getApi: () => OpenController | undefined,
38
- openProp: () => unknown,
39
- ): void {
40
- const { element, dispatch, flag, reflectFlag, expose } = ctx;
41
- let prev: boolean | undefined;
42
-
43
- // External `open` prop/attr → drive internal state. Only when the consumer has
44
- // EXPLICITLY set it (so a defaultOpen seed survives mount); the equality guard
45
- // keeps the reflect below from looping back through the prop.
46
- //
47
- // THIS RUNS FIRST, AND THE ORDER IS THE FIX FOR A REAL DEFECT. It used to run
48
- // second, after the outward reflection — which on the very first pass read a
49
- // controller still in its default CLOSED state and called
50
- // `toggleAttribute('open', false)`, DELETING the author's attribute before anything
51
- // had read it. This effect then saw no attribute and a prop that
52
- // component-register had parsed to `undefined`, concluded nothing was asked for,
53
- // and left the element shut. Net result: `<kai-reasoning open>` — the plain HTML
54
- // spelling the `open` prop's own doc advertises — never opened; only `default-open`
55
- // did. Reading intent IN before reflecting state OUT is what makes the author's
56
- // attribute survive long enough to mean something.
57
- createEffect(() => {
58
- const api = getApi();
59
- if (!api) return;
60
- const explicit = openProp() !== undefined || element.hasAttribute('open');
61
- if (!explicit) return;
62
- const desired = flag('open');
63
- if (desired !== untrack(api.open)) api.setOpen(desired);
64
- });
65
-
66
- // Reflect internal open → the `[open]` host attribute.
67
- //
68
- // Through `reflectFlag`, whose SOURCE is the controller rather than the prop — this
69
- // element's truth is its internal open signal, not `props.open`. It also installs
70
- // the read-back accessor, which this wiring needed and did not have: `el.open = true`
71
- // used to leave `el.open === undefined`, exactly as `kai-chat`'s `loading` did
72
- // (findings G-05). Returning `undefined` before the primitive has handed its
73
- // controller up leaves the author's `<el open>` attribute alone.
74
- reflectFlag('open', () => getApi()?.open());
75
-
76
- // kai-open-change, fired once per change. Separate from the reflection above
77
- // because it is a notification, not a reflection; both run in the same batch, so
78
- // splitting them changes nothing observable about the ordering.
79
- createEffect(() => {
80
- const api = getApi();
81
- if (!api) return;
82
- const o = api.open();
83
- if (prev !== undefined && prev !== o) dispatch('kai-open-change', { open: o } as E['kai-open-change']);
84
- prev = o;
85
- });
86
-
87
- expose({
88
- /** Open it programmatically (no-op while disabled). */
89
- show: () => { if (!flag('disabled')) getApi()?.setOpen(true); },
90
- /** Close it programmatically. */
91
- hide: () => getApi()?.setOpen(false),
92
- /** Flip the open state (closes while disabled). */
93
- toggle: () => { const api = getApi(); if (api) api.setOpen(flag('disabled') ? false : !api.open()); },
94
- });
95
- }
@@ -1,215 +0,0 @@
1
- import { untrack } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import {
4
- Dock, DockCloseGlyph, DockLauncherGlyph,
5
- type DockController, type DockFocusOnOpen, type DockPosition,
6
- } from '../ui/dock';
7
- import { wireDisclosure } from './disclosure';
8
-
9
- interface Props extends Record<string, unknown> {
10
- /** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
11
- * attribute; the element still self-manages on the launcher and Escape). Set
12
- * `el.open = true`, or `<kai-dock open>`; listen for `kai-open-change`. */
13
- open?: boolean;
14
- /** Initial open state on mount (uncontrolled seed). */
15
- defaultOpen?: boolean;
16
- /** Which corner the dock sits in. Logical, so `-end` follows the writing direction
17
- * and an RTL page docks on the left. Attribute: `position`. */
18
- position?: DockPosition;
19
- /** The widget's NAME. Derives the panel's accessible name and both launcher names
20
- * (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
21
- label?: string;
22
- /** i18n override for the launcher's name while closed (default `Open ${label}`). */
23
- openLabel?: string;
24
- /** i18n override for the launcher's name while open (default `Close ${label}`). */
25
- closeLabel?: string;
26
- /** Show the unread dot. YOURS: it renders only while closed, and the dock never
27
- * writes it back. Clear it in your `kai-open-change` handler. */
28
- unread?: boolean;
29
- /** Disable the launcher; `show()` and `toggle()` are gated on it. */
30
- disabled?: boolean;
31
- /** Suppress the dock's own built-in mobile close X. Set this when your slotted
32
- * panel content supplies its own close affordance (e.g. a `<kai-chat
33
- * slot="header-end">` close button), otherwise the two stack. TRADEOFF: the
34
- * mobile panel reserves a padding band above its content so the built-in X
35
- * never paints over slotted content; that band stays reserved unless you set
36
- * this true, so only set it once your own control is actually in place.
37
- * Attribute: `hide-close`. */
38
- hideClose?: boolean;
39
- /** Where focus lands on open: `content` (default, the first element you slotted),
40
- * `panel`, or `none`. Attribute: `focus-on-open`. */
41
- focusOnOpen?: DockFocusOnOpen;
42
- }
43
-
44
- /** Events fired by `<kai-dock>`. */
45
- interface Events {
46
- /** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
47
- 'kai-open-change': { open: boolean };
48
- }
49
-
50
- /**
51
- * `<kai-dock>` — the corner launcher: a floating button pinned to a corner of the
52
- * viewport, and a panel above it holding whatever you slot in. This is the "chat
53
- * bubble in the bottom-right" affordance. (Not to be confused with
54
- * `<kai-prompt-dock>`, which is a recessed tray that frames a prompt INPUT and does
55
- * not float, launch or open anything.)
56
- *
57
- * **How to use** — slot the surface, and let the dock own the button:
58
- * ```html
59
- * <kai-dock label="Aurora support">
60
- * <kai-chat slot="panel" chat-title="Aurora Support"></kai-chat>
61
- * </kai-dock>
62
- * ```
63
- *
64
- * The panel is content-agnostic: a `<kai-chat>`, a form, your own element. The dock
65
- * never reads or types it. `slot="launcher"` / `slot="launcher-open"` swap the icon
66
- * INSIDE the built-in button — the button itself is never slotted away, because the
67
- * dock owns `aria-expanded`, `aria-controls`, the toggle wiring and the focus return,
68
- * and a replaced button would take all four with it.
69
- *
70
- * Open state is the standard disclosure surface: settable+reflecting `open`,
71
- * `kai-open-change`, and `show()`/`hide()`/`toggle()`; seed with `default-open`. It
72
- * also exposes `focus()` — the panel while open, the launcher while closed.
73
- *
74
- * Neither `default-open` nor `open` moves focus at mount. A widget docked on someone
75
- * else's page does not get to steal focus on load, which is the one place this
76
- * element differs from `<kai-dialog>`, where a modal opened at mount takes focus on
77
- * purpose. Opening it later does move focus, per `focus-on-open`.
78
- *
79
- * Closed does not mean gone: the panel keeps its layout box (`visibility: hidden` +
80
- * `inert`), so a thread inside it never re-measures from zero and a reply that lands
81
- * while closed is really there. `unread` is yours to set and yours to clear; the dot
82
- * just stops rendering while open.
83
- *
84
- * Escape closes only while the dock holds focus, and is never swallowed — a widget
85
- * docked on someone else's page does not get to eat their Escape. There is no focus
86
- * trap; the page stays usable, which is the point of "docked".
87
- *
88
- * Geometry is CSS custom properties, not props: `--kai-dock-width` ·
89
- * `--kai-dock-height` · `--kai-dock-inset` · `--kai-dock-gap` · `--kai-dock-radius` ·
90
- * `--kai-dock-z` · `--kai-dock-launcher-size`. Narrow viewports go full-bleed by
91
- * default. Parts: `launcher` · `panel` · `badge`.
92
- *
93
- * Put it as a body-level child: a `transform` / `filter` / `contain` ancestor makes
94
- * `position: fixed` resolve against that ancestor instead of the viewport.
95
- *
96
- * **Migrating a hand-rolled widget onto this element changes two behaviours**, both
97
- * deliberately, so check them rather than assuming a drop-in:
98
- *
99
- * 1. **Escape is scoped to the dock.** Hand-rolled versions of this widget typically
100
- * listen on `document` and close on any Escape anywhere on the page. This one
101
- * closes only while the dock holds focus, and never stops the event. If your app
102
- * relied on Escape-anywhere, that is now the host page's key again.
103
- * 2. **The panel keeps its layout box while closed.** It is hidden with
104
- * `visibility` + `inert`, not `display: none`, and is never unmounted, so whatever
105
- * you slot in KEEPS RENDERING in the background: a stream still folds in, timers
106
- * still run, and heights stay measured. That is what makes `unread` honest and
107
- * what stops a reopened thread re-measuring from zero, but it does mean a panel
108
- * that was free while `display: none` no longer is.
109
- */
110
- defineWebComponent<Props, Events>('kai-dock', {
111
- open: undefined,
112
- defaultOpen: undefined,
113
- position: 'bottom-end',
114
- label: 'Chat',
115
- openLabel: undefined,
116
- closeLabel: undefined,
117
- unread: undefined,
118
- disabled: undefined,
119
- hideClose: undefined,
120
- focusOnOpen: 'content',
121
- }, (props, ctx) => {
122
- const { flag, element, expose, reflectFlag } = ctx;
123
- let api: DockController | undefined;
124
- let panel: HTMLElement | undefined;
125
- let launcher: HTMLButtonElement | undefined;
126
-
127
- // The standard disclosure surface: settable+reflecting `open`, kai-open-change,
128
- // show/hide/toggle. See ./disclosure — and note it is the SOLE emitter of the
129
- // event, so the primitive's onOpenChange is deliberately not wired here.
130
- wireDisclosure(ctx, () => api, () => props.open);
131
-
132
- // The other three booleans get the same read-back treatment, for the same reason:
133
- // `<kai-dock unread>` parses to `undefined`, so without this the property would
134
- // contradict the attribute that set it (findings G-05). Reflecting `unread` syncs
135
- // the ATTRIBUTE to the prop and never changes the VALUE — the dock still never
136
- // decides that a message has been read.
137
- reflectFlag('unread');
138
- reflectFlag('disabled');
139
- reflectFlag('defaultOpen');
140
- reflectFlag('hideClose');
141
-
142
- // Seed the primitive from EITHER spelling, read once at upgrade.
143
- //
144
- // `open` is folded in here rather than left to wireDisclosure's effect on purpose.
145
- // That effect runs a tick after mount, so `<kai-dock open>` would mount closed and
146
- // then transition — which the primitive's focus effect would correctly read as a
147
- // real open and steal focus with, on page load, on someone else's page. Seeding
148
- // makes mount a non-event for both spellings; wireDisclosure's effect then finds
149
- // the value already correct and its equality guard makes it a no-op.
150
- //
151
- // UNTRACKED, and that is not defensive noise — it is the fix for a real defect this
152
- // element shipped for about ten minutes. A facade body runs inside the tracking
153
- // scope that inserts it, so a bare `flag('open')` here subscribes the WHOLE FACADE
154
- // to `open`: every toggle re-ran it, which re-created the `<Dock>`, its panel div
155
- // and its controller. The visible symptoms were far away from the cause — focus
156
- // never moved (each fresh focus effect was re-seeded with the current state, so it
157
- // saw no transition) and `kai-open-change` never fired (wireDisclosure had latched
158
- // the first, discarded controller). Reading a prop at the top level of a facade is
159
- // the general trap; `untrack` is how you say "seed", and it is what makes this a
160
- // seed rather than a subscription.
161
- const seed = untrack(() => flag('open') || flag('defaultOpen'));
162
-
163
- expose({
164
- /** Move focus to the panel while open, or to the launcher while closed. */
165
- focus: (options?: FocusOptions) =>
166
- (api?.open() ? panel : launcher)?.focus(options),
167
- });
168
-
169
- // The `content` focus target: the first element assigned to the panel. Read off the
170
- // live slots rather than off `element.children`, so it is the ASSIGNMENT that
171
- // decides — a child whose `slot` attribute changes moves with it, and a comment or
172
- // whitespace text node is not mistaken for content.
173
- const contentTarget = () => {
174
- const slots = panel?.querySelectorAll('slot');
175
- for (const slot of Array.from(slots ?? [])) {
176
- const first = (slot as HTMLSlotElement).assignedElements()[0];
177
- if (first instanceof HTMLElement) return first;
178
- }
179
- return undefined;
180
- };
181
-
182
- return (
183
- <Dock
184
- defaultOpen={seed}
185
- position={props.position as DockPosition}
186
- label={props.label as string}
187
- openLabel={props.openLabel as string | undefined}
188
- closeLabel={props.closeLabel as string | undefined}
189
- unread={flag('unread')}
190
- disabled={flag('disabled')}
191
- hideClose={flag('hideClose')}
192
- focusOnOpen={props.focusOnOpen as DockFocusOnOpen}
193
- contentTarget={contentTarget}
194
- controllerRef={(a) => (api = a)}
195
- panelRef={(el) => (panel = el)}
196
- launcherRef={(el) => (launcher = el)}
197
- // NATIVE SLOT FALLBACK does the whole icon chain, with no occupancy tracking and
198
- // no MutationObserver: an unfilled slot renders its fallback content, and a slot
199
- // nested in another slot's fallback still receives its own assignment. So
200
- // `launcher-open` wins while open; failing that the consumer's `launcher` glyph
201
- // STAYS rather than morphing into a built-in ✕ that clashes with their art;
202
- // failing that the built-in ✕. Both defaults are the primitive's own, imported
203
- // rather than re-drawn here.
204
- launcher={<slot name="launcher"><DockLauncherGlyph /></slot>}
205
- launcherOpen={(
206
- <slot name="launcher-open">
207
- <slot name="launcher"><DockCloseGlyph /></slot>
208
- </slot>
209
- )}
210
- >
211
- <slot name="panel" />
212
- <slot />
213
- </Dock>
214
- );
215
- });