@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,563 +0,0 @@
1
- import { customElement } from 'solid-element';
2
- import { ChatConfig } from '../primitives/chat-config';
3
- import { ELEMENT_CSS } from './css';
4
- import { elementDiagnosticsWanted, installElementDiagnostics } from './element-diagnostics';
5
- import { createEffect, createSignal, onCleanup, Show, type JSX } from 'solid-js';
6
-
7
- /**
8
- * Shared constructable stylesheet, built once and adopted by every element's
9
- * shadow root. This avoids duplicating the full compiled kit CSS (~77 KB) as an
10
- * inline `<style>` in each instance — important now that composing many small
11
- * elements on a page is a supported pattern. Falls back to `null` where
12
- * Constructable Stylesheets aren't available, in which case the facade renders
13
- * an inline `<style>` instead (see below).
14
- */
15
- let sharedSheet: CSSStyleSheet | null | undefined;
16
- function getSharedSheet(): CSSStyleSheet | null {
17
- if (sharedSheet !== undefined) return sharedSheet;
18
- try {
19
- if (typeof CSSStyleSheet === 'undefined') throw new Error('no CSSStyleSheet');
20
- const sheet = new CSSStyleSheet();
21
- sheet.replaceSync(ELEMENT_CSS);
22
- sharedSheet = sheet;
23
- } catch {
24
- sharedSheet = null;
25
- }
26
- return sharedSheet;
27
- }
28
-
29
- /** Resolve whether the element should render dark, given its `theme` and the
30
- * system preference. `auto` (the default) follows `prefers-color-scheme`. */
31
- function createDarkMode(getTheme: () => string | undefined) {
32
- const [systemDark, setSystemDark] = createSignal(false);
33
- if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
34
- const mq = window.matchMedia('(prefers-color-scheme: dark)');
35
- setSystemDark(mq.matches);
36
- const onChange = (e: MediaQueryListEvent) => setSystemDark(e.matches);
37
- mq.addEventListener('change', onChange);
38
- onCleanup(() => mq.removeEventListener('change', onChange));
39
- }
40
- return () => {
41
- const theme = getTheme() ?? 'auto';
42
- return theme === 'dark' || (theme === 'auto' && systemDark());
43
- };
44
- }
45
-
46
- /**
47
- * Context handed to every element facade. `E` is the element's event map —
48
- * `{ eventName: detailType }` — which types `dispatch` so a facade can only fire
49
- * its declared events with the right `detail` shape.
50
- */
51
- export interface WebComponentContext<E = Record<string, unknown>> {
52
- /** The custom-element host node. */
53
- element: HTMLElement;
54
- /** Fire a non-bubbling, non-composed CustomEvent off the host. Consumers
55
- * listen directly on the element (`el.addEventListener(...)`). Typed by the
56
- * element's event map `E`. */
57
- dispatch: <K extends keyof E & string>(type: K, detail?: E[K]) => void;
58
- /**
59
- * Resolve a boolean flag from a prop the way HTML authors expect.
60
- *
61
- * `component-register` parses a *bare* boolean attribute (`<el removable>`) to
62
- * `undefined`, not `true` — so a facade can't rely on the prop value alone.
63
- * `flag('removable')` returns ON when the property is `true`, OR when the
64
- * matching attribute is present and not explicitly `="false"`. So all of
65
- * `<el removable>`, `<el removable="true">`, and `el.removable = true` turn it
66
- * on; `<el removable="false">`, absent, and `el.removable = false` turn it off.
67
- *
68
- * `name` is the camelCase prop name; the matching kebab attribute is derived.
69
- */
70
- flag: (name: string) => boolean;
71
- /**
72
- * Expose imperative methods on the host element instance — the input half of a
73
- * component's interaction surface (`el.focus()`, `el.clear()`, `el.scrollToBottom()`,
74
- * …), the counterpart to the events `dispatch` fires. Call once from the facade
75
- * with closures over its internal state/refs; each entry is assigned to the host,
76
- * so a consumer calls it directly: `document.querySelector('kai-prompt-input').focus()`.
77
- * Overriding a native method name (e.g. `focus`) shadows it on the instance so it
78
- * can target the right control inside the shadow root (the WebAwesome/Shoelace
79
- * convention). Methods are attached when the facade renders (on element upgrade).
80
- */
81
- expose: (methods: Record<string, (...args: never[]) => unknown>) => void;
82
- /**
83
- * Reflect a boolean prop to its host attribute AND make that prop read back what
84
- * was set. Use this instead of hand-rolling
85
- * `createEffect(() => element.toggleAttribute('x', flag('x')))`.
86
- *
87
- * WHY IT IS ONE CALL AND NOT TWO. The reflection is what BREAKS the read-back, so
88
- * the fix has to be attached to it or it gets forgotten — and it was, three times.
89
- * `toggleAttribute(name, true)` sets the attribute to the EMPTY STRING;
90
- * component-register's `attributeChangedCallback` then writes the prop back as
91
- * `this[name] = parseAttributeValue("")`, and `parseAttributeValue` returns
92
- * `undefined` for the empty string. So a reflected flag became write-only:
93
- * `el.loading = true` left `el.loading === undefined` while `[loading]` was on the
94
- * host. The element kept BEHAVING correctly, because `flag()` reads the attribute —
95
- * which is precisely why nobody noticed until a consumer tried to read the property
96
- * back (findings G-05).
97
- *
98
- * What this installs is an instance-level wrapper around the accessor
99
- * component-register already created, coercing every incoming value through the
100
- * same `flag()` policy (`resolveFlag`) — so the `undefined` write-back resolves to
101
- * the attribute that caused it, and the property and the attribute can no longer
102
- * disagree. It delegates to the underlying setter, so reactivity is untouched.
103
- *
104
- * `source` overrides where the ON/OFF value comes from, for an element whose truth
105
- * is an internal controller rather than the prop (see `wireDisclosure`). Returning
106
- * `undefined` from it means "not ready, leave the attribute alone".
107
- */
108
- reflectFlag: (name: string, source?: () => boolean | undefined) => void;
109
- /**
110
- * Whether the element should currently render its dark-mode look --
111
- * exactly the SAME resolved value that already drives the `.dark` class
112
- * every facade's content sits inside (not a second computation of the
113
- * `theme='light'|'dark'|'auto'` rule; see `createDarkMode` above). Most
114
- * facades never need this directly, since the injected kit CSS already
115
- * flips its custom properties under `.dark`. It exists for content that
116
- * cannot read CSS at all -- e.g. a WebGL shader baking a colour choice
117
- * into a GLSL uniform, which is why `kai-audio-visualizer` reads it.
118
- */
119
- dark: () => boolean;
120
- }
121
-
122
- /** camelCase prop name → kebab-case attribute (`hoverCard` → `hover-card`). */
123
- function toAttr(name: string): string {
124
- return name.replace(/([A-Z])/g, '-$1').toLowerCase();
125
- }
126
-
127
- /**
128
- * Every property name the built-in element prototype chain exposes as an ACCESSOR
129
- * — `role`, `hidden`, `autofocus`, `dir`, `title`, `className`, … — i.e. the
130
- * reflected IDL attributes plus the handful of read-only accessors. Methods
131
- * (`focus`, `append`) are plain data properties and are deliberately not included:
132
- * assigning over one shadows it on the instance but destroys nothing on the DOM.
133
- *
134
- * DERIVED, not listed. A hand-written list is a list someone has to remember to
135
- * extend: the collision set is (this element's prop names) × (whatever the browser
136
- * reflects), and both sides move — the kit adds props, and the platform keeps
137
- * adding globals (`inert`, `popover`, `writingSuggestions` are all recent). Reading
138
- * it off the live prototype chain means a prop that starts colliding tomorrow is
139
- * protected the day it lands, in whichever engines have shipped the accessor,
140
- * without a code change. It also self-limits: in an engine that has NOT shipped a
141
- * given accessor (jsdom has no `autofocus`) the name is simply not a collision
142
- * there, which is exactly right.
143
- *
144
- * Computed once — the chain does not change at runtime.
145
- */
146
- let globalAccessorNames: Set<string> | undefined;
147
- export function reflectedGlobalPropNames(): Set<string> {
148
- if (globalAccessorNames) return globalAccessorNames;
149
- const names = new Set<string>();
150
- let proto: object | null =
151
- typeof HTMLElement === 'undefined' ? null : (HTMLElement.prototype as object);
152
- while (proto && proto !== Object.prototype) {
153
- for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(proto))) {
154
- if (descriptor.get || descriptor.set) names.add(name);
155
- }
156
- proto = Object.getPrototypeOf(proto) as object | null;
157
- }
158
- globalAccessorNames = names;
159
- return names;
160
- }
161
-
162
- /**
163
- * Replace inherited reflected accessors with plain, non-reflecting per-instance
164
- * stores on this element class's prototype. Setting the property then only STORES
165
- * the value — component-register still reads it back to seed the styling prop, and
166
- * later shadows this with its own (also non-reflecting) instance accessor — and it
167
- * can never touch a host attribute.
168
- */
169
- function installNonReflectingProps(proto: object, keys: readonly string[]): void {
170
- for (const key of keys) {
171
- const store = Symbol(`kai-prop:${key}`);
172
- Object.defineProperty(proto, key, {
173
- get(this: Record<symbol, unknown>) {
174
- return this[store];
175
- },
176
- set(this: Record<symbol, unknown>, value: unknown) {
177
- this[store] = value;
178
- },
179
- enumerable: true,
180
- configurable: true,
181
- });
182
- }
183
- }
184
-
185
- /**
186
- * Run `define` (solid-element's `customElement`, which calls
187
- * `customElements.define` internally) with `keys` already shadowed on the element
188
- * class — BEFORE the registry ever sees it.
189
- *
190
- * THE ORDER IS THE WHOLE POINT. `customElements.define()` synchronously upgrades
191
- * every matching element the parser has already produced, and component-register's
192
- * constructor runs `this[prop] = undefined` for every declared prop. If the
193
- * non-reflecting accessor is installed AFTER the define call, that assignment lands
194
- * on the NATIVE setter, which for a reflected IDL attribute means the author's
195
- * markup is destroyed before a line of facade code runs — `undefined` coerces to
196
- * `null`/`false` and the setter removes the attribute. Measured in chromium from
197
- * parsed HTML (`node scripts/probe-upgrade-attribute-loss.mjs`):
198
- *
199
- * <kai-message role="user"> → role attr gone, el.role "assistant",
200
- * the row renders as "Assistant message"
201
- * <kai-resizable-item hidden> → hidden attr gone, el.hidden false, the
202
- * panel is slotted and RENDERS VISIBLE
203
- * <kai-confirm autofocus> → autofocus attr gone, nothing focused
204
- *
205
- * Two of those are silent: `hidden` and `autofocus` are legitimate global
206
- * attributes, so no a11y rule and no console warning fires — the value simply
207
- * evaporates. Only `role` was loud enough to get noticed.
208
- *
209
- * WHY A TRANSIENT REGISTRY WRAP and not something tidier: the class does not exist
210
- * until `register()` builds it, and `register()` defines it in the same statement.
211
- * component-register can take a `BaseElement` (a prototype we control) or a
212
- * `customElements`-alike (a registry we control) via its third argument — either
213
- * would be cleaner — but solid-element's `customElement()` calls `register(tag,
214
- * props)` with no options and forwards nothing, and `component-register` is not a
215
- * declared dependency of this package, so reaching past solid-element to call
216
- * `register` ourselves would ship an undeclared import to consumers. Intercepting
217
- * the one `define` call is the smallest seam that exists.
218
- *
219
- * The wrap is synchronous, restored in a `finally`, delegates to whatever was
220
- * installed (so a polyfilled or consumer-wrapped registry keeps working), acts only
221
- * on OUR tag, and is re-entrancy safe: a facade that defines another element during
222
- * its upgrade nests a second wrap and unwinds it in order.
223
- */
224
- function defineWithNonReflectingProps<T>(
225
- tag: string,
226
- keys: readonly string[],
227
- define: () => T,
228
- /**
229
- * Anything else that must be on the prototype BEFORE the registry sees the
230
- * class. Today that is the element-layer diagnostics, and it needs this seam
231
- * for a reason that is adjacent to the one above but not the same: `define()`
232
- * SNAPSHOTS the lifecycle callbacks (`connectedCallback`,
233
- * `attributeChangedCallback`, …) off the prototype into the custom-element
234
- * definition, and the browser invokes the snapshot. A wrapper installed
235
- * afterwards is present on the prototype, passes `hasOwnProperty`, and is
236
- * never called. See `installElementDiagnostics`.
237
- */
238
- alsoPatch?: (proto: object) => void,
239
- ): { result: T; handled: boolean } {
240
- // `handled` = nothing more for the caller to do. With no colliding props and
241
- // nothing else to patch there is nothing to install at all, so that case is
242
- // trivially handled.
243
- if (keys.length === 0 && !alsoPatch) return { result: define(), handled: true };
244
- const registry = customElements;
245
- const hadOwnDefine = Object.prototype.hasOwnProperty.call(registry, 'define');
246
- const inner = registry.define;
247
- let handled = false;
248
- let restore: (() => void) | undefined;
249
- try {
250
- registry.define = function (
251
- this: CustomElementRegistry,
252
- name: string,
253
- constructor: CustomElementConstructor,
254
- options?: ElementDefinitionOptions,
255
- ) {
256
- if (name === tag) {
257
- if (keys.length) installNonReflectingProps(constructor.prototype, keys);
258
- alsoPatch?.(constructor.prototype);
259
- handled = true;
260
- }
261
- return inner.call(this, name, constructor, options);
262
- };
263
- restore = () => {
264
- if (hadOwnDefine) registry.define = inner;
265
- else delete (registry as unknown as Record<string, unknown>).define;
266
- };
267
- } catch {
268
- // A frozen registry (SES lockdown, a sealed polyfill, a hardened extension
269
- // page): we cannot get ahead of define() there. Leave `handled` false so the
270
- // caller installs on the returned class instead — the OLD, too-late timing, but
271
- // registration itself still succeeds. Getting this wrong the other way would
272
- // take all 80 elements down in that environment to fix three props in it.
273
- }
274
- try {
275
- return { result: define(), handled };
276
- } finally {
277
- restore?.();
278
- }
279
- }
280
-
281
- /**
282
- * Marks a setter as one of ours, so the wrap is idempotent WITHOUT being permanent.
283
- *
284
- * The mark goes on the setter function rather than on the element, and that is the
285
- * whole subtlety: component-register installs a FRESH instance accessor from
286
- * `initializeProps` on every (re)connect after a release, which throws our wrapper
287
- * away. An element-level "already done" flag would then skip re-wrapping and the
288
- * property would quietly go write-only again on the second mount. An unmarked setter
289
- * is by definition a new one, so it gets wrapped again.
290
- */
291
- const FLAG_READ_BACK = Symbol('kai-flag-read-back');
292
-
293
- /**
294
- * Wrap the instance accessor component-register created for `name` so every value
295
- * written to it — a consumer's assignment, or the `undefined` write-back that
296
- * `attributeChangedCallback` performs after a `toggleAttribute` — is resolved through
297
- * the same policy `flag()` uses.
298
- *
299
- * TIMING. This must run from the facade body, i.e. during `connectedCallback` AFTER
300
- * `initializeProps`, and that is not a detail: `initializeProps` harvests any value
301
- * set on the element BEFORE upgrade (`value = element[key]`) and only then installs
302
- * the accessor. Wrapping earlier (on the prototype, the way `installNonReflectingProps`
303
- * does) would be shadowed by that accessor and would also sit in front of the harvest —
304
- * the same class of defect `define-upgrade-ordering.test.tsx` pins for attributes.
305
- */
306
- function installFlagReadBack(element: HTMLElement, name: string, attribute: string): void {
307
- const inner = Object.getOwnPropertyDescriptor(element, name);
308
- if (!inner?.get || !inner.set) {
309
- // Reached only if `name` is not a declared prop of this element — a typo, or a
310
- // facade reflecting something it never declared. Warn rather than no-op silently;
311
- // a silent skip here would look exactly like a working read-back.
312
- console.warn(
313
- `reflectFlag("${name}"): no such declared prop on <${element.localName}> — ` +
314
- `the attribute will still reflect, but the property will not read back.`,
315
- );
316
- return;
317
- }
318
- const { get, set } = inner;
319
- if ((set as { [FLAG_READ_BACK]?: true })[FLAG_READ_BACK]) return;
320
-
321
- const wrapped = function (this: HTMLElement, value: unknown) {
322
- set.call(this, resolveFlag(this, value, attribute));
323
- } as ((value: unknown) => void) & { [FLAG_READ_BACK]?: true };
324
- wrapped[FLAG_READ_BACK] = true;
325
-
326
- Object.defineProperty(element, name, {
327
- get,
328
- set: wrapped,
329
- enumerable: inner.enumerable ?? true,
330
- configurable: true,
331
- });
332
-
333
- // Seed, but ONLY upwards. The value sitting in the prop store right now may already
334
- // be the broken one: `<el loading>` parses to `undefined` in `initializeProps`
335
- // exactly as it does in the write-back, so without this the bare-attribute case
336
- // would still read back `undefined` until something else wrote to the prop.
337
- //
338
- // WHY NOT SEED `false` TOO. Writing `false` over an `undefined` would look tidier
339
- // and is wrong: for props declared with an `undefined` default, `undefined` MEANS
340
- // "the consumer has not set this", and at least one caller depends on telling that
341
- // apart from an explicit `false` — `wireDisclosure` seeds from `defaultOpen` only
342
- // while `open` is unset, so a blanket `false` seed would clobber
343
- // `<el default-open>` on every mount. Promoting only a present attribute to `true`
344
- // fixes the read-back without inventing an opinion the author never expressed.
345
- const current = get.call(element);
346
- if (typeof current !== 'boolean' && resolveFlag(element, current, attribute)) {
347
- wrapped.call(element, true);
348
- }
349
- }
350
-
351
- /** Underlying flag resolution; see `WebComponentContext.flag`. */
352
- function resolveFlag(element: HTMLElement, value: unknown, attribute: string): boolean {
353
- if (value === true) return true;
354
- // An explicit JS false wins over a present attribute (see WebComponentContext.flag); this also prevents a feedback loop when an effect writes the attribute it reads.
355
- if (value === false) return false;
356
- return element.hasAttribute(attribute) && element.getAttribute(attribute) !== 'false';
357
- }
358
-
359
- type FacadeComponent<P, E> = (props: P, ctx: WebComponentContext<E>) => JSX.Element;
360
-
361
- /**
362
- * Register a Solid facade as a Shadow-DOM custom element.
363
- *
364
- * - Renders into the element's shadow root (solid-element's default), with the
365
- * compiled kit CSS injected via a `<style>` so Tailwind classes apply inside.
366
- * - Creates a portal mount node inside the shadow root and provides it through
367
- * `ChatConfig` so the kit's overlays stay inside the shadow root.
368
- * - Gives the facade a `dispatch(type, detail)` helper that fires non-bubbling,
369
- * non-composed CustomEvents off the host element (consumers listen directly on
370
- * the element, so bubbling/composed would only cause consumer collisions).
371
- * - Idempotent: redefining an already-registered tag is a no-op.
372
- */
373
- export function defineWebComponent<P extends Record<string, unknown>, E = Record<string, unknown>>(
374
- tag: string,
375
- propDefaults: P,
376
- Facade: FacadeComponent<P, E>,
377
- ): void {
378
- // SSR-safe: skip registration when the Custom Elements API is not available
379
- // (Node.js / edge runtimes during SSR/prerender). Importing this module in a
380
- // server context will silently no-op rather than throwing "customElements is
381
- // not defined" or "window is not defined". The element registers on the client
382
- // when the browser loads the bundle.
383
- if (typeof customElements === 'undefined') return;
384
- if (customElements.get(tag)) return;
385
-
386
- // Guard against prop names that collide with global reflected HTMLElement IDL
387
- // attributes. component-register sets `this[prop] = undefined` in the element
388
- // constructor; for these, the native setter coerces undefined → "undefined"
389
- // and reflects it to an attribute — which is illegal in a CE constructor and
390
- // throws a cryptic "result must not have attributes". Fail loud and early with
391
- // a name + fix instead. (Use a prefixed attribute, e.g. `bar-title`/`headline`.)
392
- const RESERVED = ['title', 'id', 'slot', 'lang'];
393
- for (const key of Object.keys(propDefaults)) {
394
- if (RESERVED.includes(key)) {
395
- throw new Error(
396
- `defineWebComponent(${tag}): prop "${key}" collides with a global HTMLElement ` +
397
- `attribute and will break the element constructor. Rename it (e.g. ` +
398
- `"bar-title" → barTitle, a source title → headline).`,
399
- );
400
- }
401
- }
402
-
403
- // Every element gets a `theme` property/attribute. It drives a `.dark` class on
404
- // an inner wrapper, which the injected kit CSS already styles — so dark mode
405
- // works in standalone Shadow-DOM usage with no token duplication.
406
- //
407
- // The `as` annotation is load-bearing, not decoration: scripts/gen-element-api.mjs
408
- // reads THIS object literal to learn which props every element gets for free, and
409
- // takes each one's type and doc comment off the checker. Without it the inferred
410
- // type is the literal `"auto"`. Add a universal prop here and it appears in
411
- // element-meta.json, the generated .d.ts, custom-elements.json and llms-full.txt
412
- // for all 79 elements, with no second list to update.
413
- const defaults = {
414
- /** Color mode (`auto` follows prefers-color-scheme). */
415
- theme: 'auto' as 'light' | 'dark' | 'auto',
416
- ...propDefaults,
417
- };
418
-
419
- // Props that NAME a reflected global IDL accessor (today, across all 80 elements:
420
- // `role` on kai-message, `hidden` on kai-resizable-item, `autofocus` on
421
- // kai-confirm). Unlike RESERVED (which throws), these are legitimate domain props
422
- // — `role` is the SPEAKER, `hidden` and `autofocus` mean what they say — and they
423
- // stay usable, but the native accessor must not be the one that receives them.
424
- // See defineWithNonReflectingProps for what the native setter does to the author's
425
- // markup if it is, and why the shadowing has to be in place before the registry
426
- // sees the class. RESERVED names never get here; they already threw above.
427
- const shadowedProps = Object.keys(defaults).filter((key) => reflectedGlobalPropNames().has(key));
428
-
429
- const renderFacade = (props: typeof defaults, options: { element: object }) => {
430
- const element = options.element as HTMLElement;
431
- let portalNode!: HTMLDivElement;
432
-
433
- const dispatch = ((type: string, detail?: unknown) =>
434
- element.dispatchEvent(
435
- new CustomEvent(type, { detail, bubbles: false, composed: false }),
436
- )) as WebComponentContext<E>['dispatch'];
437
-
438
- // Reads `props[name]` (reactive) and falls back to attribute presence so
439
- // bare boolean attributes behave like normal HTML. See WebComponentContext.
440
- const flag = (name: string) =>
441
- resolveFlag(element, (props as Record<string, unknown>)[name], toAttr(name));
442
-
443
- // Reflect a boolean prop to its attribute and keep the property readable. See
444
- // WebComponentContext.reflectFlag for the defect this exists to close.
445
- const reflectFlag: WebComponentContext<E>['reflectFlag'] = (name, source) => {
446
- const attribute = toAttr(name);
447
- installFlagReadBack(element, name, attribute);
448
- createEffect(() => {
449
- const on = source ? source() : flag(name);
450
- // `undefined` means the caller's source is not ready yet (a controller a
451
- // primitive has not handed up). Leave the author's attribute alone rather
452
- // than writing a guessed OFF over it.
453
- if (on === undefined) return;
454
- element.toggleAttribute(attribute, on);
455
- });
456
- };
457
-
458
- // Attach imperative methods onto the host instance. See WebComponentContext.expose.
459
- // Uses defineProperty so a method can shadow an inherited getter-only accessor
460
- // (e.g. `focus`/`blur`) which a plain assignment would throw on. A method name
461
- // must NOT collide with a declared prop (the prop's accessor would be clobbered)
462
- // — pick a distinct verb (e.g. `send()` next to a `submit` prop). Failures warn
463
- // and skip rather than breaking the element's render.
464
- const expose: WebComponentContext<E>['expose'] = (methods) => {
465
- for (const [name, fn] of Object.entries(methods)) {
466
- try {
467
- Object.defineProperty(element, name, { value: fn, writable: true, configurable: true });
468
- } catch (err) {
469
- console.warn(`defineWebComponent(${tag}): could not expose method "${name}"`, err);
470
- }
471
- }
472
- };
473
-
474
- const isDark = createDarkMode(() => props.theme as string | undefined);
475
-
476
- // Prefer a single shared stylesheet adopted into this shadow root; only emit
477
- // an inline <style> when Constructable Stylesheets aren't supported.
478
- //
479
- // Adopt SYNCHRONOUSLY, before solid-element inserts the rendered content into
480
- // the shadow root. component-register attaches the shadow root lazily on first
481
- // `renderRoot` access — which happens during that insert, AFTER this facade
482
- // function returns. So we pre-attach the shadow root here (with the same
483
- // `mode: 'open'` the renderRoot getter would use, making it a no-op for
484
- // solid-element) and adopt the sheet now. If we deferred to onMount instead,
485
- // the content would paint UNSTYLED and then animate from that bare state to
486
- // its resting style once the sheet landed — every `transition-colors` button
487
- // and menu/dropdown trigger flashing as if hovered-then-un-hovered on first
488
- // render. Adopting first means the very first computed style of every node is
489
- // already the resting style, so no transition can fire on load.
490
- const sheet = getSharedSheet();
491
- if (sheet) {
492
- const root = element.shadowRoot ?? element.attachShadow({ mode: 'open' });
493
- if ('adoptedStyleSheets' in root && !root.adoptedStyleSheets.includes(sheet)) {
494
- root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
495
- }
496
- }
497
-
498
- return (
499
- <>
500
- <Show when={!sheet}>
501
- <style>{ELEMENT_CSS}</style>
502
- </Show>
503
- {/* display:contents — no layout box; carries the .dark token scope and
504
- re-roots the inherited `color` to the active mode's foreground, so text
505
- without an explicit color class (e.g. attachment filename labels) follows
506
- light/dark instead of inheriting the host page's color. */}
507
- <div classList={{ dark: isDark() }} style={{ display: 'contents', color: 'var(--color-foreground)' }}>
508
- <div ref={portalNode} />
509
- <ChatConfig portalMount={portalNode}>
510
- {Facade(props as unknown as P, {
511
- element,
512
- dispatch,
513
- flag,
514
- reflectFlag,
515
- expose,
516
- dark: isDark,
517
- })}
518
- </ChatConfig>
519
- </div>
520
- </>
521
- );
522
- };
523
-
524
- // Element-layer diagnostics: report the three `kai-` contract violations that
525
- // are otherwise silent (an array or object prop set as an HTML attribute, the
526
- // same array reference handed back, a new array of the same item objects).
527
- //
528
- // HERE because this function is the single choke point — every kai-* element
529
- // registers through it, which `elements/slots.test.ts` already enforces — so
530
- // one call covers every element with no per-element work and no second list.
531
- //
532
- // Through the pre-define seam, not after the fact, because the registry
533
- // snapshots lifecycle callbacks at definition time; see `alsoPatch` above.
534
- // `elementDiagnosticsWanted` is asked first so a tag with no non-scalar prop
535
- // (37 of the 80) does not even pay for the registry interception.
536
- const wantsDiagnostics = elementDiagnosticsWanted(tag);
537
-
538
- const { result: Ctor, handled } = defineWithNonReflectingProps(
539
- tag,
540
- shadowedProps,
541
- () => customElement(tag, defaults, renderFacade),
542
- wantsDiagnostics ? (proto) => installElementDiagnostics(tag, proto) : undefined,
543
- );
544
-
545
- // Belt and braces for the one path the wrap cannot see: if `customElements.define`
546
- // was never reached for this tag (a registry that defines lazily, or a future
547
- // solid-element that stops calling it synchronously), install on the returned class
548
- // instead. That is the OLD, too-late timing — it still protects every element
549
- // constructed from here on, it just cannot rescue an already-upgraded one. Skipped
550
- // in the normal case, where the accessors are already on this same prototype.
551
- const proto = (Ctor as unknown as { prototype?: object } | undefined)?.prototype;
552
- if (!handled && proto) installNonReflectingProps(proto, shadowedProps);
553
-
554
- // NOTE the diagnostics have no equivalent late fallback, and must not get one.
555
- // The non-reflecting props still work when installed late (they only have to
556
- // beat the NEXT constructor); the diagnostics do not, because the registry has
557
- // already snapshotted the lifecycle callbacks it will invoke. Installing them
558
- // here would produce a wrapper that is visibly present and never called —
559
- // which is worse than not installing it, since it would read as coverage. So
560
- // in the one environment the pre-define seam cannot reach (a frozen registry:
561
- // SES lockdown, a sealed polyfill), element diagnostics are simply absent, and
562
- // every other element behaviour is unaffected.
563
- }