@kitn.ai/ui 0.20.1 → 0.22.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 (510) hide show
  1. package/README.md +44 -45
  2. package/dist/components/artifact-card.d.ts +51 -0
  3. package/dist/components/artifact.d.ts +1 -1
  4. package/dist/components/attachments.d.ts +2 -2
  5. package/dist/components/audio-visualizer/index.d.ts +3 -3
  6. package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
  7. package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
  8. package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
  9. package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
  10. package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
  11. package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
  12. package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
  13. package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
  14. package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
  15. package/dist/components/card-fallback.d.ts +12 -2
  16. package/dist/components/card-renderer.d.ts +63 -2
  17. package/dist/components/chat-container.d.ts +3 -0
  18. package/dist/components/chat-scope-picker.d.ts +2 -2
  19. package/dist/components/chat-thread.d.ts +77 -18
  20. package/dist/components/choice-card.d.ts +3 -28
  21. package/dist/components/composer-dom.d.ts +1 -1
  22. package/dist/components/composer-highlight.d.ts +1 -1
  23. package/dist/components/composer-history.d.ts +1 -1
  24. package/dist/components/composer.d.ts +1 -1
  25. package/dist/components/confirm-card.d.ts +3 -18
  26. package/dist/components/context.d.ts +8 -4
  27. package/dist/components/conversation-item.d.ts +1 -1
  28. package/dist/components/conversation-list.d.ts +4 -3
  29. package/dist/components/embed.d.ts +3 -3
  30. package/dist/components/file-tree.d.ts +11 -22
  31. package/dist/components/form-widgets.d.ts +1 -1
  32. package/dist/components/form.d.ts +3 -44
  33. package/dist/components/link-preview.d.ts +3 -3
  34. package/dist/components/loader.d.ts +30 -48
  35. package/dist/components/message-skills.d.ts +4 -0
  36. package/dist/components/message.d.ts +84 -21
  37. package/dist/components/model-switcher.d.ts +2 -2
  38. package/dist/components/prompt-input.d.ts +2 -2
  39. package/dist/components/response-compare-types.d.ts +11 -2
  40. package/dist/components/response-compare.d.ts +3 -3
  41. package/dist/components/source.d.ts +12 -3
  42. package/dist/components/tasks-card.d.ts +3 -31
  43. package/dist/components/thread.d.ts +17 -5
  44. package/dist/components/toast.d.ts +2 -2
  45. package/dist/components/tool-classify.d.ts +8 -0
  46. package/dist/components/tool-types.d.ts +29 -1
  47. package/dist/components/tool.d.ts +3 -3
  48. package/dist/components/use-card-resolution.d.ts +1 -1
  49. package/dist/create-tween-COnPwAQN.js +338 -0
  50. package/dist/create-tween-DmTUaXWE.js +341 -0
  51. package/dist/create-tween-qs-jjvNA.js +7 -0
  52. package/dist/custom-elements.json +1726 -463
  53. package/dist/elements/agent-card.js +1 -1
  54. package/dist/elements/artifact.js +1 -1
  55. package/dist/elements/attachments.js +1 -1
  56. package/dist/elements/audio-visualizer.js +1 -1
  57. package/dist/elements/avatar.js +1 -1
  58. package/dist/elements/badge.js +1 -1
  59. package/dist/elements/button.js +1 -1
  60. package/dist/elements/card.js +1 -1
  61. package/dist/elements/cards.js +1 -1
  62. package/dist/elements/chain-of-thought.js +1 -1
  63. package/dist/elements/chat-scope-picker.js +1 -1
  64. package/dist/elements/chat-types.d.ts +70 -10
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkpoint.js +1 -1
  68. package/dist/elements/choice.js +1 -1
  69. package/dist/elements/chunks/{Icon-Tj58ES_d.js → Icon-CHG5z5L7.js} +1 -1
  70. package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-BAtCEEgg.js} +1 -1
  71. package/dist/elements/chunks/arrow-left-CFPTeL1Y.js +1 -0
  72. package/dist/elements/chunks/artifact-fBZOE4SO.js +1 -0
  73. package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-DpYMe5VQ.js} +1 -1
  74. package/dist/elements/chunks/audio-visualizer-DFwzAcuL.js +1 -0
  75. package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-D6zodm6E.js} +1 -1
  76. package/dist/elements/chunks/{button-ZWNif3--.js → button-C42vrGvO.js} +1 -1
  77. package/dist/elements/chunks/card-renderer-DMZsSuvU.js +1 -0
  78. package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
  79. package/dist/elements/chunks/chat-thread-CNNEhol-.js +1 -0
  80. package/dist/elements/chunks/check-7Q3K-iXE.js +1 -0
  81. package/dist/elements/chunks/chevron-down-CpNYLn7E.js +1 -0
  82. package/dist/elements/chunks/chevron-right-DrH85Fha.js +1 -0
  83. package/dist/elements/chunks/choice-card-YoWjpsFV.js +1 -0
  84. package/dist/elements/chunks/circle-C9KRjKYv.js +1 -0
  85. package/dist/elements/chunks/circle-check-Dmi7Y4zw.js +1 -0
  86. package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-QIxXda6k.js} +1 -1
  87. package/dist/elements/chunks/code-block-CqeugReY.js +1 -0
  88. package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-sTv-_5lF.js} +1 -1
  89. package/dist/elements/chunks/{composer-BguS0QL_.js → composer-ldQyeVEB.js} +2 -2
  90. package/dist/elements/chunks/confirm-card-C0RNOwfn.js +1 -0
  91. package/dist/elements/chunks/context-5qgypNHC.js +1 -0
  92. package/dist/elements/chunks/conversation-list-DLzOacXz.js +1 -0
  93. package/dist/elements/chunks/create-tween-V4TXZ93X.js +7 -0
  94. package/dist/elements/chunks/default-input-DeeRSDHc.js +1 -0
  95. package/dist/elements/chunks/define-lE-QvQFn.js +1 -0
  96. package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DZSa9jog.js} +1 -1
  97. package/dist/elements/chunks/{download-Dsbg3ste.js → download-B2ZmnGqW.js} +1 -1
  98. package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-R3B7cSRE.js} +1 -1
  99. package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BmxceY4l.js} +1 -1
  100. package/dist/elements/chunks/embed-BVrtTZPo.js +1 -0
  101. package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-BbdR7YO7.js} +1 -1
  102. package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-D7dijo1A.js} +1 -1
  103. package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-0upJ5jeb.js} +1 -1
  104. package/dist/elements/chunks/{folder-glP5rha4.js → folder-D8z58t7B.js} +1 -1
  105. package/dist/elements/chunks/form-p5BKJNw5.js +1 -0
  106. package/dist/elements/chunks/hover-card-CN9s2md5.js +1 -0
  107. package/dist/elements/chunks/{icon-BLb8beoi.js → icon-CNiKP37E.js} +1 -1
  108. package/dist/elements/chunks/{info-CIsv92JK.js → info-BSnuJiHI.js} +1 -1
  109. package/dist/elements/chunks/{input-Dds1kFyt.js → input-BauDmzxX.js} +1 -1
  110. package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-BlHJaP9b.js} +1 -1
  111. package/dist/elements/chunks/{link-i4r_k7z4.js → link-DEi5iUWC.js} +1 -1
  112. package/dist/elements/chunks/link-preview-BaHyM6W4.js +1 -0
  113. package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-CmJG_Fkq.js} +1 -1
  114. package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-D2jaMpCN.js} +1 -1
  115. package/dist/elements/chunks/message-C5UfXZ2Z.js +1 -0
  116. package/dist/elements/chunks/message-CXWLmmLn.js +1 -0
  117. package/dist/elements/chunks/message-square-hXylwsy0.js +1 -0
  118. package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-C9ytZFMU.js} +1 -1
  119. package/dist/elements/chunks/model-switcher-CivGfD7-.js +1 -0
  120. package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-DJL_sbOm.js} +1 -1
  121. package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CFaB8naM.js} +1 -1
  122. package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-Br5SksfR.js} +1 -1
  123. package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-CMIvtAhU.js} +1 -1
  124. package/dist/elements/chunks/reasoning-DpZcNzLq.js +1 -0
  125. package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-Q8i3T9a_.js} +1 -1
  126. package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-B5IHCBFV.js} +1 -1
  127. package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-eLeydBje.js} +1 -1
  128. package/dist/elements/chunks/scroll-button-DWbz0yA1.js +1 -0
  129. package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-Xic78AD_.js} +1 -1
  130. package/dist/elements/chunks/{settings-B8lmec4D.js → settings-B8H51pAx.js} +1 -1
  131. package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-CsG9eYLe.js} +1 -1
  132. package/dist/elements/chunks/{share-C3lTiYGt.js → share-CNTx0z__.js} +1 -1
  133. package/dist/elements/chunks/skeleton-CLlHTcMI.js +1 -0
  134. package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
  135. package/dist/elements/chunks/source-BoVcU5ok.js +1 -0
  136. package/dist/elements/chunks/{star-CSJtGxgv.js → star-CxQVTVhI.js} +1 -1
  137. package/dist/elements/chunks/{store-CHyW95TP.js → store-CLtS5CUG.js} +1 -1
  138. package/dist/elements/chunks/tasks-card-CzlkLmUt.js +1 -0
  139. package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D5NhpIQ1.js} +1 -1
  140. package/dist/elements/chunks/textarea-x5Uxsmtm.js +1 -0
  141. package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-UobcJnx9.js} +1 -1
  142. package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-BOfs9eXq.js} +1 -1
  143. package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-Be6Dh_dt.js} +1 -1
  144. package/dist/elements/chunks/tooltip-RxMxyCLF.js +1 -0
  145. package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C4yxH2XN.js} +1 -1
  146. package/dist/elements/chunks/use-card-resolution-jva9ehH6.js +1 -0
  147. package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Dx4VRcjS.js} +2 -2
  148. package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-Y1ZTWgEa.js} +1 -1
  149. package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-B9gml9Cg.js} +2 -2
  150. package/dist/elements/chunks/{video-B7vmenoC.js → video-CrPHsytT.js} +1 -1
  151. package/dist/elements/chunks/x-_-OPHept.js +1 -0
  152. package/dist/elements/coachmark.js +1 -1
  153. package/dist/elements/code-block.js +1 -1
  154. package/dist/elements/command.js +1 -1
  155. package/dist/elements/compare.js +1 -1
  156. package/dist/elements/composer.js +1 -1
  157. package/dist/elements/confirm-card.js +1 -1
  158. package/dist/elements/context-meter.js +1 -1
  159. package/dist/elements/conversation-list.js +1 -1
  160. package/dist/elements/default-input.d.ts +34 -7
  161. package/dist/elements/define.d.ts +1 -0
  162. package/dist/elements/dialog.js +1 -1
  163. package/dist/elements/disclosure.d.ts +1 -1
  164. package/dist/elements/editable-label.js +1 -1
  165. package/dist/elements/element-data-types.d.ts +107 -0
  166. package/dist/elements/embed.js +1 -1
  167. package/dist/elements/empty.js +1 -1
  168. package/dist/elements/feedback-bar.js +1 -1
  169. package/dist/elements/file-tree.js +1 -1
  170. package/dist/elements/file-upload.js +1 -1
  171. package/dist/elements/form.js +1 -1
  172. package/dist/elements/hover-card.js +1 -1
  173. package/dist/elements/icon.js +1 -1
  174. package/dist/elements/image.js +1 -1
  175. package/dist/elements/input.js +1 -1
  176. package/dist/elements/kbd.js +1 -1
  177. package/dist/elements/link-preview.js +1 -1
  178. package/dist/elements/loader.js +1 -1
  179. package/dist/elements/markdown.js +1 -1
  180. package/dist/elements/menu.js +1 -1
  181. package/dist/elements/message-skills.js +1 -1
  182. package/dist/elements/message.js +1 -1
  183. package/dist/elements/model-switcher.js +1 -1
  184. package/dist/elements/nav.js +1 -1
  185. package/dist/elements/notice.js +1 -1
  186. package/dist/elements/pane-group.js +1 -1
  187. package/dist/elements/pane.js +1 -1
  188. package/dist/elements/popover.js +1 -1
  189. package/dist/elements/progress-bar.js +1 -1
  190. package/dist/elements/prompt-dock.js +1 -1
  191. package/dist/elements/prompt-input.js +1 -1
  192. package/dist/elements/prompt-suggestions.js +1 -1
  193. package/dist/elements/reasoning.js +1 -1
  194. package/dist/elements/register.d.ts +8 -6
  195. package/dist/elements/remote.js +1 -1
  196. package/dist/elements/resizable.js +1 -1
  197. package/dist/elements/response-stream.js +1 -1
  198. package/dist/elements/screen.js +1 -1
  199. package/dist/elements/scroll-area.js +1 -1
  200. package/dist/elements/scroll-button.js +1 -1
  201. package/dist/elements/search.js +1 -1
  202. package/dist/elements/segmented.js +1 -1
  203. package/dist/elements/separator.js +1 -1
  204. package/dist/elements/setting-item.js +1 -1
  205. package/dist/elements/settings-group.js +1 -1
  206. package/dist/elements/skeleton.js +1 -1
  207. package/dist/elements/slot-text.d.ts +51 -0
  208. package/dist/elements/slots.d.ts +21 -0
  209. package/dist/elements/source.js +1 -1
  210. package/dist/elements/status.js +1 -1
  211. package/dist/elements/switch.js +1 -1
  212. package/dist/elements/tabs.js +1 -1
  213. package/dist/elements/tasks.js +1 -1
  214. package/dist/elements/text-shimmer.js +1 -1
  215. package/dist/elements/thinking-bar.js +1 -1
  216. package/dist/elements/thread.js +1 -1
  217. package/dist/elements/toast.js +1 -1
  218. package/dist/elements/tool.js +1 -1
  219. package/dist/elements/tooltip.js +1 -1
  220. package/dist/elements/validate-messages.d.ts +25 -0
  221. package/dist/elements/voice-input.js +1 -1
  222. package/dist/elements/voice-output.js +1 -1
  223. package/dist/elements.d.ts +2734 -217
  224. package/dist/index.d.ts +163 -125
  225. package/dist/index.js +6572 -5990
  226. package/dist/index.server.d.ts +5 -0
  227. package/dist/index.server.js +5403 -4860
  228. package/dist/kai-provider.es.d.ts +5 -0
  229. package/dist/kai-provider.es.js +79 -77
  230. package/dist/kai.es.d.ts +5 -0
  231. package/dist/kai.es.js +1 -1
  232. package/dist/llms/llms-full.txt +774 -151
  233. package/dist/llms/llms.txt +57 -5
  234. package/dist/mcp.es.js +4756 -782
  235. package/dist/primitives/card-component-types.d.ts +11 -0
  236. package/dist/primitives/card-data-types.d.ts +196 -0
  237. package/dist/primitives/card-host.d.ts +1 -1
  238. package/dist/primitives/card-recovery.d.ts +3 -3
  239. package/dist/primitives/card-registry.d.ts +4 -14
  240. package/dist/primitives/card-resolution.d.ts +1 -1
  241. package/dist/primitives/card-routing.d.ts +1 -1
  242. package/dist/primitives/card-tags.d.ts +11 -0
  243. package/dist/primitives/card-validate-cards.d.ts +57 -0
  244. package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
  245. package/dist/primitives/card-validate-schemas.d.ts +17 -0
  246. package/dist/primitives/card-validate.d.ts +24 -0
  247. package/dist/primitives/create-kai-chat.d.ts +3 -3
  248. package/dist/primitives/embed-providers.d.ts +1 -1
  249. package/dist/primitives/link-preview.d.ts +1 -1
  250. package/dist/primitives/message-feedback.d.ts +2 -2
  251. package/dist/primitives/toast-store.d.ts +1 -1
  252. package/dist/react/index.d.ts +730 -302
  253. package/dist/react/use-kai-chat.d.ts +8 -4
  254. package/dist/react.d.ts +5 -0
  255. package/dist/react.js +418 -317
  256. package/dist/register-impl-AxIlqjo7.js +145 -0
  257. package/dist/remote/host-embed.d.ts +1 -1
  258. package/dist/remote/index.d.ts +2 -2
  259. package/dist/remote/provider-runtime.d.ts +2 -2
  260. package/dist/remote/provider.d.ts +2 -2
  261. package/dist/remote/validate.d.ts +1 -1
  262. package/dist/remote/wire.d.ts +1 -1
  263. package/dist/schemas/artifact.schema.json +92 -0
  264. package/dist/schemas/embed.schema.json +0 -2
  265. package/dist/schemas/from-tool-call.d.ts +48 -0
  266. package/dist/schemas/index.d.ts +48 -0
  267. package/dist/schemas/link.schema.json +0 -2
  268. package/dist/schemas/provider-subsets.d.ts +136 -0
  269. package/dist/schemas/registry.d.ts +140 -0
  270. package/dist/schemas/tool-defs.d.ts +121 -0
  271. package/dist/schemas.d.ts +5 -0
  272. package/dist/schemas.js +717 -0
  273. package/dist/solid-BGYSJyHG.js +22960 -0
  274. package/dist/solid-Dt2nEwfl.js +20194 -0
  275. package/dist/solid.d.ts +66 -0
  276. package/dist/solid.js +261 -0
  277. package/dist/solid.server.d.ts +5 -0
  278. package/dist/solid.server.js +261 -0
  279. package/dist/state/index.d.ts +14 -4
  280. package/dist/state/messages.d.ts +8 -3
  281. package/dist/state/mock.d.ts +46 -0
  282. package/dist/state/parts.d.ts +85 -0
  283. package/dist/state/stream.d.ts +15 -9
  284. package/dist/state.d.ts +5 -0
  285. package/dist/state.js +253 -84
  286. package/dist/ui/action-icons.d.ts +1 -1
  287. package/dist/ui/collapsible.d.ts +11 -6
  288. package/dist/ui/dropdown.d.ts +47 -42
  289. package/dist/ui/pane-group.d.ts +1 -1
  290. package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-B44X69AG.js} +1 -1
  291. package/dist/variant-aurora-BRhV8Flk.js +391 -0
  292. package/dist/variant-aurora-Ds5ou9BH.js +381 -0
  293. package/dist/variant-custom-B20FhtYj.js +170 -0
  294. package/dist/{variant-custom-Dif-IV4u.js → variant-custom-BvA1Schl.js} +1 -1
  295. package/dist/variant-custom-D6Rtvneb.js +200 -0
  296. package/dist/{variant-wave-DbfNdvSi.js → variant-wave-BUQtkryq.js} +1 -1
  297. package/dist/variant-wave-BVYnqy9L.js +218 -0
  298. package/dist/variant-wave-DXC6_LcH.js +208 -0
  299. package/dist/wire/chunk.d.ts +171 -0
  300. package/dist/wire/consume.d.ts +26 -0
  301. package/dist/wire/encode.d.ts +221 -0
  302. package/dist/wire/files.d.ts +116 -0
  303. package/dist/wire/formats/anthropic.d.ts +2 -0
  304. package/dist/wire/formats/openai.d.ts +5 -0
  305. package/dist/wire/index.d.ts +16 -0
  306. package/dist/wire/media-types.d.ts +106 -0
  307. package/dist/wire/read.d.ts +26 -0
  308. package/dist/wire/sink-helpers.d.ts +21 -0
  309. package/dist/wire/sse.d.ts +33 -0
  310. package/dist/wire.d.ts +5 -53
  311. package/dist/wire.js +1126 -0
  312. package/frameworks/react/index.tsx +191 -158
  313. package/frameworks/react/runtime.tsx +21 -1
  314. package/frameworks/react/use-kai-chat.tsx +11 -1
  315. package/llms-full.txt +774 -151
  316. package/llms.txt +57 -5
  317. package/package.json +62 -8
  318. package/src/agent-tooling/archetypes.ts +127 -0
  319. package/src/agent-tooling/integrations/anthropic.ts +436 -0
  320. package/src/agent-tooling/integrations/cloudflare.ts +141 -52
  321. package/src/agent-tooling/integrations/langgraph.ts +80 -13
  322. package/src/agent-tooling/integrations/mastra.ts +161 -12
  323. package/src/agent-tooling/integrations/mock.ts +47 -8
  324. package/src/agent-tooling/integrations/ollama.ts +68 -24
  325. package/src/agent-tooling/integrations/openai.ts +89 -0
  326. package/src/agent-tooling/integrations/openrouter.ts +58 -8
  327. package/src/agent-tooling/integrations/pi.ts +104 -23
  328. package/src/agent-tooling/integrations/pydantic-ai.ts +61 -5
  329. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +120 -13
  330. package/src/agent-tooling/mcp/manifest.ts +206 -25
  331. package/src/agent-tooling/mcp/tools/debug.ts +13 -7
  332. package/src/agent-tooling/mcp/tools/reference.ts +285 -6
  333. package/src/agent-tooling/mcp/tools/scaffold.ts +4152 -661
  334. package/src/agent-tooling/registry.ts +74 -0
  335. package/src/agent-tooling/types.ts +361 -1
  336. package/src/components/artifact-card.tsx +120 -0
  337. package/src/components/audio-visualizer/index.tsx +9 -0
  338. package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
  339. package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
  340. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
  341. package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
  342. package/src/components/card-fallback.tsx +42 -10
  343. package/src/components/card-renderer.tsx +146 -9
  344. package/src/components/chat-container.tsx +4 -0
  345. package/src/components/chat-thread.tsx +128 -52
  346. package/src/components/choice-card.tsx +17 -29
  347. package/src/components/composer.tsx +12 -2
  348. package/src/components/confirm-card.tsx +24 -20
  349. package/src/components/context.tsx +30 -16
  350. package/src/components/conversation-item.tsx +6 -0
  351. package/src/components/conversation-list.tsx +18 -2
  352. package/src/components/file-tree.tsx +11 -22
  353. package/src/components/file-upload.tsx +14 -8
  354. package/src/components/form.tsx +14 -47
  355. package/src/components/loader.tsx +39 -12
  356. package/src/components/message-skills.tsx +4 -0
  357. package/src/components/message.tsx +294 -46
  358. package/src/components/model-switcher.tsx +38 -8
  359. package/src/components/reasoning.tsx +92 -5
  360. package/src/components/response-compare-types.ts +25 -0
  361. package/src/components/response-compare.tsx +4 -9
  362. package/src/components/source.tsx +50 -24
  363. package/src/components/tasks-card.tsx +10 -33
  364. package/src/components/thread.tsx +84 -42
  365. package/src/components/toast.tsx +17 -6
  366. package/src/components/tool-classify.ts +26 -0
  367. package/src/components/tool-types.ts +31 -1
  368. package/src/elements/agent-card.tsx +11 -11
  369. package/src/elements/artifact.tsx +15 -7
  370. package/src/elements/attachments.tsx +6 -4
  371. package/src/elements/avatar.tsx +1 -1
  372. package/src/elements/button.tsx +29 -6
  373. package/src/elements/card.tsx +2 -2
  374. package/src/elements/cards.tsx +109 -14
  375. package/src/elements/chain-of-thought.tsx +14 -10
  376. package/src/elements/chat-scope-picker.tsx +9 -7
  377. package/src/elements/chat-types.ts +59 -6
  378. package/src/elements/chat-workspace.tsx +50 -9
  379. package/src/elements/chat.tsx +90 -3
  380. package/src/elements/choice.tsx +8 -8
  381. package/src/elements/coachmark.tsx +1 -1
  382. package/src/elements/command.tsx +8 -23
  383. package/src/elements/compare.tsx +7 -6
  384. package/src/elements/compiled.css +1 -1
  385. package/src/elements/composer.tsx +8 -8
  386. package/src/elements/confirm-card.tsx +9 -9
  387. package/src/elements/context-meter.tsx +4 -18
  388. package/src/elements/conversation-list.tsx +14 -9
  389. package/src/elements/default-input.tsx +131 -8
  390. package/src/elements/define.tsx +178 -43
  391. package/src/elements/editable-label.tsx +17 -2
  392. package/src/elements/element-data-types.ts +112 -0
  393. package/src/elements/element-meta.json +1624 -306
  394. package/src/elements/element-types.d.ts +2645 -214
  395. package/src/elements/feedback-bar.tsx +1 -1
  396. package/src/elements/file-tree.tsx +1 -1
  397. package/src/elements/file-upload.tsx +1 -1
  398. package/src/elements/form.tsx +14 -6
  399. package/src/elements/input.tsx +1 -1
  400. package/src/elements/kbd.tsx +1 -1
  401. package/src/elements/menu.tsx +40 -32
  402. package/src/elements/message-skills.tsx +7 -9
  403. package/src/elements/message.tsx +200 -32
  404. package/src/elements/model-switcher.tsx +5 -3
  405. package/src/elements/pane.tsx +1 -1
  406. package/src/elements/prompt-dock.tsx +8 -8
  407. package/src/elements/prompt-input.tsx +10 -10
  408. package/src/elements/prompt-suggestions.tsx +7 -4
  409. package/src/elements/reasoning.tsx +1 -1
  410. package/src/elements/register.ts +9 -0
  411. package/src/elements/resizable.globals.d.ts +36 -0
  412. package/src/elements/resizable.tsx +24 -13
  413. package/src/elements/response-stream.tsx +1 -1
  414. package/src/elements/scroll-button.tsx +1 -1
  415. package/src/elements/search.tsx +6 -1
  416. package/src/elements/segmented.tsx +5 -11
  417. package/src/elements/separator.tsx +1 -1
  418. package/src/elements/slot-text.ts +73 -0
  419. package/src/elements/slots.ts +67 -24
  420. package/src/elements/source.tsx +21 -22
  421. package/src/elements/switch.tsx +3 -3
  422. package/src/elements/tasks.tsx +5 -4
  423. package/src/elements/thread.tsx +36 -4
  424. package/src/elements/toast.tsx +3 -2
  425. package/src/elements/tool.tsx +1 -1
  426. package/src/elements/validate-messages.ts +76 -0
  427. package/src/elements/voice-input.tsx +7 -7
  428. package/src/elements/voice-output.tsx +4 -4
  429. package/src/index.ts +145 -6
  430. package/src/primitives/card-component-types.ts +63 -0
  431. package/src/primitives/card-data-types.ts +312 -0
  432. package/src/primitives/card-recovery.ts +13 -2
  433. package/src/primitives/card-registry.tsx +34 -23
  434. package/src/primitives/card-schemas/artifact.schema.json +92 -0
  435. package/src/primitives/card-schemas/embed.schema.json +0 -2
  436. package/src/primitives/card-schemas/link.schema.json +0 -2
  437. package/src/primitives/card-tags.ts +61 -0
  438. package/src/primitives/card-validate-cards.ts +255 -0
  439. package/src/primitives/card-validate-generator.testlib.ts +38 -0
  440. package/src/primitives/card-validate-schemas.ts +58 -0
  441. package/src/primitives/card-validate.ts +48 -20
  442. package/src/primitives/create-tween.ts +54 -2
  443. package/src/primitives/message-feedback.ts +3 -2
  444. package/src/primitives/use-audio-analysis.ts +20 -1
  445. package/src/primitives/use-sequencer.ts +20 -1
  446. package/src/schemas/from-tool-call.ts +151 -0
  447. package/src/schemas/index.ts +340 -0
  448. package/src/schemas/provider-subsets.ts +538 -0
  449. package/src/schemas/registry.ts +355 -0
  450. package/src/schemas/tool-defs.ts +492 -0
  451. package/src/solid.ts +150 -0
  452. package/src/state/index.ts +27 -1
  453. package/src/state/messages.ts +21 -4
  454. package/src/state/mock.ts +211 -0
  455. package/src/state/parts.ts +295 -0
  456. package/src/state/stream.ts +56 -58
  457. package/src/ui/collapsible.tsx +17 -5
  458. package/src/ui/dropdown.tsx +46 -12
  459. package/src/ui/overlay.tsx +10 -4
  460. package/src/wire/chunk.ts +201 -0
  461. package/src/wire/consume.ts +440 -0
  462. package/src/wire/encode.ts +689 -0
  463. package/src/wire/files.ts +342 -0
  464. package/src/wire/formats/anthropic.ts +267 -0
  465. package/src/wire/formats/openai.ts +187 -0
  466. package/src/wire/index.ts +73 -0
  467. package/src/wire/media-types.ts +344 -0
  468. package/src/wire/read.ts +152 -0
  469. package/src/wire/sink-helpers.ts +50 -0
  470. package/src/wire/sse.ts +140 -0
  471. package/dist/create-tween-hvpmSuwW.js +0 -7
  472. package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
  473. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
  474. package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
  475. package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
  476. package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
  477. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
  478. package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
  479. package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
  480. package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
  481. package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
  482. package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
  483. package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
  484. package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
  485. package/dist/elements/chunks/default-input-Cqqilg9t.js +0 -1
  486. package/dist/elements/chunks/define-D1din7Ld.js +0 -1
  487. package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
  488. package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
  489. package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
  490. package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
  491. package/dist/elements/chunks/model-switcher-B94YAKsM.js +0 -1
  492. package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
  493. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
  494. package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
  495. package/dist/elements/chunks/slots--V19HwUb.js +0 -1
  496. package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
  497. package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
  498. package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
  499. package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
  500. package/dist/host-embed.d.ts +0 -33
  501. package/dist/kai-provider.d.ts +0 -2
  502. package/dist/origin.d.ts +0 -5
  503. package/dist/provider-runtime.d.ts +0 -27
  504. package/dist/register-impl-DQyejdfb.js +0 -145
  505. package/dist/validate.d.ts +0 -4
  506. package/dist/version.d.ts +0 -4
  507. package/src/components/component-meta.json +0 -4550
  508. package/src/elements/card-media.jpg +0 -0
  509. package/src/elements/resizable.d.ts +0 -27
  510. package/src/elements/video-poster.jpg +0 -0
@@ -4,12 +4,22 @@
4
4
  "className": "KaiAgentCardElement",
5
5
  "displayName": "AgentCard",
6
6
  "props": [
7
+ {
8
+ "name": "theme",
9
+ "type": "\"light\" | \"dark\" | \"auto\"",
10
+ "optional": true,
11
+ "scalar": true,
12
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
13
+ "default": "'auto'",
14
+ "universal": true,
15
+ "displayType": "\"light\" | \"dark\" | \"auto\""
16
+ },
7
17
  {
8
18
  "name": "name",
9
19
  "type": "undefined | string",
10
20
  "optional": true,
11
21
  "scalar": true,
12
- "description": "The agent's name the primary label. Attribute: `name`.",
22
+ "description": "The agent's name, the primary label. Attribute: `name`.",
13
23
  "displayType": "undefined | string"
14
24
  },
15
25
  {
@@ -25,7 +35,7 @@
25
35
  "type": "undefined | false | true",
26
36
  "optional": true,
27
37
  "scalar": true,
28
- "description": "Raise a prominent \"Needs you\" pill plus a glowing amber edge the attention-routing signal that pulls focus to this agent. Attribute: `needs-attention`.",
38
+ "description": "Raise a prominent \"Needs you\" pill plus a glowing amber edge. This is the attention-routing signal that pulls focus to this agent. Attribute: `needs-attention`.",
29
39
  "displayType": "undefined | false | true"
30
40
  },
31
41
  {
@@ -33,7 +43,10 @@
33
43
  "type": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }",
34
44
  "optional": true,
35
45
  "scalar": false,
36
- "description": "Run status a JS PROPERTY (object), not an attribute. Shape: `{ tone, label?, pulse? }`, where `tone` is one of `working` | `idle` | `done` | `error` | `blocked` (maps to the kit's tool hues), `label` is an optional short string beside the dot, and `pulse` animates the dot. Set it with `el.status = { tone: 'working', label: 'Working', pulse: true }`.",
46
+ "description": "Run status. A JS PROPERTY (object), not an attribute. Shape: `{ tone, label?, pulse? }`, where `tone` is one of `working` | `idle` | `done` | `error` | `blocked` (maps to the kit's tool hues), `label` is an optional short string beside the dot, and `pulse` animates the dot. Set it with `el.status = { tone: 'working', label: 'Working', pulse: true }`.",
47
+ "typeName": "AgentStatus",
48
+ "typeShape": "{ tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }",
49
+ "typeImport": "AgentStatus",
37
50
  "displayType": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
38
51
  }
39
52
  ],
@@ -41,7 +54,7 @@
41
54
  {
42
55
  "name": "kai-activate",
43
56
  "detail": null,
44
- "description": "The card was activated clicked, or Enter / Space while focused. Promote this agent back to focus.",
57
+ "description": "The card was activated by a click, or by Enter / Space while focused. Promote this agent back to focus.",
45
58
  "displayDetail": null
46
59
  },
47
60
  {
@@ -78,6 +91,16 @@
78
91
  "className": "KaiArtifactElement",
79
92
  "displayName": "Artifact",
80
93
  "props": [
94
+ {
95
+ "name": "theme",
96
+ "type": "\"light\" | \"dark\" | \"auto\"",
97
+ "optional": true,
98
+ "scalar": true,
99
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
100
+ "default": "'auto'",
101
+ "universal": true,
102
+ "displayType": "\"light\" | \"dark\" | \"auto\""
103
+ },
81
104
  {
82
105
  "name": "src",
83
106
  "type": "undefined | string",
@@ -88,15 +111,15 @@
88
111
  },
89
112
  {
90
113
  "name": "files",
91
- "type": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
92
- "optional": false,
114
+ "type": "undefined | { path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
115
+ "optional": true,
93
116
  "scalar": false,
94
- "description": "Files for the Code tab tree + each file's preview `url`. Set as a JS property (array).",
95
- "typeName": "FileTreeFile[]",
117
+ "description": "Files for the Code tab tree + each file's preview `url`. Omit for a preview-only artifact (the Code tab then has nothing to show; pair it with `no-tabs` to hide the toggle). Set as a JS property (array).",
118
+ "typeName": "ArtifactCardFile[]",
96
119
  "typeShape": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
97
120
  "default": "[]",
98
- "typeImport": "FileTreeFile",
99
- "displayType": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
121
+ "typeImport": "ArtifactCardFile",
122
+ "displayType": "undefined | { path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
100
123
  },
101
124
  {
102
125
  "name": "tab",
@@ -119,7 +142,7 @@
119
142
  "type": "undefined | string",
120
143
  "optional": true,
121
144
  "scalar": true,
122
- "description": "Selected file path syncs the tree highlight, Code source, and preview.",
145
+ "description": "Selected file path. Syncs the tree highlight, Code source, and preview.",
123
146
  "displayType": "undefined | string"
124
147
  },
125
148
  {
@@ -251,6 +274,12 @@
251
274
  "description": "Artifact's own maximize button toggled (consumer-observable; non-bubbling).",
252
275
  "displayDetail": "{ maximized: false | true }"
253
276
  },
277
+ {
278
+ "name": "kai-maximize-intent",
279
+ "detail": "{ requested: false | true }",
280
+ "description": "The maximize PROTOCOL intent, raised as a raw bubbling + composed CustomEvent (not through `dispatch`) so an enclosing `<kai-resizable>` can catch it and maximize the containing panel. Declared here so it is typed and reaches the generated API. Listen for it to drive maximize from your own chrome, or re-emit it to trigger one.",
281
+ "displayDetail": "{ requested: false | true }"
282
+ },
254
283
  {
255
284
  "name": "kai-navigate",
256
285
  "detail": "{ url: string }",
@@ -293,7 +322,7 @@
293
322
  "name": "navigate",
294
323
  "params": "url: string",
295
324
  "returns": "void",
296
- "description": "Push + load a url in the preview the path-field submit path (fires kai-navigate)."
325
+ "description": "Push + load a url in the preview, the path-field submit path (fires kai-navigate)."
297
326
  },
298
327
  {
299
328
  "name": "selectFile",
@@ -305,13 +334,13 @@
305
334
  "name": "openExternal",
306
335
  "params": "",
307
336
  "returns": "void",
308
- "description": "Open the current url in a new browser tab (no-op when there's no concrete url). Named openExternal, NOT openInTab that's a prop (toolbar button visibility)."
337
+ "description": "Open the current url in a new browser tab (no-op when there's no concrete url). Named openExternal, NOT openInTab, which is a prop (toolbar button visibility)."
309
338
  },
310
339
  {
311
340
  "name": "maximize",
312
341
  "params": "",
313
342
  "returns": "void",
314
- "description": "Enter the maximized view-state (fires kai-maximize-change{maximized:true}). Named maximize, NOT maximized that's a prop."
343
+ "description": "Enter the maximized view-state (fires kai-maximize-change{maximized:true}). Named maximize, NOT maximized, which is a prop."
315
344
  },
316
345
  {
317
346
  "name": "restore",
@@ -334,17 +363,27 @@
334
363
  "className": "KaiAttachmentsElement",
335
364
  "displayName": "Attachments",
336
365
  "props": [
366
+ {
367
+ "name": "theme",
368
+ "type": "\"light\" | \"dark\" | \"auto\"",
369
+ "optional": true,
370
+ "scalar": true,
371
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
372
+ "default": "'auto'",
373
+ "universal": true,
374
+ "displayType": "\"light\" | \"dark\" | \"auto\""
375
+ },
337
376
  {
338
377
  "name": "items",
339
- "type": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
340
- "optional": false,
378
+ "type": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
379
+ "optional": true,
341
380
  "scalar": false,
342
- "description": "The attachments to render. Set as a JS property (array).",
381
+ "description": "The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array).",
343
382
  "typeName": "AttachmentData[]",
344
383
  "typeShape": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
345
384
  "default": "[]",
346
385
  "typeImport": "AttachmentData",
347
- "displayType": "AttachmentData[]"
386
+ "displayType": "AttachmentData[] | undefined"
348
387
  },
349
388
  {
350
389
  "name": "variant",
@@ -451,7 +490,7 @@
451
490
  "parts": [
452
491
  {
453
492
  "name": "preview",
454
- "doc": "The image shown in an attachment’s hover-card preview. Bounded by default (max ~320×256, aspect preserved) so a large image never blows up the card raise or lower the cap from outside.",
493
+ "doc": "The image shown in an attachment’s hover-card preview. Bounded by default (max ~320×256, aspect preserved) so a large image never blows up the card. Raise or lower the cap from outside.",
455
494
  "recipe": "kai-attachments::part(preview) { max-width: 32rem; max-height: 24rem }"
456
495
  }
457
496
  ]
@@ -461,6 +500,16 @@
461
500
  "className": "KaiAudioVisualizerElement",
462
501
  "displayName": "AudioVisualizer",
463
502
  "props": [
503
+ {
504
+ "name": "theme",
505
+ "type": "\"light\" | \"dark\" | \"auto\"",
506
+ "optional": true,
507
+ "scalar": true,
508
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
509
+ "default": "'auto'",
510
+ "universal": true,
511
+ "displayType": "\"light\" | \"dark\" | \"auto\""
512
+ },
464
513
  {
465
514
  "name": "variant",
466
515
  "type": "undefined | string",
@@ -582,6 +631,9 @@
582
631
  "optional": true,
583
632
  "scalar": false,
584
633
  "description": "Custom fragment shader for `variant=\"custom\"`. JS property only.",
634
+ "typeName": "ShaderSpec",
635
+ "typeShape": "{ fragment: string; uniforms?: undefined | Record<string, { type: \"1f\" | \"1i\" | \"1fv\" | \"2f\" | \"3f\" | \"3fv\" | \"4f\" | \"4fv\" | \"Matrix2fv\" | \"Matrix3fv\" | \"Matrix4fv\"; value: number | number[] }> }",
636
+ "typeImport": "ShaderSpec",
585
637
  "displayType": "undefined | { fragment: string; uniforms?: undefined | Record<string, { type: \"1f\" | \"1i\" | \"1fv\" | \"2f\" | \"3f\" | \"3fv\" | \"4f\" | \"4fv\" | \"Matrix2fv\" | \"Matrix3fv\" | \"Matrix4fv\"; value: number | number[] }> }"
586
638
  },
587
639
  {
@@ -631,6 +683,16 @@
631
683
  "className": "KaiAvatarElement",
632
684
  "displayName": "Avatar",
633
685
  "props": [
686
+ {
687
+ "name": "theme",
688
+ "type": "\"light\" | \"dark\" | \"auto\"",
689
+ "optional": true,
690
+ "scalar": true,
691
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
692
+ "default": "'auto'",
693
+ "universal": true,
694
+ "displayType": "\"light\" | \"dark\" | \"auto\""
695
+ },
634
696
  {
635
697
  "name": "src",
636
698
  "type": "undefined | string",
@@ -652,7 +714,7 @@
652
714
  "type": "undefined | string",
653
715
  "optional": true,
654
716
  "scalar": true,
655
- "description": "Short text shown when there's no image usually initials (e.g. \"JD\", \"AI\").",
717
+ "description": "Short text shown when there's no image, usually initials (e.g. \"JD\", \"AI\").",
656
718
  "default": "''",
657
719
  "displayType": "undefined | string"
658
720
  },
@@ -682,6 +744,16 @@
682
744
  "className": "KaiBadgeElement",
683
745
  "displayName": "Badge",
684
746
  "props": [
747
+ {
748
+ "name": "theme",
749
+ "type": "\"light\" | \"dark\" | \"auto\"",
750
+ "optional": true,
751
+ "scalar": true,
752
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
753
+ "default": "'auto'",
754
+ "universal": true,
755
+ "displayType": "\"light\" | \"dark\" | \"auto\""
756
+ },
685
757
  {
686
758
  "name": "variant",
687
759
  "type": "undefined | \"default\" | \"count\" | \"citation\"",
@@ -702,6 +774,13 @@
702
774
  }
703
775
  ],
704
776
  "tokens": [],
777
+ "slots": [
778
+ {
779
+ "name": "",
780
+ "mode": "inject",
781
+ "doc": "The badge's label: text, or a small inline icon plus text."
782
+ }
783
+ ],
705
784
  "parts": [
706
785
  {
707
786
  "name": "badge",
@@ -715,12 +794,22 @@
715
794
  "className": "KaiButtonElement",
716
795
  "displayName": "Button",
717
796
  "props": [
797
+ {
798
+ "name": "theme",
799
+ "type": "\"light\" | \"dark\" | \"auto\"",
800
+ "optional": true,
801
+ "scalar": true,
802
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
803
+ "default": "'auto'",
804
+ "universal": true,
805
+ "displayType": "\"light\" | \"dark\" | \"auto\""
806
+ },
718
807
  {
719
808
  "name": "variant",
720
809
  "type": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\"",
721
810
  "optional": true,
722
811
  "scalar": true,
723
- "description": "Visual style. `default` (filled), `subtle` (muted text, hover tint the toolbar icon look), `ghost` (transparent, hover fill), `outline`, or `destructive`. Defaults to `default`.",
812
+ "description": "Visual style. `default` (filled), `subtle` (muted text, hover tint, the toolbar icon look), `ghost` (transparent, hover fill), `outline`, or `destructive`. Defaults to `default`.",
724
813
  "default": "'default'",
725
814
  "displayType": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\""
726
815
  },
@@ -754,7 +843,7 @@
754
843
  "type": "undefined | string",
755
844
  "optional": true,
756
845
  "scalar": true,
757
- "description": "Accessible name. REQUIRED for icon-only buttons (no visible text); ignored when you slot visible text, which already names the button.",
846
+ "description": "Accessible name. REQUIRED for icon-only buttons (no visible text); ignored when you slot visible text, which already names the button. An `aria-label` on top of visible text REPLACES that name rather than adding to it, so a button reading \"Save\" that answers to \"Submit\" is unusable by speech input (WCAG 2.5.3, Label in Name). The visible text wins. An `icon` / `icon-sm` size hides the slot, which makes the button icon-only whatever you slotted, so `label` is what names it there.",
758
847
  "displayType": "undefined | string"
759
848
  },
760
849
  {
@@ -771,7 +860,7 @@
771
860
  "type": "undefined | false | true",
772
861
  "optional": true,
773
862
  "scalar": true,
774
- "description": "Stretch the button to the full width of its container (a block button) e.g. a card CTA or a stacked action. Attribute: `full`.",
863
+ "description": "Stretch the button to the full width of its container (a block button), e.g. a card CTA or a stacked action. Attribute: `full`.",
775
864
  "default": "false",
776
865
  "displayType": "undefined | false | true"
777
866
  },
@@ -819,7 +908,7 @@
819
908
  "name": "click",
820
909
  "params": "",
821
910
  "returns": "void",
822
- "description": "Programmatically activate the button runs the same path as a user click and fires kai-click. Forwarding to the inner button means `disabled` is respected automatically."
911
+ "description": "Programmatically activate the button. Runs the same path as a user click and fires kai-click. Forwarding to the inner button means `disabled` is respected automatically."
823
912
  }
824
913
  ],
825
914
  "composedFrom": [
@@ -831,6 +920,11 @@
831
920
  ],
832
921
  "tokens": [],
833
922
  "slots": [
923
+ {
924
+ "name": "",
925
+ "mode": "inject",
926
+ "doc": "The button's label. Omit it for an icon-only button (pair with `aria-label`)."
927
+ },
834
928
  {
835
929
  "name": "icon",
836
930
  "mode": "replace",
@@ -850,6 +944,16 @@
850
944
  "className": "KaiCardElement",
851
945
  "displayName": "Card",
852
946
  "props": [
947
+ {
948
+ "name": "theme",
949
+ "type": "\"light\" | \"dark\" | \"auto\"",
950
+ "optional": true,
951
+ "scalar": true,
952
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
953
+ "default": "'auto'",
954
+ "universal": true,
955
+ "displayType": "\"light\" | \"dark\" | \"auto\""
956
+ },
853
957
  {
854
958
  "name": "appearance",
855
959
  "type": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"accent\"",
@@ -864,7 +968,7 @@
864
968
  "type": "undefined | \"vertical\" | \"horizontal\" | \"responsive\"",
865
969
  "optional": true,
866
970
  "scalar": true,
867
- "description": "`vertical` (default, media on top) | `horizontal` (media at the start) | `responsive` (horizontal when the card's container is wide enough, else vertical a container query on the card's own width). Attribute: `orientation`.",
971
+ "description": "`vertical` (default, media on top) | `horizontal` (media at the start) | `responsive` (horizontal when the card's container is wide enough, else vertical, via a container query on the card's own width). Attribute: `orientation`.",
868
972
  "default": "'vertical'",
869
973
  "displayType": "undefined | \"vertical\" | \"horizontal\" | \"responsive\""
870
974
  },
@@ -953,6 +1057,11 @@
953
1057
  ],
954
1058
  "tokens": [],
955
1059
  "slots": [
1060
+ {
1061
+ "name": "",
1062
+ "mode": "inject",
1063
+ "doc": "The card body, below the header/media regions."
1064
+ },
956
1065
  {
957
1066
  "name": "media",
958
1067
  "mode": "inject",
@@ -1017,12 +1126,25 @@
1017
1126
  "className": "KaiCardsElement",
1018
1127
  "displayName": "Cards",
1019
1128
  "props": [
1129
+ {
1130
+ "name": "theme",
1131
+ "type": "\"light\" | \"dark\" | \"auto\"",
1132
+ "optional": true,
1133
+ "scalar": true,
1134
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1135
+ "default": "'auto'",
1136
+ "universal": true,
1137
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1138
+ },
1020
1139
  {
1021
1140
  "name": "cards",
1022
1141
  "type": "undefined | { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]",
1023
1142
  "optional": true,
1024
1143
  "scalar": false,
1025
1144
  "description": "The stream of card envelopes to render. Set as a JS PROPERTY: `el.cards = [...]`.",
1145
+ "typeName": "CardEnvelope[]",
1146
+ "typeShape": "{ type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]",
1147
+ "typeImport": "CardEnvelope",
1026
1148
  "displayType": "undefined | { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]"
1027
1149
  },
1028
1150
  {
@@ -1033,20 +1155,40 @@
1033
1155
  "description": "Optional type→tag overrides/additions (merged over the built-ins). Property: `el.types`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
1034
1156
  "displayType": "undefined | Record<string, string>"
1035
1157
  },
1158
+ {
1159
+ "name": "schemas",
1160
+ "type": "undefined | Record<string, object>",
1161
+ "optional": true,
1162
+ "scalar": false,
1163
+ "description": "JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `types`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.schemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name, matching `mergeCardTags`, where your entry is spread over ours. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `\"type\"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one. See `CardSchemaMap` in components/card-renderer.tsx.",
1164
+ "displayType": "undefined | Record<string, object>"
1165
+ },
1036
1166
  {
1037
1167
  "name": "policy",
1038
1168
  "type": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1039
1169
  "optional": true,
1040
1170
  "scalar": false,
1041
1171
  "description": "Optional CardPolicy handling child events. Property: `el.policy`.",
1172
+ "typeName": "CardPolicy",
1173
+ "typeShape": "{ onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
1174
+ "typeImport": "CardPolicy",
1042
1175
  "displayType": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }"
1176
+ },
1177
+ {
1178
+ "name": "validateCards",
1179
+ "type": "undefined | false | true",
1180
+ "optional": true,
1181
+ "scalar": true,
1182
+ "description": "Validate each envelope's `data` against the schema for its type before rendering it, using a built-in's own schema or yours from `schemas`. Default `true`; set `validate-cards=\"false\"` (or `el.validateCards = false`) to opt out. A hard failure (wrong type, a missing required field) renders a diagnostic naming the field instead of the card; a soft failure (bounds) renders the card unchanged. Both emit a contract `error` event. On in production too: a model emitting a bad shape is a production failure mode, so stripping the check there would hide it from exactly the person who needs to see it.",
1183
+ "default": "true",
1184
+ "displayType": "undefined | false | true"
1043
1185
  }
1044
1186
  ],
1045
1187
  "events": [
1046
1188
  {
1047
1189
  "name": "kai-card-resolved",
1048
1190
  "detail": "{ cardId: string; resolution: { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }",
1049
- "description": "A child card transitioned to a resolved/deferred state (an action was chosen, a form/tasks submission landed, or it was dismissed) — re-emitted off the host as a non-bubbling convenience event so a consumer can observe resolution centrally without diffing the cards array. `detail` = `{ cardId, resolution }`. (A `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire this observe reopen via the underlying bubbling `kai-card` event.)",
1191
+ "description": "A child card transitioned to a resolved/deferred state (an action was chosen, a form/tasks submission landed, or it was dismissed). Re-emitted off the host as a non-bubbling convenience event so a consumer can observe resolution centrally without diffing the cards array. `detail` = `{ cardId, resolution }`. (A `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire this; observe reopen via the underlying bubbling `kai-card` event.)",
1050
1192
  "displayDetail": "{ cardId: string; resolution: { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }"
1051
1193
  }
1052
1194
  ],
@@ -1055,13 +1197,13 @@
1055
1197
  "name": "resolve",
1056
1198
  "params": "cardId: string, resolution: CardResolution",
1057
1199
  "returns": "void",
1058
- "description": "Programmatically resolve a child card by id: set that envelope's `resolution` so the child re-renders into its read-only/resolved view the imperative twin of the consumer mutating the cards array. No-op for an unknown id."
1200
+ "description": "Programmatically resolve a child card by id: set that envelope's `resolution` so the child re-renders into its read-only/resolved view. The imperative twin of the consumer mutating the cards array. No-op for an unknown id."
1059
1201
  },
1060
1202
  {
1061
1203
  "name": "dismiss",
1062
1204
  "params": "cardId: string",
1063
1205
  "returns": "void",
1064
- "description": "Collapse a card to its re-openable stub from the host side convenience for `resolve(cardId, { kind: 'dismissed' })`."
1206
+ "description": "Collapse a card to its re-openable stub from the host side. Convenience for `resolve(cardId, { kind: 'dismissed' })`."
1065
1207
  },
1066
1208
  {
1067
1209
  "name": "getCard",
@@ -1084,23 +1226,34 @@
1084
1226
  "className": "KaiChainOfThoughtElement",
1085
1227
  "displayName": "ChainOfThought",
1086
1228
  "props": [
1229
+ {
1230
+ "name": "theme",
1231
+ "type": "\"light\" | \"dark\" | \"auto\"",
1232
+ "optional": true,
1233
+ "scalar": true,
1234
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1235
+ "default": "'auto'",
1236
+ "universal": true,
1237
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1238
+ },
1087
1239
  {
1088
1240
  "name": "steps",
1089
- "type": "{ label: string; content?: undefined | string; id?: undefined | string }[]",
1090
- "optional": false,
1241
+ "type": "undefined | { label: string; content?: undefined | string; id?: undefined | string }[]",
1242
+ "optional": true,
1091
1243
  "scalar": false,
1092
- "description": "The reasoning steps. Set as a JS property. Compound sub-parts collapse to this one data model (Route 1). Each `{ label, content?, id? }`.",
1244
+ "description": "The reasoning steps. Set as a JS property. Compound sub-parts collapse to this one data model (Route 1). Each `{ label, content?, id? }`. Omit to supply the steps as `<kai-step>` light-DOM children instead; when both are present the property's steps come first.",
1093
1245
  "typeName": "ChainOfThoughtStepData[]",
1094
1246
  "typeShape": "{ label: string; content?: undefined | string; id?: undefined | string }[]",
1095
1247
  "default": "[]",
1096
- "displayType": "{ label: string; content?: undefined | string; id?: undefined | string }[]"
1248
+ "typeImport": "ChainOfThoughtStepData",
1249
+ "displayType": "undefined | { label: string; content?: undefined | string; id?: undefined | string }[]"
1097
1250
  },
1098
1251
  {
1099
1252
  "name": "type",
1100
1253
  "type": "undefined | \"single\" | \"multiple\"",
1101
1254
  "optional": true,
1102
1255
  "scalar": true,
1103
- "description": "Open mode: `'multiple'` (default any number of steps open at once) or `'single'` (at most one open; opening a step closes the others).",
1256
+ "description": "Open mode: `'multiple'` (default, any number of steps open at once) or `'single'` (at most one open; opening a step closes the others).",
1104
1257
  "displayType": "undefined | \"single\" | \"multiple\""
1105
1258
  },
1106
1259
  {
@@ -1116,7 +1269,7 @@
1116
1269
  "type": "undefined | string | string[]",
1117
1270
  "optional": true,
1118
1271
  "scalar": false,
1119
- "description": "Uncontrolled INITIAL open step key(s) seeds which steps render expanded. Ignored once `value` is provided. Set as a JS property.",
1272
+ "description": "Uncontrolled INITIAL open step key(s), seeding which steps render expanded. Ignored once `value` is provided. Set as a JS property.",
1120
1273
  "displayType": "undefined | string | string[]"
1121
1274
  }
1122
1275
  ],
@@ -1124,7 +1277,7 @@
1124
1277
  {
1125
1278
  "name": "kai-value-change",
1126
1279
  "detail": "{ value: string | string[] }",
1127
- "description": "The open set changed by user click OR an expand()/collapse()/toggle() call. `value` is a string in `single` mode, a string[] in `multiple` mode. (Maps Radix Accordion's onValueChange.)",
1280
+ "description": "The open set changed, by user click OR an expand()/collapse()/toggle() call. `value` is a string in `single` mode, a string[] in `multiple` mode. (Maps Radix Accordion's onValueChange.)",
1128
1281
  "displayDetail": "{ value: string | string[] }"
1129
1282
  }
1130
1283
  ],
@@ -1133,13 +1286,13 @@
1133
1286
  "name": "expand",
1134
1287
  "params": "index?: number",
1135
1288
  "returns": "void",
1136
- "description": "Open one step's detail by index, or with no arg — ALL steps. In `single` mode opening one step closes the others (expand-all keeps the last)."
1289
+ "description": "Open one step's detail by index, or ALL steps when called with no arg. In `single` mode opening one step closes the others (expand-all keeps the last)."
1137
1290
  },
1138
1291
  {
1139
1292
  "name": "collapse",
1140
1293
  "params": "index?: number",
1141
1294
  "returns": "void",
1142
- "description": "Close one step's detail by index, or with no arg — ALL steps."
1295
+ "description": "Close one step's detail by index, or ALL steps when called with no arg."
1143
1296
  },
1144
1297
  {
1145
1298
  "name": "toggle",
@@ -1155,7 +1308,18 @@
1155
1308
  "storyId": "solid-advanced-elements-chainofthoughtaccordion--docs"
1156
1309
  }
1157
1310
  ],
1158
- "tokens": []
1311
+ "tokens": [],
1312
+ "declarativeChildren": [
1313
+ {
1314
+ "tag": "kai-step",
1315
+ "attributes": [
1316
+ "label",
1317
+ "step-id"
1318
+ ],
1319
+ "text": true,
1320
+ "description": "Parse a single light-DOM `<kai-step>` element into a `Step` descriptor. Attribute mapping: - `label` → Step.label (the always-visible heading) - `step-id` → Step.id (optional stable open-set key) - textContent → Step.content (optional expandable detail)"
1321
+ }
1322
+ ]
1159
1323
  },
1160
1324
  {
1161
1325
  "tag": "kai-chat",
@@ -1163,16 +1327,23 @@
1163
1327
  "displayName": "Chat",
1164
1328
  "props": [
1165
1329
  {
1166
- "name": "messages",
1167
- "type": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
1168
- "optional": false,
1169
- "scalar": false,
1170
- "description": "The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions. Set as a JS property (`el.messages = [...]`).",
1171
- "typeName": "ChatMessage[]",
1172
- "typeShape": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
1173
- "default": "[]",
1174
- "typeImport": "ChatMessage",
1175
- "displayType": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
1330
+ "name": "theme",
1331
+ "type": "\"light\" | \"dark\" | \"auto\"",
1332
+ "optional": true,
1333
+ "scalar": true,
1334
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1335
+ "default": "'auto'",
1336
+ "universal": true,
1337
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1338
+ },
1339
+ {
1340
+ "name": "search",
1341
+ "type": "undefined | false | true",
1342
+ "optional": true,
1343
+ "scalar": true,
1344
+ "description": "Show a Search (Globe) button in the input toolbar; fires a `search` event.",
1345
+ "default": "false",
1346
+ "displayType": "undefined | false | true"
1176
1347
  },
1177
1348
  {
1178
1349
  "name": "value",
@@ -1228,12 +1399,12 @@
1228
1399
  },
1229
1400
  {
1230
1401
  "name": "proseSize",
1231
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
1402
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
1232
1403
  "optional": true,
1233
1404
  "scalar": true,
1234
1405
  "description": "Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`). Defaults to `'sm'`.",
1235
1406
  "default": "'sm'",
1236
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
1407
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
1237
1408
  },
1238
1409
  {
1239
1410
  "name": "codeTheme",
@@ -1267,6 +1438,9 @@
1267
1438
  "optional": true,
1268
1439
  "scalar": false,
1269
1440
  "description": "Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection.",
1441
+ "typeName": "ModelOption[]",
1442
+ "typeShape": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
1443
+ "typeImport": "ModelOption",
1270
1444
  "displayType": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
1271
1445
  },
1272
1446
  {
@@ -1283,6 +1457,9 @@
1283
1457
  "optional": true,
1284
1458
  "scalar": false,
1285
1459
  "description": "Optional context-window token usage. When set, a Context token meter is shown in the header.",
1460
+ "typeName": "ChatThreadContextUsage",
1461
+ "typeShape": "{ usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }",
1462
+ "typeImport": "ChatThreadContextUsage",
1286
1463
  "displayType": "ContextData | undefined"
1287
1464
  },
1288
1465
  {
@@ -1299,7 +1476,7 @@
1299
1476
  "type": "undefined | false | true",
1300
1477
  "optional": true,
1301
1478
  "scalar": true,
1302
- "description": "Whether the host has `slot=\"header-start\"` content (left of the title) set by the `<kai-chat>` facade so a custom control forces the header open.",
1479
+ "description": "Whether the host has `slot=\"header-start\"` content (left of the title). Set by the `<kai-chat>` facade so a custom control forces the header open.",
1303
1480
  "displayType": "undefined | false | true"
1304
1481
  },
1305
1482
  {
@@ -1315,7 +1492,7 @@
1315
1492
  "type": "undefined | false | true",
1316
1493
  "optional": true,
1317
1494
  "scalar": true,
1318
- "description": "REPLACE full custom header in place of the built-in title/model/context bar.",
1495
+ "description": "REPLACE: full custom header in place of the built-in title/model/context bar.",
1319
1496
  "displayType": "undefined | false | true"
1320
1497
  },
1321
1498
  {
@@ -1323,7 +1500,7 @@
1323
1500
  "type": "undefined | false | true",
1324
1501
  "optional": true,
1325
1502
  "scalar": true,
1326
- "description": "INJECT left sidebar column (e.g. a conversation list / your own nav).",
1503
+ "description": "INJECT: left sidebar column (e.g. a conversation list / your own nav).",
1327
1504
  "displayType": "undefined | false | true"
1328
1505
  },
1329
1506
  {
@@ -1331,7 +1508,7 @@
1331
1508
  "type": "undefined | false | true",
1332
1509
  "optional": true,
1333
1510
  "scalar": true,
1334
- "description": "REPLACE custom zero-state rendered in the message area while the thread is empty (replaces the empty message list only; the composer and its suggestions still render).",
1511
+ "description": "REPLACE: custom zero-state rendered in the message area while the thread is empty (replaces the empty message list only; the composer and its suggestions still render).",
1335
1512
  "displayType": "undefined | false | true"
1336
1513
  },
1337
1514
  {
@@ -1339,7 +1516,7 @@
1339
1516
  "type": "undefined | false | true",
1340
1517
  "optional": true,
1341
1518
  "scalar": true,
1342
- "description": "REPLACE full custom composer in place of the built-in prompt input. The projected content wires its own submit (the data-flow boundary).",
1519
+ "description": "REPLACE: full custom composer in place of the built-in prompt input. The projected content wires its own submit (the data-flow boundary).",
1343
1520
  "displayType": "undefined | false | true"
1344
1521
  },
1345
1522
  {
@@ -1347,7 +1524,7 @@
1347
1524
  "type": "undefined | false | true",
1348
1525
  "optional": true,
1349
1526
  "scalar": true,
1350
- "description": "INJECT accessory row just above the composer (e.g. extra actions).",
1527
+ "description": "INJECT: accessory row just above the composer (e.g. extra actions).",
1351
1528
  "displayType": "undefined | false | true"
1352
1529
  },
1353
1530
  {
@@ -1355,16 +1532,7 @@
1355
1532
  "type": "undefined | false | true",
1356
1533
  "optional": true,
1357
1534
  "scalar": true,
1358
- "description": "INJECT footer row below the composer (disclaimers, token meter, …).",
1359
- "displayType": "undefined | false | true"
1360
- },
1361
- {
1362
- "name": "search",
1363
- "type": "undefined | false | true",
1364
- "optional": true,
1365
- "scalar": true,
1366
- "description": "Show a Search (Globe) button in the input toolbar; fires a `search` event.",
1367
- "default": "false",
1535
+ "description": "INJECT: footer row below the composer (disclaimers, token meter, …).",
1368
1536
  "displayType": "undefined | false | true"
1369
1537
  },
1370
1538
  {
@@ -1381,7 +1549,10 @@
1381
1549
  "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
1382
1550
  "optional": true,
1383
1551
  "scalar": false,
1384
- "description": "Rich entity triggers each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input.",
1552
+ "description": "Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input.",
1553
+ "typeName": "TriggerDef[]",
1554
+ "typeShape": "{ char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
1555
+ "typeImport": "TriggerDef",
1385
1556
  "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
1386
1557
  },
1387
1558
  {
@@ -1400,6 +1571,42 @@
1400
1571
  "description": "Whether each message's action bar is always visible (`'always'`, default) or only revealed on hover of that message row (`'hover'`).",
1401
1572
  "default": "'always'",
1402
1573
  "displayType": "undefined | \"always\" | \"hover\""
1574
+ },
1575
+ {
1576
+ "name": "accept",
1577
+ "type": "undefined | string",
1578
+ "optional": true,
1579
+ "scalar": true,
1580
+ "description": "Which attachment media types the user may stage, in HTML `accept` syntax: `<kai-chat accept=\"image/*,application/pdf\">`. A plain string, so unlike `messages` it DOES work as an attribute. Omitted means no filter. MEDIA TYPES ONLY -- exact (`image/png`) or subtype wildcard (`text/*`). HTML allows a file extension here and this does not: `accept=\".py\"` THROWS with the entry named, rather than silently resolving to a picker that accepts nothing. It can only NARROW what the kit can already encode: `accept=\"image/*\"` resolves to the four image formats both APIs take, not to every image type the OS offers. Pass the SAME string to `toOpenAIMessages(msgs, { accept })` and the picker and the wire cannot disagree -- both resolve it through `resolveMediaPolicy` against one declaration. That declaration is readable as `encodableMediaTypes()` from `@kitn.ai/ui/wire`, if you would rather build your own picker than use this prop.",
1581
+ "displayType": "undefined | string"
1582
+ },
1583
+ {
1584
+ "name": "messages",
1585
+ "type": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
1586
+ "optional": true,
1587
+ "scalar": false,
1588
+ "description": "The full message thread to render, newest last. Each entry carries its role, ordered `parts`, and optional actions/avatar/feedback. Set as a JS property (`el.messages = [...]`); a NEW array reference per streaming chunk re-renders (mutating in place does not). Omit for an empty thread. Re-declared here (rather than inherited from `ChatThreadProps`) because the ELEMENT registers a `[]` default and renders the empty state without it, while the SolidJS `<ChatThread>` component still requires it. The facade hands it a validated array either way. Matches `<kai-thread>`.",
1589
+ "typeName": "ChatMessage[]",
1590
+ "typeShape": "{ id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
1591
+ "default": "[]",
1592
+ "typeImport": "ChatMessage",
1593
+ "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
1594
+ },
1595
+ {
1596
+ "name": "cardTypes",
1597
+ "type": "undefined | Record<string, string>",
1598
+ "optional": true,
1599
+ "scalar": false,
1600
+ "description": "Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
1601
+ "displayType": "undefined | Record<string, string>"
1602
+ },
1603
+ {
1604
+ "name": "cardSchemas",
1605
+ "type": "undefined | Record<string, object>",
1606
+ "optional": true,
1607
+ "scalar": false,
1608
+ "description": "JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `\"type\"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one.",
1609
+ "displayType": "undefined | Record<string, object>"
1403
1610
  }
1404
1611
  ],
1405
1612
  "events": [
@@ -1409,6 +1616,12 @@
1409
1616
  "description": "The staged attachments changed (file added or removed). Carries the full current list so a consumer can react in real time.",
1410
1617
  "displayDetail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
1411
1618
  },
1619
+ {
1620
+ "name": "kai-attachments-rejected",
1621
+ "detail": "{ rejected: { filename: string; mediaType: string; reason: \"filtered\" | \"unsupported\" }[] }",
1622
+ "description": "One or more picked files were refused because `accept` excluded them. The element renders NO message of its own: it reports the facts (name, media type, whether the kit could have sent it) and what the user should see is the application's call. Only ever fires when `accept` is set.",
1623
+ "displayDetail": "{ rejected: { filename: string; mediaType: string; reason: \"filtered\" | \"unsupported\" }[] }"
1624
+ },
1412
1625
  {
1413
1626
  "name": "kai-message-action",
1414
1627
  "detail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }",
@@ -1457,31 +1670,31 @@
1457
1670
  "name": "focus",
1458
1671
  "params": "options?: FocusOptions",
1459
1672
  "returns": "void",
1460
- "description": ""
1673
+ "description": "Focus the composer, meaning the contenteditable (or textarea) inside the shadow root. A native `focus()` on the host lands on the host itself and never reaches it, so this is the only way to focus the input programmatically."
1461
1674
  },
1462
1675
  {
1463
1676
  "name": "blur",
1464
1677
  "params": "",
1465
1678
  "returns": "void",
1466
- "description": ""
1679
+ "description": "Blur whatever currently holds focus inside the shadow root. The companion to `focus()`, for the same reason: a native `blur()` on the host misses the real focus target."
1467
1680
  },
1468
1681
  {
1469
1682
  "name": "clear",
1470
1683
  "params": "",
1471
1684
  "returns": "void",
1472
- "description": ""
1685
+ "description": "Empty the COMPOSER: drops the draft text and every staged attachment, then fires `kai-value-change` with `''`. It does NOT touch the thread. `messages` is the consumer's own state, so clearing history stays the consumer's call."
1473
1686
  },
1474
1687
  {
1475
1688
  "name": "send",
1476
1689
  "params": "",
1477
1690
  "returns": "void",
1478
- "description": ""
1691
+ "description": "Submit whatever the composer currently holds, on the same path as Enter or the send button: fires `kai-submit` with that value plus the staged attachments, then drops the attachments. It takes no argument, so to send text the user never typed, set `el.value` first. There is no empty-check, so an empty composer still fires. The draft is cleared afterwards only when `value` is uncontrolled; a controlled host owns its value and clears it itself. Named `send`, not `submit`, to match the shared vocabulary."
1479
1692
  },
1480
1693
  {
1481
1694
  "name": "scrollToBottom",
1482
1695
  "params": "behavior?: ScrollBehavior",
1483
1696
  "returns": "void",
1484
- "description": ""
1697
+ "description": "Scroll the message viewport to the newest message. Defaults to `'smooth'`; pass `'instant'` to jump without animating."
1485
1698
  }
1486
1699
  ],
1487
1700
  "composedFrom": [
@@ -1518,7 +1731,7 @@
1518
1731
  {
1519
1732
  "name": "empty",
1520
1733
  "mode": "replace",
1521
- "doc": "Custom zero-state rendered in the message area while the thread is empty. Replaces the empty message list only the composer and any suggestions still render."
1734
+ "doc": "Custom zero-state rendered in the message area while the thread is empty. Replaces the empty message list only; the composer and any suggestions still render."
1522
1735
  },
1523
1736
  {
1524
1737
  "name": "composer",
@@ -1562,6 +1775,16 @@
1562
1775
  "className": "KaiCheckpointElement",
1563
1776
  "displayName": "Checkpoint",
1564
1777
  "props": [
1778
+ {
1779
+ "name": "theme",
1780
+ "type": "\"light\" | \"dark\" | \"auto\"",
1781
+ "optional": true,
1782
+ "scalar": true,
1783
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1784
+ "default": "'auto'",
1785
+ "universal": true,
1786
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1787
+ },
1565
1788
  {
1566
1789
  "name": "label",
1567
1790
  "type": "undefined | string",
@@ -1580,12 +1803,12 @@
1580
1803
  },
1581
1804
  {
1582
1805
  "name": "variant",
1583
- "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
1806
+ "type": "undefined | \"ghost\" | \"default\" | \"outline\"",
1584
1807
  "optional": true,
1585
1808
  "scalar": true,
1586
1809
  "description": "Visual button style.",
1587
1810
  "default": "'ghost'",
1588
- "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
1811
+ "displayType": "undefined | \"ghost\" | \"default\" | \"outline\""
1589
1812
  },
1590
1813
  {
1591
1814
  "name": "size",
@@ -1630,13 +1853,26 @@
1630
1853
  "className": "KaiChoiceElement",
1631
1854
  "displayName": "Choice",
1632
1855
  "props": [
1856
+ {
1857
+ "name": "theme",
1858
+ "type": "\"light\" | \"dark\" | \"auto\"",
1859
+ "optional": true,
1860
+ "scalar": true,
1861
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1862
+ "default": "'auto'",
1863
+ "universal": true,
1864
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1865
+ },
1633
1866
  {
1634
1867
  "name": "data",
1635
- "type": "undefined | Record<string, unknown>",
1868
+ "type": "undefined | { prompt?: undefined | string; options: { id: string; label: string; description?: undefined | string; media?: undefined | { image?: undefined | string; imageAlt?: undefined | string; icon?: undefined | string }; meta?: undefined | string; recommended?: undefined | false | true; disabled?: undefined | false | true; payload?: unknown }[]; allowOther?: undefined | false | true | { label?: undefined | string; placeholder?: undefined | string }; submitLabel?: undefined | string; dismissible?: undefined | false | true }",
1636
1869
  "optional": true,
1637
1870
  "scalar": false,
1638
1871
  "description": "The choice definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import `ChoiceCardData` from `@kitn.ai/ui` for the full shape.",
1639
- "displayType": "undefined | Record<string, unknown>"
1872
+ "typeName": "ChoiceCardData",
1873
+ "typeShape": "{ prompt?: undefined | string; options: { id: string; label: string; description?: undefined | string; media?: undefined | { image?: undefined | string; imageAlt?: undefined | string; icon?: undefined | string }; meta?: undefined | string; recommended?: undefined | false | true; disabled?: undefined | false | true; payload?: unknown }[]; allowOther?: undefined | false | true | { label?: undefined | string; placeholder?: undefined | string }; submitLabel?: undefined | string; dismissible?: undefined | false | true }",
1874
+ "typeImport": "ChoiceCardData",
1875
+ "displayType": "undefined | { prompt?: undefined | string; options: { id: string; label: string; description?: undefined | string; media?: undefined | { image?: undefined | string; imageAlt?: undefined | string; icon?: undefined | string }; meta?: undefined | string; recommended?: undefined | false | true; disabled?: undefined | false | true; payload?: unknown }[]; allowOther?: undefined | false | true | { label?: undefined | string; placeholder?: undefined | string }; submitLabel?: undefined | string; dismissible?: undefined | false | true }"
1640
1876
  },
1641
1877
  {
1642
1878
  "name": "cardId",
@@ -1667,7 +1903,7 @@
1667
1903
  "type": "undefined | string",
1668
1904
  "optional": true,
1669
1905
  "scalar": true,
1670
- "description": "Controlled selection the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
1906
+ "description": "Controlled selection: the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
1671
1907
  "displayType": "undefined | string"
1672
1908
  },
1673
1909
  {
@@ -1706,25 +1942,25 @@
1706
1942
  "name": "select",
1707
1943
  "params": "optionId: string",
1708
1944
  "returns": "void",
1709
- "description": "Select an option by id locally no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally."
1945
+ "description": "Select an option by id locally: no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally."
1710
1946
  },
1711
1947
  {
1712
1948
  "name": "send",
1713
1949
  "params": "",
1714
1950
  "returns": "void",
1715
- "description": "Submit the current selection emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary."
1951
+ "description": "Submit the current selection: emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary."
1716
1952
  },
1717
1953
  {
1718
1954
  "name": "dismiss",
1719
1955
  "params": "",
1720
1956
  "returns": "void",
1721
- "description": "Trigger the dismiss path emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
1957
+ "description": "Trigger the dismiss path: emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
1722
1958
  },
1723
1959
  {
1724
1960
  "name": "reopen",
1725
1961
  "params": "",
1726
1962
  "returns": "void",
1727
- "description": "Re-open a dismissed card from its stub emits `reopen` on kai-card."
1963
+ "description": "Re-open a dismissed card from its stub: emits `reopen` on kai-card."
1728
1964
  }
1729
1965
  ],
1730
1966
  "composedFrom": [
@@ -1741,6 +1977,16 @@
1741
1977
  "className": "KaiCoachmarkElement",
1742
1978
  "displayName": "Coachmark",
1743
1979
  "props": [
1980
+ {
1981
+ "name": "theme",
1982
+ "type": "\"light\" | \"dark\" | \"auto\"",
1983
+ "optional": true,
1984
+ "scalar": true,
1985
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
1986
+ "default": "'auto'",
1987
+ "universal": true,
1988
+ "displayType": "\"light\" | \"dark\" | \"auto\""
1989
+ },
1744
1990
  {
1745
1991
  "name": "open",
1746
1992
  "type": "undefined | false | true",
@@ -1783,11 +2029,11 @@
1783
2029
  },
1784
2030
  {
1785
2031
  "name": "tone",
1786
- "type": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\"",
2032
+ "type": "undefined | \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\"",
1787
2033
  "optional": true,
1788
2034
  "scalar": true,
1789
- "description": "Color tone: `primary` (default, theme accent), `info` (blue), `success` (green), `warning` (amber), or `error` (red) reusing the kit's tool hues.",
1790
- "displayType": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\""
2035
+ "description": "Color tone: `primary` (default, theme accent), `info` (blue), `success` (green), `warning` (amber), or `error` (red), reusing the kit's tool hues.",
2036
+ "displayType": "undefined | \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\""
1791
2037
  },
1792
2038
  {
1793
2039
  "name": "arrow",
@@ -1842,6 +2088,11 @@
1842
2088
  ],
1843
2089
  "tokens": [],
1844
2090
  "slots": [
2091
+ {
2092
+ "name": "",
2093
+ "mode": "inject",
2094
+ "doc": "The ANCHOR the coachmark points at: the element it attaches to and positions against. The bubble body is the `content` slot."
2095
+ },
1845
2096
  {
1846
2097
  "name": "content",
1847
2098
  "mode": "replace",
@@ -1881,6 +2132,16 @@
1881
2132
  "className": "KaiCodeBlockElement",
1882
2133
  "displayName": "CodeBlock",
1883
2134
  "props": [
2135
+ {
2136
+ "name": "theme",
2137
+ "type": "\"light\" | \"dark\" | \"auto\"",
2138
+ "optional": true,
2139
+ "scalar": true,
2140
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2141
+ "default": "'auto'",
2142
+ "universal": true,
2143
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2144
+ },
1884
2145
  {
1885
2146
  "name": "code",
1886
2147
  "type": "string",
@@ -1918,12 +2179,12 @@
1918
2179
  },
1919
2180
  {
1920
2181
  "name": "proseSize",
1921
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
2182
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
1922
2183
  "optional": true,
1923
2184
  "scalar": true,
1924
2185
  "description": "Code text sizing.",
1925
2186
  "default": "'sm'",
1926
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
2187
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
1927
2188
  }
1928
2189
  ],
1929
2190
  "events": [],
@@ -1949,12 +2210,25 @@
1949
2210
  "className": "KaiCommandElement",
1950
2211
  "displayName": "Command",
1951
2212
  "props": [
2213
+ {
2214
+ "name": "theme",
2215
+ "type": "\"light\" | \"dark\" | \"auto\"",
2216
+ "optional": true,
2217
+ "scalar": true,
2218
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2219
+ "default": "'auto'",
2220
+ "universal": true,
2221
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2222
+ },
1952
2223
  {
1953
2224
  "name": "items",
1954
2225
  "type": "undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]",
1955
2226
  "optional": true,
1956
2227
  "scalar": false,
1957
- "description": "Flat list of items. Set as a JS property not an HTML attribute.",
2228
+ "description": "Flat list of items. Set as a JS property, not an HTML attribute.",
2229
+ "typeName": "KaiCommandItem[]",
2230
+ "typeShape": "{ id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]",
2231
+ "typeImport": "KaiCommandItem",
1958
2232
  "displayType": "undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]"
1959
2233
  },
1960
2234
  {
@@ -1977,9 +2251,9 @@
1977
2251
  "events": [
1978
2252
  {
1979
2253
  "name": "kai-active-change",
1980
- "detail": "{ id: undefined | string }",
1981
- "description": "Fired when the highlighted/active item changes via Arrow keys or when filtering re-clamps the active row. `id` is the newly active item's id, or `undefined` when no item is active (e.g. the filtered list is empty). Lets a host preview the active item without committing a selection.",
1982
- "displayDetail": "{ id: undefined | string }"
2254
+ "detail": "{ id: string | undefined }",
2255
+ "description": "Fired when the highlighted/active item changes, via Arrow keys or when filtering re-clamps the active row. `id` is the newly active item's id, or `undefined` when no item is active (e.g. the filtered list is empty). Lets a host preview the active item without committing a selection.",
2256
+ "displayDetail": "{ id: string | undefined }"
1983
2257
  },
1984
2258
  {
1985
2259
  "name": "kai-query-change",
@@ -2011,7 +2285,7 @@
2011
2285
  "name": "clear",
2012
2286
  "params": "",
2013
2287
  "returns": "void",
2014
- "description": "Reset the search query to empty re-showing all items and fire `kai-query-change` with `''`. Mirrors the Escape-key behavior."
2288
+ "description": "Reset the search query to empty, re-showing all items, and fire `kai-query-change` with `''`. Mirrors the Escape-key behavior."
2015
2289
  }
2016
2290
  ],
2017
2291
  "composedFrom": [
@@ -2035,6 +2309,16 @@
2035
2309
  "className": "KaiCompareElement",
2036
2310
  "displayName": "Compare",
2037
2311
  "props": [
2312
+ {
2313
+ "name": "theme",
2314
+ "type": "\"light\" | \"dark\" | \"auto\"",
2315
+ "optional": true,
2316
+ "scalar": true,
2317
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2318
+ "default": "'auto'",
2319
+ "universal": true,
2320
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2321
+ },
2038
2322
  {
2039
2323
  "name": "data",
2040
2324
  "type": "undefined | Record<string, unknown>",
@@ -2064,17 +2348,17 @@
2064
2348
  "type": "undefined | \"auto\" | \"columns\" | \"tabs\"",
2065
2349
  "optional": true,
2066
2350
  "scalar": true,
2067
- "description": "Layout: `'auto'` (default columns when wide, tabs when narrow, by CONTAINER width) | `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`.",
2351
+ "description": "Layout: `'auto'` (default, columns when wide, tabs when narrow, by CONTAINER width) | `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`.",
2068
2352
  "default": "'auto'",
2069
2353
  "displayType": "undefined | \"auto\" | \"columns\" | \"tabs\""
2070
2354
  },
2071
2355
  {
2072
2356
  "name": "proseSize",
2073
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
2357
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
2074
2358
  "optional": true,
2075
2359
  "scalar": true,
2076
2360
  "description": "Prose/text size for the rendered candidates. Attribute: `prose-size`.",
2077
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
2361
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
2078
2362
  },
2079
2363
  {
2080
2364
  "name": "codeTheme",
@@ -2118,7 +2402,7 @@
2118
2402
  "name": "select",
2119
2403
  "params": "candidateId: string",
2120
2404
  "returns": "void",
2121
- "description": "Programmatically commit a pick by candidate id same path as the \"Pick this\" button: fires kai-compare-select and optimistically collapses (single-shot; inert while streaming or already resolved). `select` does NOT collide with the `selection` prop (distinct identifier)."
2405
+ "description": "Programmatically commit a pick by candidate id, on the same path as the \"Pick this\" button: fires kai-compare-select and optimistically collapses (single-shot; inert while streaming or already resolved). `select` does NOT collide with the `selection` prop (distinct identifier)."
2122
2406
  },
2123
2407
  {
2124
2408
  "name": "focus",
@@ -2141,12 +2425,22 @@
2141
2425
  "className": "KaiComposerElement",
2142
2426
  "displayName": "Composer",
2143
2427
  "props": [
2428
+ {
2429
+ "name": "theme",
2430
+ "type": "\"light\" | \"dark\" | \"auto\"",
2431
+ "optional": true,
2432
+ "scalar": true,
2433
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2434
+ "default": "'auto'",
2435
+ "universal": true,
2436
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2437
+ },
2144
2438
  {
2145
2439
  "name": "value",
2146
2440
  "type": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]",
2147
2441
  "optional": true,
2148
2442
  "scalar": false,
2149
- "description": "Controlled value string or a full ComposerDoc (set as JS property).",
2443
+ "description": "Controlled value: a string or a full ComposerDoc (set as JS property).",
2150
2444
  "displayType": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
2151
2445
  },
2152
2446
  {
@@ -2177,12 +2471,12 @@
2177
2471
  },
2178
2472
  {
2179
2473
  "name": "maxHeight",
2180
- "type": "undefined | string | number",
2474
+ "type": "undefined | number | string",
2181
2475
  "optional": true,
2182
2476
  "scalar": true,
2183
2477
  "description": "Maximum height in px before the content scrolls. Default 240.",
2184
2478
  "default": "240",
2185
- "displayType": "undefined | string | number"
2479
+ "displayType": "undefined | number | string"
2186
2480
  },
2187
2481
  {
2188
2482
  "name": "submitOnEnter",
@@ -2198,7 +2492,10 @@
2198
2492
  "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
2199
2493
  "optional": true,
2200
2494
  "scalar": false,
2201
- "description": "Trigger definitions set as a JS property.",
2495
+ "description": "Trigger definitions. Set as a JS property.",
2496
+ "typeName": "TriggerDef[]",
2497
+ "typeShape": "{ char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
2498
+ "typeImport": "TriggerDef",
2202
2499
  "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
2203
2500
  },
2204
2501
  {
@@ -2206,7 +2503,7 @@
2206
2503
  "type": "undefined | (string | { pattern: string; flags?: undefined | string; class?: undefined | string })[]",
2207
2504
  "optional": true,
2208
2505
  "scalar": false,
2209
- "description": "Keyword highlight rules set as a JS property.",
2506
+ "description": "Keyword highlight rules. Set as a JS property.",
2210
2507
  "displayType": "undefined | (string | { pattern: string; flags?: undefined | string; class?: undefined | string })[]"
2211
2508
  },
2212
2509
  {
@@ -2240,7 +2537,7 @@
2240
2537
  {
2241
2538
  "name": "kai-focus",
2242
2539
  "detail": "{ originalEvent: FocusEvent }",
2243
- "description": "The composer gained focus. `focus`/`blur` are NOT composed natively, so they don't escape the shadow root these re-expose them on the host. (For `keydown`/`paste`/`focusin`/`focusout`, listen NATIVELY on `<kai-composer>`: they're composed and already cross the shadow boundary.)",
2540
+ "description": "The composer gained focus. `focus`/`blur` are NOT composed natively, so they don't escape the shadow root; these re-expose them on the host. (For `keydown`/`paste`/`focusin`/`focusout`, listen NATIVELY on `<kai-composer>`: they're composed and already cross the shadow boundary.)",
2244
2541
  "displayDetail": "{ originalEvent: FocusEvent }"
2245
2542
  },
2246
2543
  {
@@ -2273,7 +2570,7 @@
2273
2570
  "name": "focus",
2274
2571
  "params": "options?: FocusOptions",
2275
2572
  "returns": "void",
2276
- "description": "Focus the editable element. `focus`/`blur` are NOT composed natively, so a host-level focus() can't reach the editable inside the shadow root this is the only way to focus the composer programmatically."
2573
+ "description": "Focus the editable element. `focus`/`blur` are NOT composed natively, so a host-level focus() can't reach the editable inside the shadow root. This is the only way to focus the composer programmatically."
2277
2574
  },
2278
2575
  {
2279
2576
  "name": "blur",
@@ -2291,7 +2588,7 @@
2291
2588
  "name": "send",
2292
2589
  "params": "",
2293
2590
  "returns": "void",
2294
- "description": "Submit the current content programmatically same path as Enter (fires kai-submit). Named `send`, not `submit`, to match the shared vocabulary and avoid any submit collision."
2591
+ "description": "Submit the current content programmatically, on the same path as Enter (fires kai-submit). Named `send`, not `submit`, to match the shared vocabulary and avoid any submit collision."
2295
2592
  },
2296
2593
  {
2297
2594
  "name": "insertEntity",
@@ -2314,13 +2611,26 @@
2314
2611
  "className": "KaiConfirmElement",
2315
2612
  "displayName": "Confirm",
2316
2613
  "props": [
2614
+ {
2615
+ "name": "theme",
2616
+ "type": "\"light\" | \"dark\" | \"auto\"",
2617
+ "optional": true,
2618
+ "scalar": true,
2619
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2620
+ "default": "'auto'",
2621
+ "universal": true,
2622
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2623
+ },
2317
2624
  {
2318
2625
  "name": "data",
2319
- "type": "undefined | Record<string, unknown>",
2626
+ "type": "undefined | { heading?: undefined | string; body?: undefined | string; tone?: undefined | \"default\" | \"warning\" | \"danger\"; actions: { id: string; label: string; style?: undefined | \"primary\" | \"default\" | \"destructive\"; payload?: unknown; default?: undefined | false | true }[]; dismissible?: undefined | false | true }",
2320
2627
  "optional": true,
2321
2628
  "scalar": false,
2322
2629
  "description": "The confirm definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { body, tone, actions:[…] }`. Import `ConfirmCardData` from `@kitn.ai/ui` for the full shape.",
2323
- "displayType": "undefined | Record<string, unknown>"
2630
+ "typeName": "ConfirmCardData",
2631
+ "typeShape": "{ heading?: undefined | string; body?: undefined | string; tone?: undefined | \"default\" | \"warning\" | \"danger\"; actions: { id: string; label: string; style?: undefined | \"primary\" | \"default\" | \"destructive\"; payload?: unknown; default?: undefined | false | true }[]; dismissible?: undefined | false | true }",
2632
+ "typeImport": "ConfirmCardData",
2633
+ "displayType": "undefined | { heading?: undefined | string; body?: undefined | string; tone?: undefined | \"default\" | \"warning\" | \"danger\"; actions: { id: string; label: string; style?: undefined | \"primary\" | \"default\" | \"destructive\"; payload?: unknown; default?: undefined | false | true }[]; dismissible?: undefined | false | true }"
2324
2634
  },
2325
2635
  {
2326
2636
  "name": "cardId",
@@ -2343,7 +2653,7 @@
2343
2653
  "type": "undefined | false | true",
2344
2654
  "optional": true,
2345
2655
  "scalar": true,
2346
- "description": "Focus the default action on mount (off by default no focus-stealing). Attribute: `autofocus`.",
2656
+ "description": "Focus the default action on mount (off by default, so nothing steals focus). Attribute: `autofocus`.",
2347
2657
  "default": "false",
2348
2658
  "displayType": "undefined | false | true"
2349
2659
  },
@@ -2362,25 +2672,25 @@
2362
2672
  "name": "focus",
2363
2673
  "params": "options?: FocusOptions",
2364
2674
  "returns": "void",
2365
- "description": "Focus the default action button (or the first action if none is default) the same target `autofocus` focuses on mount, but on demand."
2675
+ "description": "Focus the default action button (or the first action if none is default). The same target `autofocus` focuses on mount, but on demand."
2366
2676
  },
2367
2677
  {
2368
2678
  "name": "confirm",
2369
2679
  "params": "actionId?: string",
2370
2680
  "returns": "void",
2371
- "description": "Activate an action by id emits the `action` verb on kai-card and resolves the card (single-shot). With no id, invokes the default action."
2681
+ "description": "Activate an action by id: emits the `action` verb on kai-card and resolves the card (single-shot). With no id, invokes the default action."
2372
2682
  },
2373
2683
  {
2374
2684
  "name": "dismiss",
2375
2685
  "params": "",
2376
2686
  "returns": "void",
2377
- "description": "Trigger the dismiss path emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
2687
+ "description": "Trigger the dismiss path: emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
2378
2688
  },
2379
2689
  {
2380
2690
  "name": "reopen",
2381
2691
  "params": "",
2382
2692
  "returns": "void",
2383
- "description": "Re-open a dismissed card from its stub emits `reopen` on kai-card."
2693
+ "description": "Re-open a dismissed card from its stub: emits `reopen` on kai-card."
2384
2694
  }
2385
2695
  ],
2386
2696
  "composedFrom": [
@@ -2397,12 +2707,25 @@
2397
2707
  "className": "KaiContextElement",
2398
2708
  "displayName": "Context",
2399
2709
  "props": [
2710
+ {
2711
+ "name": "theme",
2712
+ "type": "\"light\" | \"dark\" | \"auto\"",
2713
+ "optional": true,
2714
+ "scalar": true,
2715
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2716
+ "default": "'auto'",
2717
+ "universal": true,
2718
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2719
+ },
2400
2720
  {
2401
2721
  "name": "context",
2402
2722
  "type": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; reasoningTokens?: undefined | number; cacheTokens?: undefined | number; estimatedCost?: undefined | number }",
2403
2723
  "optional": true,
2404
2724
  "scalar": false,
2405
2725
  "description": "Token-usage data. Set as a JS property.",
2726
+ "typeName": "KaiContextUsage",
2727
+ "typeShape": "{ usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; reasoningTokens?: undefined | number; cacheTokens?: undefined | number; estimatedCost?: undefined | number }",
2728
+ "typeImport": "KaiContextUsage",
2406
2729
  "displayType": "ContextData | undefined"
2407
2730
  },
2408
2731
  {
@@ -2481,48 +2804,60 @@
2481
2804
  "name": "ContextCacheUsage",
2482
2805
  "group": "Components",
2483
2806
  "storyId": "solid-advanced-elements-contextcacheusage--docs"
2484
- },
2807
+ }
2808
+ ],
2809
+ "tokens": [],
2810
+ "parts": [
2485
2811
  {
2486
- "name": "DEFAULT_WARN_THRESHOLD",
2487
- "group": "Components",
2488
- "storyId": "solid-advanced-elements-defaultwarnthreshold--docs"
2812
+ "name": "track",
2813
+ "doc": "The usage meter track inside the hover-card breakdown. Carries `role=\"progressbar\"` and is in the DOM only while the card is open. Restyle its height, radius, or background from outside.",
2814
+ "recipe": "kai-context::part(track) { height: 0.5rem }"
2489
2815
  },
2490
2816
  {
2491
- "name": "DEFAULT_DANGER_THRESHOLD",
2492
- "group": "Components",
2493
- "storyId": "solid-advanced-elements-defaultdangerthreshold--docs"
2817
+ "name": "fill",
2818
+ "doc": "The used-tokens portion of that meter. Its width follows `usedTokens / maxTokens`; its default color is the severity hue picked by `warnThreshold` / `dangerThreshold`, so recoloring it from outside replaces that signal.",
2819
+ "recipe": "kai-context::part(fill) { background: var(--color-tool-blue) }"
2494
2820
  }
2495
- ],
2496
- "tokens": []
2821
+ ]
2497
2822
  },
2498
2823
  {
2499
2824
  "tag": "kai-conversations",
2500
2825
  "className": "KaiConversationsElement",
2501
2826
  "displayName": "Conversations",
2502
2827
  "props": [
2828
+ {
2829
+ "name": "theme",
2830
+ "type": "\"light\" | \"dark\" | \"auto\"",
2831
+ "optional": true,
2832
+ "scalar": true,
2833
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
2834
+ "default": "'auto'",
2835
+ "universal": true,
2836
+ "displayType": "\"light\" | \"dark\" | \"auto\""
2837
+ },
2503
2838
  {
2504
2839
  "name": "groups",
2505
- "type": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
2506
- "optional": false,
2840
+ "type": "undefined | { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
2841
+ "optional": true,
2507
2842
  "scalar": false,
2508
- "description": "Pre-bucketed conversation groups (e.g. \"Today\", \"Yesterday\"), each with its own conversations. Use this when you want to control the grouping/headers yourself; otherwise pass a flat `conversations` array. Set as a JS property.",
2843
+ "description": "The list's section headers (`{ id, name, sortOrder, createdAt }`), rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped list. Set as a JS property.",
2509
2844
  "typeName": "ConversationGroup[]",
2510
2845
  "typeShape": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
2511
2846
  "default": "[]",
2512
2847
  "typeImport": "ConversationGroup",
2513
- "displayType": "ConversationGroup[]"
2848
+ "displayType": "undefined | { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]"
2514
2849
  },
2515
2850
  {
2516
2851
  "name": "conversations",
2517
- "type": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
2518
- "optional": false,
2852
+ "type": "undefined | { id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
2853
+ "optional": true,
2519
2854
  "scalar": false,
2520
- "description": "A flat list of conversation summaries; the component buckets them by recency for you. Ignored when `groups` is provided. Set as a JS property.",
2855
+ "description": "Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing \"Ungrouped\" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state.",
2521
2856
  "typeName": "ConversationSummary[]",
2522
2857
  "typeShape": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
2523
2858
  "default": "[]",
2524
2859
  "typeImport": "ConversationSummary",
2525
- "displayType": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
2860
+ "displayType": "undefined | { id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
2526
2861
  },
2527
2862
  {
2528
2863
  "name": "activeId",
@@ -2598,7 +2933,7 @@
2598
2933
  "name": "select",
2599
2934
  "params": "id: string",
2600
2935
  "returns": "void",
2601
- "description": "Programmatically select a conversation by id mirror of the kai-conversation-select event (a convenience over driving `activeId`)."
2936
+ "description": "Programmatically select a conversation by id. The mirror of the kai-conversation-select event (a convenience over driving `activeId`)."
2602
2937
  },
2603
2938
  {
2604
2939
  "name": "collapse",
@@ -2635,6 +2970,17 @@
2635
2970
  "--color-sidebar",
2636
2971
  "--color-scrollbar-thumb"
2637
2972
  ],
2973
+ "declarativeChildren": [
2974
+ {
2975
+ "tag": "kai-conversation",
2976
+ "attributes": [
2977
+ "group-id",
2978
+ "id"
2979
+ ],
2980
+ "text": true,
2981
+ "description": "Parse a single light-DOM `<kai-conversation>` element into a `ConversationSummary`. Attribute mapping: - `id` → ConversationSummary.id - `group-id` → ConversationSummary.groupId (optional) - textContent → ConversationSummary.title Required fields not expressible as HTML attributes (`scope`, `messageCount`, `lastMessageAt`, `updatedAt`) receive safe defaults so the rendered list item is fully functional with just `id` + title text."
2982
+ }
2983
+ ],
2638
2984
  "slots": [
2639
2985
  {
2640
2986
  "name": "header",
@@ -2649,7 +2995,7 @@
2649
2995
  {
2650
2996
  "name": "footer",
2651
2997
  "mode": "inject",
2652
- "doc": "A row below the list account, settings, or usage."
2998
+ "doc": "A row below the list: account, settings, or usage."
2653
2999
  }
2654
3000
  ],
2655
3001
  "parts": [
@@ -2665,6 +3011,16 @@
2665
3011
  "className": "KaiDialogElement",
2666
3012
  "displayName": "Dialog",
2667
3013
  "props": [
3014
+ {
3015
+ "name": "theme",
3016
+ "type": "\"light\" | \"dark\" | \"auto\"",
3017
+ "optional": true,
3018
+ "scalar": true,
3019
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3020
+ "default": "'auto'",
3021
+ "universal": true,
3022
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3023
+ },
2668
3024
  {
2669
3025
  "name": "open",
2670
3026
  "type": "undefined | false | true",
@@ -2725,6 +3081,11 @@
2725
3081
  ],
2726
3082
  "tokens": [],
2727
3083
  "slots": [
3084
+ {
3085
+ "name": "",
3086
+ "mode": "inject",
3087
+ "doc": "The dialog body, between the `header` and `footer` slots."
3088
+ },
2728
3089
  {
2729
3090
  "name": "header",
2730
3091
  "mode": "inject",
@@ -2769,12 +3130,22 @@
2769
3130
  "className": "KaiEditableLabelElement",
2770
3131
  "displayName": "EditableLabel",
2771
3132
  "props": [
3133
+ {
3134
+ "name": "theme",
3135
+ "type": "\"light\" | \"dark\" | \"auto\"",
3136
+ "optional": true,
3137
+ "scalar": true,
3138
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3139
+ "default": "'auto'",
3140
+ "universal": true,
3141
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3142
+ },
2772
3143
  {
2773
3144
  "name": "value",
2774
3145
  "type": "undefined | string",
2775
3146
  "optional": true,
2776
3147
  "scalar": true,
2777
- "description": "The label text settable and reflected to the `value` attribute. Read `el.value` for live state.",
3148
+ "description": "The label text. Settable and reflected to the `value` attribute. Read `el.value` for live state.",
2778
3149
  "displayType": "undefined | string"
2779
3150
  },
2780
3151
  {
@@ -2823,7 +3194,19 @@
2823
3194
  "name": "edit",
2824
3195
  "params": "",
2825
3196
  "returns": "void",
2826
- "description": ""
3197
+ "description": "Switch the label into its editing field, which autofocuses and selects the current text. Same entry point as a user double-click, and a no-op while `disabled`. Commit with `commit()` or by blurring, abandon with `cancel()` or Escape."
3198
+ },
3199
+ {
3200
+ "name": "commit",
3201
+ "params": "",
3202
+ "returns": "void",
3203
+ "description": "Close the field and keep what was typed, exactly as blurring it does. `kai-rename` fires only when the text actually changed, so committing an untouched field is silent. A no-op while the field is closed."
3204
+ },
3205
+ {
3206
+ "name": "cancel",
3207
+ "params": "",
3208
+ "returns": "void",
3209
+ "description": "Abandon the edit, exactly as Escape does: the original text is restored, the field closes and `kai-cancel` fires. `kai-rename` never fires, even if the field was edited. Also works when `editing` was set programmatically and the field has not rendered yet."
2827
3210
  }
2828
3211
  ],
2829
3212
  "composedFrom": [
@@ -2852,6 +3235,16 @@
2852
3235
  "className": "KaiEmbedElement",
2853
3236
  "displayName": "Embed",
2854
3237
  "props": [
3238
+ {
3239
+ "name": "theme",
3240
+ "type": "\"light\" | \"dark\" | \"auto\"",
3241
+ "optional": true,
3242
+ "scalar": true,
3243
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3244
+ "default": "'auto'",
3245
+ "universal": true,
3246
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3247
+ },
2855
3248
  {
2856
3249
  "name": "cardId",
2857
3250
  "type": "undefined | string",
@@ -2866,6 +3259,9 @@
2866
3259
  "optional": true,
2867
3260
  "scalar": false,
2868
3261
  "description": "The embed payload (provider + id/url + options). Set as a JS **property** (object).",
3262
+ "typeName": "EmbedCardData",
3263
+ "typeShape": "{ provider: \"youtube\" | \"vimeo\" | \"generic\"; id?: undefined | string; url?: undefined | string; title?: undefined | string; poster?: undefined | string; start?: undefined | number; aspectRatio?: undefined | \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\" }",
3264
+ "typeImport": "EmbedCardData",
2869
3265
  "displayType": "undefined | { provider: \"youtube\" | \"vimeo\" | \"generic\"; id?: undefined | string; url?: undefined | string; title?: undefined | string; poster?: undefined | string; start?: undefined | number; aspectRatio?: undefined | \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\" }"
2870
3266
  }
2871
3267
  ],
@@ -2885,6 +3281,16 @@
2885
3281
  "className": "KaiEmptyElement",
2886
3282
  "displayName": "Empty",
2887
3283
  "props": [
3284
+ {
3285
+ "name": "theme",
3286
+ "type": "\"light\" | \"dark\" | \"auto\"",
3287
+ "optional": true,
3288
+ "scalar": true,
3289
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3290
+ "default": "'auto'",
3291
+ "universal": true,
3292
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3293
+ },
2888
3294
  {
2889
3295
  "name": "emptyTitle",
2890
3296
  "type": "undefined | string",
@@ -2938,19 +3344,41 @@
2938
3344
  "storyId": "solid-advanced-elements-emptycontent--docs"
2939
3345
  }
2940
3346
  ],
2941
- "tokens": []
2942
- },
2943
- {
3347
+ "tokens": [],
3348
+ "slots": [
3349
+ {
3350
+ "name": "",
3351
+ "mode": "inject",
3352
+ "doc": "The empty-state body below the title/description, usually the call to action."
3353
+ },
3354
+ {
3355
+ "name": "media",
3356
+ "mode": "replace",
3357
+ "doc": "The leading illustration or icon above the title (any inline SVG or <img>). Replaces the built-in media box."
3358
+ }
3359
+ ]
3360
+ },
3361
+ {
2944
3362
  "tag": "kai-feedback-bar",
2945
3363
  "className": "KaiFeedbackBarElement",
2946
3364
  "displayName": "FeedbackBar",
2947
3365
  "props": [
3366
+ {
3367
+ "name": "theme",
3368
+ "type": "\"light\" | \"dark\" | \"auto\"",
3369
+ "optional": true,
3370
+ "scalar": true,
3371
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3372
+ "default": "'auto'",
3373
+ "universal": true,
3374
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3375
+ },
2948
3376
  {
2949
3377
  "name": "barTitle",
2950
3378
  "type": "undefined | string",
2951
3379
  "optional": true,
2952
3380
  "scalar": true,
2953
- "description": "The banner label (e.g. \"Was this helpful?\"). Attribute: `bar-title` (`title` is avoided it's a global HTML attribute).",
3381
+ "description": "The banner label (e.g. \"Was this helpful?\"). Attribute: `bar-title` (`title` is avoided because it is a global HTML attribute).",
2954
3382
  "default": "'Was this helpful?'",
2955
3383
  "displayType": "undefined | string"
2956
3384
  },
@@ -3038,16 +3466,26 @@
3038
3466
  "className": "KaiFileTreeElement",
3039
3467
  "displayName": "FileTree",
3040
3468
  "props": [
3469
+ {
3470
+ "name": "theme",
3471
+ "type": "\"light\" | \"dark\" | \"auto\"",
3472
+ "optional": true,
3473
+ "scalar": true,
3474
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3475
+ "default": "'auto'",
3476
+ "universal": true,
3477
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3478
+ },
3041
3479
  {
3042
3480
  "name": "files",
3043
3481
  "type": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
3044
3482
  "optional": false,
3045
3483
  "scalar": false,
3046
3484
  "description": "The files to render. Set as a JS property (array of `{ path, url?, code?, language?, type?, additions?, deletions?, status? }`).",
3047
- "typeName": "FileTreeFile[]",
3485
+ "typeName": "ArtifactCardFile[]",
3048
3486
  "typeShape": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
3049
3487
  "default": "[]",
3050
- "typeImport": "FileTreeFile",
3488
+ "typeImport": "ArtifactCardFile",
3051
3489
  "displayType": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
3052
3490
  },
3053
3491
  {
@@ -3055,7 +3493,7 @@
3055
3493
  "type": "undefined | string",
3056
3494
  "optional": true,
3057
3495
  "scalar": true,
3058
- "description": "Selected file path highlighted in the tree.",
3496
+ "description": "Selected file path, highlighted in the tree.",
3059
3497
  "displayType": "undefined | string"
3060
3498
  },
3061
3499
  {
@@ -3121,6 +3559,16 @@
3121
3559
  "className": "KaiFileUploadElement",
3122
3560
  "displayName": "FileUpload",
3123
3561
  "props": [
3562
+ {
3563
+ "name": "theme",
3564
+ "type": "\"light\" | \"dark\" | \"auto\"",
3565
+ "optional": true,
3566
+ "scalar": true,
3567
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3568
+ "default": "'auto'",
3569
+ "universal": true,
3570
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3571
+ },
3124
3572
  {
3125
3573
  "name": "multiple",
3126
3574
  "type": "undefined | false | true",
@@ -3143,7 +3591,7 @@
3143
3591
  "type": "undefined | false | true",
3144
3592
  "optional": true,
3145
3593
  "scalar": true,
3146
- "description": "Disable the dropzone no clicking, no drag-and-drop.",
3594
+ "description": "Disable the dropzone: no clicking, no drag-and-drop.",
3147
3595
  "default": "false",
3148
3596
  "displayType": "undefined | false | true"
3149
3597
  },
@@ -3178,20 +3626,40 @@
3178
3626
  "storyId": "solid-advanced-elements-fileuploadtrigger--docs"
3179
3627
  }
3180
3628
  ],
3181
- "tokens": []
3629
+ "tokens": [],
3630
+ "slots": [
3631
+ {
3632
+ "name": "",
3633
+ "mode": "inject",
3634
+ "doc": "Custom dropzone content, replacing the default label (the `label` prop is the fallback)."
3635
+ }
3636
+ ]
3182
3637
  },
3183
3638
  {
3184
3639
  "tag": "kai-form",
3185
3640
  "className": "KaiFormElement",
3186
3641
  "displayName": "Form",
3187
3642
  "props": [
3643
+ {
3644
+ "name": "theme",
3645
+ "type": "\"light\" | \"dark\" | \"auto\"",
3646
+ "optional": true,
3647
+ "scalar": true,
3648
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3649
+ "default": "'auto'",
3650
+ "universal": true,
3651
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3652
+ },
3188
3653
  {
3189
3654
  "name": "data",
3190
- "type": "undefined | Record<string, unknown>",
3655
+ "type": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
3191
3656
  "optional": true,
3192
3657
  "scalar": false,
3193
- "description": "The form definition a JSON Schema (`type:'object'`) + `x-kai-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitn.ai/ui` for the full shape (it is self-referential, so the element types it loosely).",
3194
- "displayType": "undefined | Record<string, unknown>"
3658
+ "description": "The form definition: a JSON Schema (`type:'object'`) + `x-kai-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitn.ai/ui` for the full shape. It IS self-referential (`FormField.properties` is another `FormField` map), and the generated `element-types.d.ts` inlines every named type, so the shipped declaration bottoms out in a `Record<string, unknown>` placeholder one level down rather than carrying the recursion. That is why `FormDefinition` is a `type` alias: an interface gets no implicit index signature, so it would not be assignable to that placeholder.",
3659
+ "typeName": "FormDefinition",
3660
+ "typeShape": "{ type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }",
3661
+ "typeImport": "FormDefinition",
3662
+ "displayType": "undefined | { type: \"object\"; title?: undefined | string; description?: undefined | string; required?: undefined | string[]; properties: Record<string, { type: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\"; title?: undefined | string; description?: undefined | string; default?: unknown; enum?: undefined | unknown[]; format?: undefined | \"email\" | \"uri\" | \"url\" | \"date\" | \"date-time\" | \"time\"; minimum?: undefined | number; maximum?: undefined | number; minLength?: undefined | number; maxLength?: undefined | number; pattern?: undefined | string; minItems?: undefined | number; maxItems?: undefined | number; items?: undefined | Record<string, unknown> | { enum: unknown[] }; properties?: undefined | Record<string, Record<string, unknown>>; required?: undefined | string[]; readOnly?: undefined | false | true; \"x-kai-widget\"?: undefined | \"textarea\" | \"slider\" | \"rating\" | \"radio\" | \"select\" | \"checkbox\" | \"password\" | \"switch\"; \"x-kai-placeholder\"?: undefined | string; \"x-kai-step\"?: undefined | number }>; \"x-kai-order\"?: undefined | string[]; \"x-kai-inlineMax\"?: undefined | number; \"x-kai-submitLabel\"?: undefined | string; \"x-kai-dismissible\"?: undefined | false | true; \"x-kai-actions\"?: undefined | { id: string; label: string; variant?: undefined | \"default\" | \"ghost\" | \"outline\" }[] }"
3195
3663
  },
3196
3664
  {
3197
3665
  "name": "cardId",
@@ -3247,7 +3715,7 @@
3247
3715
  {
3248
3716
  "name": "kai-values-change",
3249
3717
  "detail": "{ values: Record<string, unknown>; valid: false | true }",
3250
- "description": "The form's values changed on input current coerced values + validity.",
3718
+ "description": "The form's values changed on input. Carries the current coerced values + validity.",
3251
3719
  "displayDetail": "{ values: Record<string, unknown>; valid: false | true }"
3252
3720
  }
3253
3721
  ],
@@ -3262,7 +3730,7 @@
3262
3730
  "name": "send",
3263
3731
  "params": "",
3264
3732
  "returns": "void",
3265
- "description": "Validate + submit programmatically focus the first invalid field on failure, else emit the `submit` CardEvent and resolve. Named `send`, not `submit`."
3733
+ "description": "Validate + submit programmatically: focus the first invalid field on failure, else emit the `submit` CardEvent and resolve. Named `send`, not `submit`."
3266
3734
  },
3267
3735
  {
3268
3736
  "name": "validate",
@@ -3303,6 +3771,16 @@
3303
3771
  "className": "KaiHoverCardElement",
3304
3772
  "displayName": "HoverCard",
3305
3773
  "props": [
3774
+ {
3775
+ "name": "theme",
3776
+ "type": "\"light\" | \"dark\" | \"auto\"",
3777
+ "optional": true,
3778
+ "scalar": true,
3779
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3780
+ "default": "'auto'",
3781
+ "universal": true,
3782
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3783
+ },
3306
3784
  {
3307
3785
  "name": "openDelay",
3308
3786
  "type": "undefined | number",
@@ -3399,6 +3877,11 @@
3399
3877
  ],
3400
3878
  "tokens": [],
3401
3879
  "slots": [
3880
+ {
3881
+ "name": "",
3882
+ "mode": "inject",
3883
+ "doc": "The TRIGGER the card hovers off. The card body is the `card` slot."
3884
+ },
3402
3885
  {
3403
3886
  "name": "card",
3404
3887
  "mode": "inject",
@@ -3411,6 +3894,16 @@
3411
3894
  "className": "KaiIconElement",
3412
3895
  "displayName": "Icon",
3413
3896
  "props": [
3897
+ {
3898
+ "name": "theme",
3899
+ "type": "\"light\" | \"dark\" | \"auto\"",
3900
+ "optional": true,
3901
+ "scalar": true,
3902
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3903
+ "default": "'auto'",
3904
+ "universal": true,
3905
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3906
+ },
3414
3907
  {
3415
3908
  "name": "name",
3416
3909
  "type": "undefined | string",
@@ -3447,6 +3940,16 @@
3447
3940
  "className": "KaiImageElement",
3448
3941
  "displayName": "Image",
3449
3942
  "props": [
3943
+ {
3944
+ "name": "theme",
3945
+ "type": "\"light\" | \"dark\" | \"auto\"",
3946
+ "optional": true,
3947
+ "scalar": true,
3948
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
3949
+ "default": "'auto'",
3950
+ "universal": true,
3951
+ "displayType": "\"light\" | \"dark\" | \"auto\""
3952
+ },
3450
3953
  {
3451
3954
  "name": "base64",
3452
3955
  "type": "undefined | string",
@@ -3497,6 +4000,16 @@
3497
4000
  "className": "KaiInputElement",
3498
4001
  "displayName": "Input",
3499
4002
  "props": [
4003
+ {
4004
+ "name": "theme",
4005
+ "type": "\"light\" | \"dark\" | \"auto\"",
4006
+ "optional": true,
4007
+ "scalar": true,
4008
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4009
+ "default": "'auto'",
4010
+ "universal": true,
4011
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4012
+ },
3500
4013
  {
3501
4014
  "name": "type",
3502
4015
  "type": "undefined | string",
@@ -3511,7 +4024,7 @@
3511
4024
  "type": "undefined | string",
3512
4025
  "optional": true,
3513
4026
  "scalar": true,
3514
- "description": "Controlled value settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state.",
4027
+ "description": "Controlled value. Settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state.",
3515
4028
  "displayType": "undefined | string"
3516
4029
  },
3517
4030
  {
@@ -3694,22 +4207,32 @@
3694
4207
  "className": "KaiKbdElement",
3695
4208
  "displayName": "Kbd",
3696
4209
  "props": [
4210
+ {
4211
+ "name": "theme",
4212
+ "type": "\"light\" | \"dark\" | \"auto\"",
4213
+ "optional": true,
4214
+ "scalar": true,
4215
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4216
+ "default": "'auto'",
4217
+ "universal": true,
4218
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4219
+ },
3697
4220
  {
3698
4221
  "name": "keys",
3699
4222
  "type": "undefined | string",
3700
4223
  "optional": true,
3701
4224
  "scalar": true,
3702
- "description": "Shortcut spec tokens joined by `+` (e.g. `Mod+Shift+K`). Omit it to show default-slot content instead. Display only; the element does not bind keys.",
4225
+ "description": "Shortcut spec: tokens joined by `+` (e.g. `Mod+Shift+K`). Omit it to show default-slot content instead. Display only; the element does not bind keys.",
3703
4226
  "displayType": "undefined | string"
3704
4227
  },
3705
4228
  {
3706
4229
  "name": "platform",
3707
- "type": "undefined | \"other\" | \"auto\" | \"mac\"",
4230
+ "type": "undefined | \"auto\" | \"mac\" | \"other\"",
3708
4231
  "optional": true,
3709
4232
  "scalar": true,
3710
4233
  "description": "`mac` uses ⌘/⌥, `other` uses Ctrl. `auto` (default) sniffs the OS.",
3711
4234
  "default": "'auto'",
3712
- "displayType": "undefined | \"other\" | \"auto\" | \"mac\""
4235
+ "displayType": "undefined | \"auto\" | \"mac\" | \"other\""
3713
4236
  },
3714
4237
  {
3715
4238
  "name": "size",
@@ -3731,6 +4254,13 @@
3731
4254
  }
3732
4255
  ],
3733
4256
  "tokens": [],
4257
+ "slots": [
4258
+ {
4259
+ "name": "",
4260
+ "mode": "inject",
4261
+ "doc": "Literal key text, when you are not using the `keys` prop to render key caps."
4262
+ }
4263
+ ],
3734
4264
  "parts": [
3735
4265
  {
3736
4266
  "name": "key",
@@ -3749,6 +4279,16 @@
3749
4279
  "className": "KaiLinkPreviewElement",
3750
4280
  "displayName": "LinkPreview",
3751
4281
  "props": [
4282
+ {
4283
+ "name": "theme",
4284
+ "type": "\"light\" | \"dark\" | \"auto\"",
4285
+ "optional": true,
4286
+ "scalar": true,
4287
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4288
+ "default": "'auto'",
4289
+ "universal": true,
4290
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4291
+ },
3752
4292
  {
3753
4293
  "name": "cardId",
3754
4294
  "type": "undefined | string",
@@ -3763,6 +4303,9 @@
3763
4303
  "optional": true,
3764
4304
  "scalar": false,
3765
4305
  "description": "The link payload (OG metadata). Set as a JS **property** (object).",
4306
+ "typeName": "LinkPreviewData",
4307
+ "typeShape": "{ url: string; title?: undefined | string; description?: undefined | string; image?: undefined | string; imageAlt?: undefined | string; favicon?: undefined | string; domain?: undefined | string; siteName?: undefined | string }",
4308
+ "typeImport": "LinkPreviewData",
3766
4309
  "displayType": "undefined | { url: string; title?: undefined | string; description?: undefined | string; image?: undefined | string; imageAlt?: undefined | string; favicon?: undefined | string; domain?: undefined | string; siteName?: undefined | string }"
3767
4310
  }
3768
4311
  ],
@@ -3782,6 +4325,16 @@
3782
4325
  "className": "KaiLoaderElement",
3783
4326
  "displayName": "Loader",
3784
4327
  "props": [
4328
+ {
4329
+ "name": "theme",
4330
+ "type": "\"light\" | \"dark\" | \"auto\"",
4331
+ "optional": true,
4332
+ "scalar": true,
4333
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4334
+ "default": "'auto'",
4335
+ "universal": true,
4336
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4337
+ },
3785
4338
  {
3786
4339
  "name": "variant",
3787
4340
  "type": "undefined | \"circular\" | \"classic\" | \"pulse\" | \"pulse-dot\" | \"dots\" | \"typing\" | \"wave\" | \"bars\" | \"terminal\" | \"text-blink\" | \"text-shimmer\" | \"loading-dots\"",
@@ -3825,6 +4378,16 @@
3825
4378
  "className": "KaiMarkdownElement",
3826
4379
  "displayName": "Markdown",
3827
4380
  "props": [
4381
+ {
4382
+ "name": "theme",
4383
+ "type": "\"light\" | \"dark\" | \"auto\"",
4384
+ "optional": true,
4385
+ "scalar": true,
4386
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4387
+ "default": "'auto'",
4388
+ "universal": true,
4389
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4390
+ },
3828
4391
  {
3829
4392
  "name": "content",
3830
4393
  "type": "string",
@@ -3836,12 +4399,12 @@
3836
4399
  },
3837
4400
  {
3838
4401
  "name": "proseSize",
3839
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
4402
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
3840
4403
  "optional": true,
3841
4404
  "scalar": true,
3842
4405
  "description": "Text/markdown sizing.",
3843
4406
  "default": "'sm'",
3844
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
4407
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
3845
4408
  },
3846
4409
  {
3847
4410
  "name": "codeTheme",
@@ -3878,12 +4441,25 @@
3878
4441
  "className": "KaiMenuElement",
3879
4442
  "displayName": "Menu",
3880
4443
  "props": [
4444
+ {
4445
+ "name": "theme",
4446
+ "type": "\"light\" | \"dark\" | \"auto\"",
4447
+ "optional": true,
4448
+ "scalar": true,
4449
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4450
+ "default": "'auto'",
4451
+ "universal": true,
4452
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4453
+ },
3881
4454
  {
3882
4455
  "name": "items",
3883
4456
  "type": "undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[]",
3884
4457
  "optional": true,
3885
4458
  "scalar": false,
3886
- "description": "Tree of menu items. Set as a JS property not an HTML attribute.",
4459
+ "description": "Tree of menu items. Set as a JS property, not an HTML attribute.",
4460
+ "typeName": "KaiMenuItem[]",
4461
+ "typeShape": "{ id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[] }[]",
4462
+ "typeImport": "KaiMenuItem",
3887
4463
  "displayType": "undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[]"
3888
4464
  },
3889
4465
  {
@@ -3899,7 +4475,7 @@
3899
4475
  "type": "undefined | string",
3900
4476
  "optional": true,
3901
4477
  "scalar": true,
3902
- "description": "Built-in trigger: leading icon (a named icon like `\"plus\"`, an image URL/data-URI, or text). Use this instead of slotting `slot=\"trigger\"` for the common case a slotted trigger overrides it.",
4478
+ "description": "Built-in trigger: leading icon (a named icon like `\"plus\"`, an image URL/data-URI, or text). Use this instead of slotting `slot=\"trigger\"` for the common case; a slotted trigger overrides it.",
3903
4479
  "displayType": "undefined | string"
3904
4480
  },
3905
4481
  {
@@ -3907,7 +4483,7 @@
3907
4483
  "type": "undefined | string",
3908
4484
  "optional": true,
3909
4485
  "scalar": true,
3910
- "description": "Built-in trigger: a text label (e.g. `\"High\"`).",
4486
+ "description": "Built-in trigger: a text label (e.g. `\"High\"`). This is the trigger's VISIBLE text, so it is also its accessible name, and `label` does not override it: an accessible name that does not contain the visible text is unreachable by speech input, which is what WCAG 2.5.3 (Label in Name) exists for. A slotted `slot=\"trigger\"` replaces this built-in trigger entirely and is named differently; see `label`.",
3911
4487
  "displayType": "undefined | string"
3912
4488
  },
3913
4489
  {
@@ -3923,7 +4499,7 @@
3923
4499
  "type": "undefined | string",
3924
4500
  "optional": true,
3925
4501
  "scalar": true,
3926
- "description": "Accessible name for an icon-only trigger (no visible label).",
4502
+ "description": "Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot=\"trigger\"`, and that is a difference in what the two slots MEAN, not a limitation. `<kai-button>`'s slot IS the button's label, so text slotted there is the name and `label` steps aside. This slot is VISUAL content, a `+` or an `<svg>`, with the name supplied separately: decoration beside a name, never a second name competing with one. So `label` names the trigger here by design. Slotting a real WORD rather than a glyph makes that word a visible label, and an accessible name has to contain the visible text. Then either drop `label` or make it contain the word you slotted.",
3927
4503
  "displayType": "undefined | string"
3928
4504
  },
3929
4505
  {
@@ -3947,7 +4523,7 @@
3947
4523
  "type": "undefined | false | true",
3948
4524
  "optional": true,
3949
4525
  "scalar": true,
3950
- "description": "Disable the trigger click/keyboard and `show()` no longer open the menu.",
4526
+ "description": "Disable the trigger: click/keyboard and `show()` no longer open the menu.",
3951
4527
  "displayType": "undefined | false | true"
3952
4528
  }
3953
4529
  ],
@@ -3961,7 +4537,7 @@
3961
4537
  {
3962
4538
  "name": "kai-select",
3963
4539
  "detail": "{ id: string; checked?: undefined | false | true; radioGroup?: undefined | string }",
3964
- "description": "Fired when the user selects a leaf item. - Plain items: `{ id }`. - Checkbox items: `{ id, checked }` where `checked` is the NEW state. - Radio items: `{ id, radioGroup }` the consumer marks `id` as the selected one in `radioGroup` and clears the others.",
4540
+ "description": "Fired when the user selects a leaf item. - Plain items: `{ id }`. - Checkbox items: `{ id, checked }` where `checked` is the NEW state. - Radio items: `{ id, radioGroup }`, where the consumer marks `id` as the selected one in `radioGroup` and clears the others.",
3965
4541
  "displayDetail": "{ id: string; checked?: undefined | false | true; radioGroup?: undefined | string }"
3966
4542
  }
3967
4543
  ],
@@ -4068,31 +4644,36 @@
4068
4644
  "className": "KaiMessageElement",
4069
4645
  "displayName": "Message",
4070
4646
  "props": [
4647
+ {
4648
+ "name": "theme",
4649
+ "type": "\"light\" | \"dark\" | \"auto\"",
4650
+ "optional": true,
4651
+ "scalar": true,
4652
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4653
+ "default": "'auto'",
4654
+ "universal": true,
4655
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4656
+ },
4071
4657
  {
4072
4658
  "name": "message",
4073
- "type": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }",
4659
+ "type": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }",
4074
4660
  "optional": true,
4075
4661
  "scalar": false,
4076
4662
  "description": "The full message object. Set as a JS property.",
4077
- "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }"
4663
+ "typeName": "ChatMessage",
4664
+ "typeShape": "{ id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }",
4665
+ "typeImport": "ChatMessage",
4666
+ "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }"
4078
4667
  },
4079
4668
  {
4080
4669
  "name": "role",
4081
4670
  "type": "undefined | \"user\" | \"assistant\"",
4082
4671
  "optional": true,
4083
4672
  "scalar": true,
4084
- "description": "Convenience for simple cases when not passing a `message` object.",
4673
+ "description": "Who is speaking: `'user'` or `'assistant'`. Convenience for simple cases when not passing a `message` object. This is the SEMANTIC role of the message, not an ARIA role. The name collides with the global ARIA `role` attribute, which is why the facade lifts it off the host (see `liftRoleOffHost`). Neither speaker is a valid ARIA role, so a `role=\"user\"` left on `<kai-message>` is a CRITICAL axe `aria-roles` violation. The accessible role lives on the row inside the shadow root instead: `role=\"article\"` plus an `aria-label` naming the speaker, matching the SolidJS `<Message>` component.",
4085
4674
  "default": "'assistant'",
4086
4675
  "displayType": "undefined | \"user\" | \"assistant\""
4087
4676
  },
4088
- {
4089
- "name": "content",
4090
- "type": "undefined | string",
4091
- "optional": true,
4092
- "scalar": true,
4093
- "description": "Convenience content (used when `message` is not set).",
4094
- "displayType": "undefined | string"
4095
- },
4096
4677
  {
4097
4678
  "name": "markdown",
4098
4679
  "type": "undefined | false | true",
@@ -4103,12 +4684,12 @@
4103
4684
  },
4104
4685
  {
4105
4686
  "name": "proseSize",
4106
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
4687
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
4107
4688
  "optional": true,
4108
4689
  "scalar": true,
4109
4690
  "description": "Text/markdown sizing for the message body.",
4110
4691
  "default": "'sm'",
4111
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
4692
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
4112
4693
  },
4113
4694
  {
4114
4695
  "name": "codeTheme",
@@ -4160,6 +4741,22 @@
4160
4741
  "scalar": true,
4161
4742
  "description": "Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans the full row (predictable layout when you never show avatars). Any other value keeps the default behaviour: the built-in avatar when one resolves, or your `slot=\"avatar\"` content when projected (which REPLACES the built-in).",
4162
4743
  "displayType": "undefined | string"
4744
+ },
4745
+ {
4746
+ "name": "cardTypes",
4747
+ "type": "undefined | Record<string, string>",
4748
+ "optional": true,
4749
+ "scalar": false,
4750
+ "description": "Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
4751
+ "displayType": "undefined | Record<string, string>"
4752
+ },
4753
+ {
4754
+ "name": "cardSchemas",
4755
+ "type": "undefined | Record<string, object>",
4756
+ "optional": true,
4757
+ "scalar": false,
4758
+ "description": "JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `\"type\"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one.",
4759
+ "displayType": "undefined | Record<string, object>"
4163
4760
  }
4164
4761
  ],
4165
4762
  "events": [
@@ -4196,16 +4793,29 @@
4196
4793
  }
4197
4794
  ],
4198
4795
  "tokens": [],
4796
+ "declarativeChildren": [
4797
+ {
4798
+ "tag": "kai-action",
4799
+ "attributes": [
4800
+ "action",
4801
+ "icon",
4802
+ "id",
4803
+ "label",
4804
+ "tooltip"
4805
+ ],
4806
+ "text": true
4807
+ }
4808
+ ],
4199
4809
  "slots": [
4200
4810
  {
4201
4811
  "name": "before-body",
4202
4812
  "mode": "inject",
4203
- "doc": "A per-message header at the TOP of the body, above reasoning/tools/content a model-name label, a role + timestamp line."
4813
+ "doc": "A per-message header at the TOP of the body, above reasoning/tools/content: a model-name label, a role + timestamp line."
4204
4814
  },
4205
4815
  {
4206
4816
  "name": "after-body",
4207
4817
  "mode": "inject",
4208
- "doc": "A row at the BOTTOM of the body, below the action bar a citation/sources row, a token-cost/latency line."
4818
+ "doc": "A row at the BOTTOM of the body, below the action bar: a citation/sources row, a token-cost/latency line."
4209
4819
  },
4210
4820
  {
4211
4821
  "name": "avatar",
@@ -4235,6 +4845,11 @@
4235
4845
  "doc": "The action-bar row (copy / like / regenerate …). Restyle its spacing or hide it entirely from outside.",
4236
4846
  "recipe": "kai-message::part(actions) { gap: 0.25rem }"
4237
4847
  },
4848
+ {
4849
+ "name": "citations",
4850
+ "doc": "The citation row rendered from the message’s `source` parts: a wrapped row of chips below the bubble, never inside it. Restyle its spacing or hide it entirely from outside.",
4851
+ "recipe": "kai-message::part(citations) { gap: 0.5rem }"
4852
+ },
4238
4853
  {
4239
4854
  "name": "avatar",
4240
4855
  "doc": "Replaces the built-in avatar rail with your own node. Use `avatar=\"none\"` to omit the rail and let the body span the full row."
@@ -4246,17 +4861,27 @@
4246
4861
  "className": "KaiModelSwitcherElement",
4247
4862
  "displayName": "ModelSwitcher",
4248
4863
  "props": [
4864
+ {
4865
+ "name": "theme",
4866
+ "type": "\"light\" | \"dark\" | \"auto\"",
4867
+ "optional": true,
4868
+ "scalar": true,
4869
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4870
+ "default": "'auto'",
4871
+ "universal": true,
4872
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4873
+ },
4249
4874
  {
4250
4875
  "name": "models",
4251
- "type": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
4252
- "optional": false,
4876
+ "type": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
4877
+ "optional": true,
4253
4878
  "scalar": false,
4254
- "description": "The selectable models. Set as a JS property (array).",
4879
+ "description": "The selectable models. Set as a JS property (array). Omit to supply them as `<kai-model>` light-DOM children instead; when both are present the property's models come first.",
4255
4880
  "typeName": "ModelOption[]",
4256
4881
  "typeShape": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
4257
4882
  "default": "[]",
4258
4883
  "typeImport": "ModelOption",
4259
- "displayType": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
4884
+ "displayType": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
4260
4885
  },
4261
4886
  {
4262
4887
  "name": "currentModel",
@@ -4287,7 +4912,7 @@
4287
4912
  "type": "undefined | false | true",
4288
4913
  "optional": true,
4289
4914
  "scalar": true,
4290
- "description": "Disable the trigger click/keyboard and `show()` no longer open the dropdown.",
4915
+ "description": "Disable the trigger: click/keyboard and `show()` no longer open the dropdown.",
4291
4916
  "displayType": "undefined | false | true"
4292
4917
  }
4293
4918
  ],
@@ -4332,20 +4957,46 @@
4332
4957
  "storyId": "solid-advanced-elements-modelswitcher--docs"
4333
4958
  }
4334
4959
  ],
4335
- "tokens": []
4960
+ "tokens": [],
4961
+ "declarativeChildren": [
4962
+ {
4963
+ "tag": "kai-model",
4964
+ "attributes": [
4965
+ "description",
4966
+ "group",
4967
+ "id",
4968
+ "provider"
4969
+ ],
4970
+ "text": true,
4971
+ "description": "Parse a single light-DOM `<kai-model>` element into a `ModelOption` descriptor. Attribute mapping: - `id` → ModelOption.id - textContent → ModelOption.name - `provider` → ModelOption.provider (optional) - `description` → ModelOption.description (optional subtitle) - `group` → ModelOption.group (optional collapsible section)"
4972
+ }
4973
+ ]
4336
4974
  },
4337
4975
  {
4338
4976
  "tag": "kai-nav",
4339
4977
  "className": "KaiNavElement",
4340
4978
  "displayName": "Nav",
4341
4979
  "props": [
4980
+ {
4981
+ "name": "theme",
4982
+ "type": "\"light\" | \"dark\" | \"auto\"",
4983
+ "optional": true,
4984
+ "scalar": true,
4985
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
4986
+ "default": "'auto'",
4987
+ "universal": true,
4988
+ "displayType": "\"light\" | \"dark\" | \"auto\""
4989
+ },
4342
4990
  {
4343
4991
  "name": "items",
4344
- "type": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]",
4992
+ "type": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]",
4345
4993
  "optional": true,
4346
4994
  "scalar": false,
4347
4995
  "description": "The nav items. Set as a JS property (array, not an attribute). Each item may carry `children` (a collapsible group), a `status` dot, and trailing `meta` text.",
4348
- "displayType": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]"
4996
+ "typeName": "KaiNavItem[]",
4997
+ "typeShape": "{ id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]; status?: undefined | { tone: \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]",
4998
+ "typeImport": "KaiNavItem",
4999
+ "displayType": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]"
4349
5000
  },
4350
5001
  {
4351
5002
  "name": "value",
@@ -4451,14 +5102,24 @@
4451
5102
  "className": "KaiNoticeElement",
4452
5103
  "displayName": "Notice",
4453
5104
  "props": [
5105
+ {
5106
+ "name": "theme",
5107
+ "type": "\"light\" | \"dark\" | \"auto\"",
5108
+ "optional": true,
5109
+ "scalar": true,
5110
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5111
+ "default": "'auto'",
5112
+ "universal": true,
5113
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5114
+ },
4454
5115
  {
4455
5116
  "name": "severity",
4456
- "type": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"",
5117
+ "type": "undefined | \"neutral\" | \"info\" | \"warning\" | \"error\" | \"success\"",
4457
5118
  "optional": true,
4458
5119
  "scalar": true,
4459
5120
  "description": "`neutral` (default) · `info` · `warning` · `error` · `success`. Drives the leading icon's color and the a11y role (`alert` for errors, else `status`).",
4460
5121
  "default": "'neutral'",
4461
- "displayType": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\""
5122
+ "displayType": "undefined | \"neutral\" | \"info\" | \"warning\" | \"error\" | \"success\""
4462
5123
  },
4463
5124
  {
4464
5125
  "name": "icon",
@@ -4496,15 +5157,20 @@
4496
5157
  ],
4497
5158
  "tokens": [],
4498
5159
  "slots": [
5160
+ {
5161
+ "name": "",
5162
+ "mode": "inject",
5163
+ "doc": "The notice message. `icon` and `action` are the named seams around it."
5164
+ },
4499
5165
  {
4500
5166
  "name": "action",
4501
5167
  "mode": "inject",
4502
- "doc": "A trailing action beside the message a link or button."
5168
+ "doc": "A trailing action beside the message: a link or button."
4503
5169
  },
4504
5170
  {
4505
5171
  "name": "icon",
4506
5172
  "mode": "replace",
4507
- "doc": "A custom leading icon (any inline SVG, inherits `currentColor`). Overrides the severity default and the `icon` prop the same escape hatch as `kai-button`."
5173
+ "doc": "A custom leading icon (any inline SVG, inherits `currentColor`). Overrides the severity default and the `icon` prop, the same escape hatch as `kai-button`."
4508
5174
  }
4509
5175
  ]
4510
5176
  },
@@ -4513,6 +5179,16 @@
4513
5179
  "className": "KaiPaneElement",
4514
5180
  "displayName": "Pane",
4515
5181
  "props": [
5182
+ {
5183
+ "name": "theme",
5184
+ "type": "\"light\" | \"dark\" | \"auto\"",
5185
+ "optional": true,
5186
+ "scalar": true,
5187
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5188
+ "default": "'auto'",
5189
+ "universal": true,
5190
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5191
+ },
4516
5192
  {
4517
5193
  "name": "headline",
4518
5194
  "type": "undefined | string",
@@ -4572,6 +5248,9 @@
4572
5248
  "optional": true,
4573
5249
  "scalar": false,
4574
5250
  "description": "A tone-colored status dot (+ optional label) in the header. An object `{ tone, label?, pulse? }` set as a JS PROPERTY (not an attribute).",
5251
+ "typeName": "PaneStatus",
5252
+ "typeShape": "{ tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }",
5253
+ "typeImport": "PaneStatus",
4575
5254
  "displayType": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
4576
5255
  }
4577
5256
  ],
@@ -4591,7 +5270,7 @@
4591
5270
  {
4592
5271
  "name": "kai-maximize",
4593
5272
  "detail": "{ maximized: false | true }",
4594
- "description": "The maximize/restore control was clicked. `detail.maximized` is the intended NEXT state drive the `maximized` prop yourself from it.",
5273
+ "description": "The maximize/restore control was clicked. `detail.maximized` is the intended NEXT state. Drive the `maximized` prop yourself from it.",
4595
5274
  "displayDetail": "{ maximized: false | true }"
4596
5275
  },
4597
5276
  {
@@ -4611,6 +5290,11 @@
4611
5290
  ],
4612
5291
  "tokens": [],
4613
5292
  "slots": [
5293
+ {
5294
+ "name": "",
5295
+ "mode": "inject",
5296
+ "doc": "The pane body, below the header row."
5297
+ },
4614
5298
  {
4615
5299
  "name": "leading",
4616
5300
  "mode": "inject",
@@ -4655,12 +5339,25 @@
4655
5339
  "className": "KaiPaneGroupElement",
4656
5340
  "displayName": "PaneGroup",
4657
5341
  "props": [
5342
+ {
5343
+ "name": "theme",
5344
+ "type": "\"light\" | \"dark\" | \"auto\"",
5345
+ "optional": true,
5346
+ "scalar": true,
5347
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5348
+ "default": "'auto'",
5349
+ "universal": true,
5350
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5351
+ },
4658
5352
  {
4659
5353
  "name": "tabs",
4660
5354
  "type": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
4661
5355
  "optional": true,
4662
5356
  "scalar": false,
4663
5357
  "description": "The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute).",
5358
+ "typeName": "PaneTab[]",
5359
+ "typeShape": "{ id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
5360
+ "typeImport": "PaneTab",
4664
5361
  "displayType": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]"
4665
5362
  },
4666
5363
  {
@@ -4723,6 +5420,13 @@
4723
5420
  }
4724
5421
  ],
4725
5422
  "tokens": [],
5423
+ "slots": [
5424
+ {
5425
+ "name": "",
5426
+ "mode": "inject",
5427
+ "doc": "Content shown for every tab. Use it INSTEAD of the per-tab `slot=\"<tab id>\"` seams when you swap the content yourself."
5428
+ }
5429
+ ],
4726
5430
  "parts": [
4727
5431
  {
4728
5432
  "name": "tabs",
@@ -4756,14 +5460,24 @@
4756
5460
  "className": "KaiPopoverElement",
4757
5461
  "displayName": "Popover",
4758
5462
  "props": [
5463
+ {
5464
+ "name": "theme",
5465
+ "type": "\"light\" | \"dark\" | \"auto\"",
5466
+ "optional": true,
5467
+ "scalar": true,
5468
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5469
+ "default": "'auto'",
5470
+ "universal": true,
5471
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5472
+ },
4759
5473
  {
4760
5474
  "name": "placement",
4761
- "type": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\"",
5475
+ "type": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"bottom-end\" | \"bottom-start\" | \"left-end\" | \"left-start\" | \"right-end\" | \"right-start\" | \"top-end\" | \"top-start\"",
4762
5476
  "optional": true,
4763
5477
  "scalar": true,
4764
5478
  "description": "Floating placement relative to the trigger (floating-ui placement).",
4765
5479
  "default": "'bottom-start'",
4766
- "displayType": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\""
5480
+ "displayType": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"bottom-end\" | \"bottom-start\" | \"left-end\" | \"left-start\" | \"right-end\" | \"right-start\" | \"top-end\" | \"top-start\""
4767
5481
  },
4768
5482
  {
4769
5483
  "name": "gutter",
@@ -4834,13 +5548,35 @@
4834
5548
  "storyId": "solid-advanced-primitives-popover--docs"
4835
5549
  }
4836
5550
  ],
4837
- "tokens": []
5551
+ "tokens": [],
5552
+ "slots": [
5553
+ {
5554
+ "name": "",
5555
+ "mode": "inject",
5556
+ "doc": "The popover panel body. The control that opens it is the `trigger` slot."
5557
+ },
5558
+ {
5559
+ "name": "trigger",
5560
+ "mode": "replace",
5561
+ "doc": "The control that opens the popover (a button, an avatar, …). The panel anchors to it."
5562
+ }
5563
+ ]
4838
5564
  },
4839
5565
  {
4840
5566
  "tag": "kai-progress-bar",
4841
5567
  "className": "KaiProgressBarElement",
4842
5568
  "displayName": "ProgressBar",
4843
5569
  "props": [
5570
+ {
5571
+ "name": "theme",
5572
+ "type": "\"light\" | \"dark\" | \"auto\"",
5573
+ "optional": true,
5574
+ "scalar": true,
5575
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5576
+ "default": "'auto'",
5577
+ "universal": true,
5578
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5579
+ },
4844
5580
  {
4845
5581
  "name": "value",
4846
5582
  "type": "undefined | number",
@@ -4903,23 +5639,33 @@
4903
5639
  "className": "KaiPromptDockElement",
4904
5640
  "displayName": "PromptDock",
4905
5641
  "props": [
5642
+ {
5643
+ "name": "theme",
5644
+ "type": "\"light\" | \"dark\" | \"auto\"",
5645
+ "optional": true,
5646
+ "scalar": true,
5647
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5648
+ "default": "'auto'",
5649
+ "universal": true,
5650
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5651
+ },
4906
5652
  {
4907
5653
  "name": "frame",
4908
- "type": "undefined | \"none\" | \"inset\" | \"edge\"",
5654
+ "type": "undefined | \"inset\" | \"edge\" | \"none\"",
4909
5655
  "optional": true,
4910
5656
  "scalar": true,
4911
- "description": "How the tray frames the input the SPATIAL inset axis: `inset` (default, the classic recessed frame on every side) | `edge` (top/bottom inset only; the input sits flush left/right so the lips span the full width) | `none` (no inset; the lips attach directly as a plain stack). Attribute: `frame`.",
5657
+ "description": "How the tray frames the input, the SPATIAL inset axis: `inset` (default, the classic recessed frame on every side) | `edge` (top/bottom inset only; the input sits flush left/right so the lips span the full width) | `none` (no inset; the lips attach directly as a plain stack). Attribute: `frame`.",
4912
5658
  "default": "'inset'",
4913
- "displayType": "undefined | \"none\" | \"inset\" | \"edge\""
5659
+ "displayType": "undefined | \"inset\" | \"edge\" | \"none\""
4914
5660
  },
4915
5661
  {
4916
5662
  "name": "appearance",
4917
- "type": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\"",
5663
+ "type": "undefined | \"soft\" | \"outlined\" | \"filled\" | \"plain\"",
4918
5664
  "optional": true,
4919
5665
  "scalar": true,
4920
- "description": "How the tray surface looks the VISUAL axis, orthogonal to `frame`: `soft` (default, sunken surface + border + radius) | `outlined` (transparent + border + radius) | `filled` (sunken, no border, + radius) | `plain` (bare). Attribute: `appearance`.",
5666
+ "description": "How the tray surface looks, the VISUAL axis orthogonal to `frame`: `soft` (default, sunken surface + border + radius) | `outlined` (transparent + border + radius) | `filled` (sunken, no border, + radius) | `plain` (bare). Attribute: `appearance`.",
4921
5667
  "default": "'soft'",
4922
- "displayType": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\""
5668
+ "displayType": "undefined | \"soft\" | \"outlined\" | \"filled\" | \"plain\""
4923
5669
  }
4924
5670
  ],
4925
5671
  "events": [],
@@ -4933,6 +5679,11 @@
4933
5679
  ],
4934
5680
  "tokens": [],
4935
5681
  "slots": [
5682
+ {
5683
+ "name": "",
5684
+ "mode": "inject",
5685
+ "doc": "The input the dock wraps, typically a `<kai-prompt-input>`. The `top`/`bottom` slots are the lips around it."
5686
+ },
4936
5687
  {
4937
5688
  "name": "top",
4938
5689
  "mode": "inject",
@@ -4967,6 +5718,16 @@
4967
5718
  "className": "KaiPromptInputElement",
4968
5719
  "displayName": "PromptInput",
4969
5720
  "props": [
5721
+ {
5722
+ "name": "theme",
5723
+ "type": "\"light\" | \"dark\" | \"auto\"",
5724
+ "optional": true,
5725
+ "scalar": true,
5726
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
5727
+ "default": "'auto'",
5728
+ "universal": true,
5729
+ "displayType": "\"light\" | \"dark\" | \"auto\""
5730
+ },
4970
5731
  {
4971
5732
  "name": "value",
4972
5733
  "type": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]",
@@ -5051,7 +5812,7 @@
5051
5812
  "type": "undefined | \"always\" | \"auto\"",
5052
5813
  "optional": true,
5053
5814
  "scalar": true,
5054
- "description": "Send-button visibility. `'always'` (default) always shows it; `'auto'` shows it only when there's text/attachments (an empty composer hides it Enter still submits). To hide it entirely (Enter-only), it's pure CSS: `::part(send){display:none}` no prop needed. Restyle via `::part(send)`. The Stop button (`stoppable` + `loading`) is unaffected.",
5815
+ "description": "Send-button visibility. `'always'` (default) always shows it; `'auto'` shows it only when there's text/attachments (an empty composer hides it, though Enter still submits). To hide it entirely (Enter-only), it's pure CSS: `::part(send){display:none}`, no prop needed. Restyle via `::part(send)`. The Stop button (`stoppable` + `loading`) is unaffected.",
5055
5816
  "default": "'always'",
5056
5817
  "displayType": "undefined | \"always\" | \"auto\""
5057
5818
  },
@@ -5070,6 +5831,9 @@
5070
5831
  "optional": true,
5071
5832
  "scalar": false,
5072
5833
  "description": "Attachments to seed the input with (so a consumer can pre-populate staged files without an upload). Set as a JS property; the element then manages its own attachment state from there (add via the paperclip, remove per chip).",
5834
+ "typeName": "AttachmentData[]",
5835
+ "typeShape": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
5836
+ "typeImport": "AttachmentData",
5073
5837
  "displayType": "AttachmentData[] | undefined"
5074
5838
  },
5075
5839
  {
@@ -5077,7 +5841,10 @@
5077
5841
  "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
5078
5842
  "optional": true,
5079
5843
  "scalar": false,
5080
- "description": "Rich entity triggers each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins are the grouping/provenance of those items). Set as a JS property.",
5844
+ "description": "Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins are the grouping/provenance of those items). Set as a JS property.",
5845
+ "typeName": "TriggerDef[]",
5846
+ "typeShape": "{ char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
5847
+ "typeImport": "TriggerDef",
5081
5848
  "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
5082
5849
  },
5083
5850
  {
@@ -5093,7 +5860,7 @@
5093
5860
  {
5094
5861
  "name": "kai-attachments-change",
5095
5862
  "detail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
5096
- "description": "The staged attachments changed a file was added (via the paperclip) or removed (per-chip ×). Carries the full current list so a consumer can react in real time (validate, show upload progress, toggle the send button).",
5863
+ "description": "The staged attachments changed: a file was added (via the paperclip) or removed (per-chip ×). Carries the full current list so a consumer can react in real time (validate, show upload progress, toggle the send button).",
5097
5864
  "displayDetail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
5098
5865
  },
5099
5866
  {
@@ -5162,21 +5929,90 @@
5162
5929
  "name": "send",
5163
5930
  "params": "",
5164
5931
  "returns": "void",
5165
- "description": "Send the current value programmatically same path as Enter / the send button (fires kai-submit, then clears staged attachments). Named `send`, not `submit`, to avoid colliding with the `submit` prop."
5932
+ "description": "Send the current value programmatically, on the same path as Enter / the send button (fires kai-submit, then clears staged attachments). Named `send`, not `submit`, to avoid colliding with the `submit` prop."
5933
+ }
5934
+ ],
5935
+ "composedFrom": [
5936
+ {
5937
+ "name": "PromptInput",
5938
+ "group": "Components",
5939
+ "storyId": "solid-advanced-elements-promptinput--docs"
5940
+ },
5941
+ {
5942
+ "name": "PromptInputTextarea",
5943
+ "group": "Components",
5944
+ "storyId": "solid-advanced-elements-promptinputtextarea--docs"
5945
+ },
5946
+ {
5947
+ "name": "PromptInputActions",
5948
+ "group": "Components",
5949
+ "storyId": "solid-advanced-elements-promptinputactions--docs"
5950
+ },
5951
+ {
5952
+ "name": "PromptSuggestion",
5953
+ "group": "Components",
5954
+ "storyId": "solid-advanced-elements-promptsuggestion--docs"
5955
+ },
5956
+ {
5957
+ "name": "Button",
5958
+ "group": "UI",
5959
+ "storyId": "solid-advanced-primitives-button--docs"
5960
+ },
5961
+ {
5962
+ "name": "Tooltip",
5963
+ "group": "UI",
5964
+ "storyId": "solid-advanced-primitives-tooltip--docs"
5965
+ },
5966
+ {
5967
+ "name": "Attachments",
5968
+ "group": "Components",
5969
+ "storyId": "solid-advanced-elements-attachments--docs"
5970
+ },
5971
+ {
5972
+ "name": "Attachment",
5973
+ "group": "Components",
5974
+ "storyId": "solid-advanced-elements-attachment--docs"
5975
+ },
5976
+ {
5977
+ "name": "AttachmentPreview",
5978
+ "group": "Components",
5979
+ "storyId": "solid-advanced-elements-attachmentpreview--docs"
5980
+ },
5981
+ {
5982
+ "name": "AttachmentInfo",
5983
+ "group": "Components",
5984
+ "storyId": "solid-advanced-elements-attachmentinfo--docs"
5985
+ },
5986
+ {
5987
+ "name": "AttachmentRemove",
5988
+ "group": "Components",
5989
+ "storyId": "solid-advanced-elements-attachmentremove--docs"
5166
5990
  }
5167
5991
  ],
5168
- "composedFrom": [],
5169
5992
  "tokens": [],
5993
+ "declarativeChildren": [
5994
+ {
5995
+ "tag": "kai-action",
5996
+ "attributes": [
5997
+ "action",
5998
+ "icon",
5999
+ "id",
6000
+ "label",
6001
+ "tooltip"
6002
+ ],
6003
+ "text": true
6004
+ }
6005
+ ],
5170
6006
  "slots": [
5171
6007
  {
5172
6008
  "name": "input-top",
5173
6009
  "mode": "inject",
5174
- "doc": "Inside the card, above the textarea (e.g. an inline status strip). For content above/below the whole card, use your own layout that is light DOM you control."
6010
+ "doc": "Inside the card, above the textarea (e.g. an inline status strip). For content above/below the whole card, use your own layout; that is light DOM you control."
5175
6011
  },
5176
6012
  {
5177
6013
  "name": "toolbar-start",
5178
6014
  "mode": "inject",
5179
- "doc": "Leading controls in the input toolbar where a + menu goes."
6015
+ "doc": "Leading controls in the input toolbar, where a + menu goes."
5180
6016
  },
5181
6017
  {
5182
6018
  "name": "toolbar-end",
@@ -5187,7 +6023,7 @@
5187
6023
  "parts": [
5188
6024
  {
5189
6025
  "name": "send",
5190
- "doc": "The send button. Restyle from outside, or hide it entirely (Enter-only) hiding is pure CSS, which is why there is no `submit=\"never\"`.",
6026
+ "doc": "The send button. Restyle from outside, or hide it entirely (Enter-only). Hiding is pure CSS, which is why there is no `submit=\"never\"`.",
5191
6027
  "recipe": "kai-prompt-input::part(send) { display: none } /* Enter-only; or restyle: background, border-radius, … */"
5192
6028
  }
5193
6029
  ]
@@ -5197,6 +6033,16 @@
5197
6033
  "className": "KaiReasoningElement",
5198
6034
  "displayName": "Reasoning",
5199
6035
  "props": [
6036
+ {
6037
+ "name": "theme",
6038
+ "type": "\"light\" | \"dark\" | \"auto\"",
6039
+ "optional": true,
6040
+ "scalar": true,
6041
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6042
+ "default": "'auto'",
6043
+ "universal": true,
6044
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6045
+ },
5200
6046
  {
5201
6047
  "name": "text",
5202
6048
  "type": "string",
@@ -5254,7 +6100,7 @@
5254
6100
  "type": "undefined | false | true",
5255
6101
  "optional": true,
5256
6102
  "scalar": true,
5257
- "description": "Gate the disclosure trigger programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
6103
+ "description": "Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
5258
6104
  "displayType": "undefined | false | true"
5259
6105
  }
5260
6106
  ],
@@ -5310,6 +6156,16 @@
5310
6156
  "className": "KaiRemoteElement",
5311
6157
  "displayName": "Remote",
5312
6158
  "props": [
6159
+ {
6160
+ "name": "theme",
6161
+ "type": "\"light\" | \"dark\" | \"auto\"",
6162
+ "optional": true,
6163
+ "scalar": true,
6164
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6165
+ "default": "'auto'",
6166
+ "universal": true,
6167
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6168
+ },
5313
6169
  {
5314
6170
  "name": "src",
5315
6171
  "type": "undefined | string",
@@ -5353,32 +6209,42 @@
5353
6209
  "className": "KaiResizableElement",
5354
6210
  "displayName": "Resizable",
5355
6211
  "props": [
6212
+ {
6213
+ "name": "theme",
6214
+ "type": "\"light\" | \"dark\" | \"auto\"",
6215
+ "optional": true,
6216
+ "scalar": true,
6217
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6218
+ "default": "'auto'",
6219
+ "universal": true,
6220
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6221
+ },
5356
6222
  {
5357
6223
  "name": "orientation",
5358
- "type": "undefined | \"vertical\" | \"horizontal\"",
6224
+ "type": "undefined | \"horizontal\" | \"vertical\"",
5359
6225
  "optional": true,
5360
6226
  "scalar": true,
5361
6227
  "description": "Layout axis: `horizontal` (row, default) or `vertical` (column).",
5362
6228
  "default": "'horizontal'",
5363
- "displayType": "undefined | \"vertical\" | \"horizontal\""
6229
+ "displayType": "undefined | \"horizontal\" | \"vertical\""
5364
6230
  },
5365
6231
  {
5366
6232
  "name": "maximizedIndex",
5367
- "type": "undefined | null | number",
6233
+ "type": "undefined | number | null",
5368
6234
  "optional": true,
5369
6235
  "scalar": false,
5370
6236
  "description": "Which item index is maximized (null = none). Declarative source of truth.",
5371
6237
  "default": "null",
5372
- "displayType": "undefined | null | number"
6238
+ "displayType": "undefined | number | null"
5373
6239
  },
5374
6240
  {
5375
6241
  "name": "handle",
5376
- "type": "undefined | \"none\" | \"line\" | \"grip\"",
6242
+ "type": "undefined | \"line\" | \"grip\" | \"none\"",
5377
6243
  "optional": true,
5378
6244
  "scalar": true,
5379
- "description": "Divider affordance drawn inside each draggable handle's 8px grab zone: - `line` (default) a 1px hairline, transparent at rest, tinting on hover/drag. - `grip` a dotted grip handle. - `none` no visible divider, just the invisible hit-area. The full grab zone and keyboard/ARIA behavior are identical for all three.",
6245
+ "description": "Divider affordance drawn inside each draggable handle's 8px grab zone: - `line` (default): a 1px hairline, transparent at rest, tinting on hover/drag. - `grip`: a dotted grip handle. - `none`: no visible divider, just the invisible hit-area. The full grab zone and keyboard/ARIA behavior are identical for all three.",
5380
6246
  "default": "'line'",
5381
- "displayType": "undefined | \"none\" | \"line\" | \"grip\""
6247
+ "displayType": "undefined | \"line\" | \"grip\" | \"none\""
5382
6248
  }
5383
6249
  ],
5384
6250
  "events": [
@@ -5390,12 +6256,31 @@
5390
6256
  },
5391
6257
  {
5392
6258
  "name": "kai-maximize-change",
5393
- "detail": "{ maximized: false | true; index: null | number }",
6259
+ "detail": "{ maximized: false | true; index: number | null }",
5394
6260
  "description": "Observe layout maximize state.",
5395
- "displayDetail": "{ maximized: false | true; index: null | number }"
6261
+ "displayDetail": "{ maximized: false | true; index: number | null }"
6262
+ },
6263
+ {
6264
+ "name": "kai-maximize-state",
6265
+ "detail": "{ maximized: false | true }",
6266
+ "description": "Authoritative maximize state, dispatched as a raw composed CustomEvent (not through `dispatch`) onto the affected `<kai-resizable-item>` and, on restore, onto the group host. A nested element (e.g. `<kai-artifact>`) listens for it to reconcile its own toggle.",
6267
+ "displayDetail": "{ maximized: false | true }"
6268
+ }
6269
+ ],
6270
+ "methods": [
6271
+ {
6272
+ "name": "maximize",
6273
+ "params": "index: number",
6274
+ "returns": "void",
6275
+ "description": "Imperatively maximize the item at `index` (thin wrapper over `maximizedIndex`)."
6276
+ },
6277
+ {
6278
+ "name": "restore",
6279
+ "params": "",
6280
+ "returns": "void",
6281
+ "description": "Imperatively restore from the maximized layout."
5396
6282
  }
5397
6283
  ],
5398
- "methods": [],
5399
6284
  "composedFrom": [
5400
6285
  {
5401
6286
  "name": "ResizableHandle",
@@ -5403,13 +6288,30 @@
5403
6288
  "storyId": "solid-advanced-primitives-resizablehandle--docs"
5404
6289
  }
5405
6290
  ],
5406
- "tokens": []
6291
+ "tokens": [],
6292
+ "slots": [
6293
+ {
6294
+ "name": "",
6295
+ "mode": "inject",
6296
+ "doc": "The `<kai-resizable-item>` panels, in order. Dividers are inserted between them."
6297
+ }
6298
+ ]
5407
6299
  },
5408
6300
  {
5409
6301
  "tag": "kai-resizable-item",
5410
6302
  "className": "KaiResizableItemElement",
5411
6303
  "displayName": "ResizableItem",
5412
6304
  "props": [
6305
+ {
6306
+ "name": "theme",
6307
+ "type": "\"light\" | \"dark\" | \"auto\"",
6308
+ "optional": true,
6309
+ "scalar": true,
6310
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6311
+ "default": "'auto'",
6312
+ "universal": true,
6313
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6314
+ },
5413
6315
  {
5414
6316
  "name": "size",
5415
6317
  "type": "undefined | string",
@@ -5457,7 +6359,7 @@
5457
6359
  "type": "undefined | false | true",
5458
6360
  "optional": true,
5459
6361
  "scalar": true,
5460
- "description": "Collapse this panel same layout effect as `hidden` (divider dropped, the rest reflow), but it WORKS as a bare boolean from framework JSX. A plain `<kai-resizable-item collapsed>` in React/Solid/Vue/Svelte collapses the panel at the first render; `hidden` does not, because a JSX boolean sets neither the `hidden` attribute nor the IDL property on a custom element, so the parent never sees it. The facade reflects `collapsed` to a `collapsed` attribute the parent reads. Prefer this over `hidden` for declarative collapse.",
6362
+ "description": "Collapse this panel. Same layout effect as `hidden` (divider dropped, the rest reflow), but it WORKS as a bare boolean from framework JSX. A plain `<kai-resizable-item collapsed>` in React/Solid/Vue/Svelte collapses the panel at the first render; `hidden` does not, because a JSX boolean sets neither the `hidden` attribute nor the IDL property on a custom element, so the parent never sees it. The facade reflects `collapsed` to a `collapsed` attribute the parent reads. Prefer this over `hidden` for declarative collapse.",
5461
6363
  "default": "false",
5462
6364
  "displayType": "undefined | false | true"
5463
6365
  }
@@ -5474,6 +6376,12 @@
5474
6376
  "detail": "unknown",
5475
6377
  "description": "",
5476
6378
  "displayDetail": "unknown"
6379
+ },
6380
+ {
6381
+ "name": "kai-maximize-state",
6382
+ "detail": "unknown",
6383
+ "description": "",
6384
+ "displayDetail": "unknown"
5477
6385
  }
5478
6386
  ],
5479
6387
  "methods": [],
@@ -5484,19 +6392,36 @@
5484
6392
  "storyId": "solid-advanced-primitives-resizablehandle--docs"
5485
6393
  }
5486
6394
  ],
5487
- "tokens": []
6395
+ "tokens": [],
6396
+ "slots": [
6397
+ {
6398
+ "name": "",
6399
+ "mode": "inject",
6400
+ "doc": "This panel's content."
6401
+ }
6402
+ ]
5488
6403
  },
5489
6404
  {
5490
6405
  "tag": "kai-response-stream",
5491
6406
  "className": "KaiResponseStreamElement",
5492
6407
  "displayName": "ResponseStream",
5493
6408
  "props": [
6409
+ {
6410
+ "name": "theme",
6411
+ "type": "\"light\" | \"dark\" | \"auto\"",
6412
+ "optional": true,
6413
+ "scalar": true,
6414
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6415
+ "default": "'auto'",
6416
+ "universal": true,
6417
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6418
+ },
5494
6419
  {
5495
6420
  "name": "text",
5496
6421
  "type": "undefined | string | AsyncIterable<string>",
5497
6422
  "optional": true,
5498
6423
  "scalar": false,
5499
- "description": "Text to stream. A string, or an `AsyncIterable<string>` (set as a JS property async iterables can't be HTML attributes).",
6424
+ "description": "Text to stream. A string, or an `AsyncIterable<string>` (set as a JS property, since async iterables can't be HTML attributes).",
5500
6425
  "default": "''",
5501
6426
  "displayType": "undefined | string | AsyncIterable<string>"
5502
6427
  },
@@ -5550,23 +6475,33 @@
5550
6475
  "className": "KaiScopePickerElement",
5551
6476
  "displayName": "ScopePicker",
5552
6477
  "props": [
6478
+ {
6479
+ "name": "theme",
6480
+ "type": "\"light\" | \"dark\" | \"auto\"",
6481
+ "optional": true,
6482
+ "scalar": true,
6483
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6484
+ "default": "'auto'",
6485
+ "universal": true,
6486
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6487
+ },
5553
6488
  {
5554
6489
  "name": "availableAuthors",
5555
- "type": "string[]",
5556
- "optional": false,
6490
+ "type": "undefined | string[]",
6491
+ "optional": true,
5557
6492
  "scalar": false,
5558
- "description": "Authors to offer as scope filters. Set as a JS property.",
6493
+ "description": "Authors to offer as scope filters. Omit to drop the Authors section (for a tag-only picker). Set as a JS property.",
5559
6494
  "default": "[]",
5560
- "displayType": "string[]"
6495
+ "displayType": "undefined | string[]"
5561
6496
  },
5562
6497
  {
5563
6498
  "name": "availableTags",
5564
- "type": "string[]",
5565
- "optional": false,
6499
+ "type": "undefined | string[]",
6500
+ "optional": true,
5566
6501
  "scalar": false,
5567
- "description": "Tags to offer as scope filters. Set as a JS property.",
6502
+ "description": "Tags to offer as scope filters. Omit to drop the Tags section (for an author-only picker). Set as a JS property.",
5568
6503
  "default": "[]",
5569
- "displayType": "string[]"
6504
+ "displayType": "undefined | string[]"
5570
6505
  },
5571
6506
  {
5572
6507
  "name": "currentLabel",
@@ -5598,7 +6533,7 @@
5598
6533
  "type": "undefined | false | true",
5599
6534
  "optional": true,
5600
6535
  "scalar": true,
5601
- "description": "Disable the trigger click/keyboard and `show()` no longer open the dropdown.",
6536
+ "description": "Disable the trigger: click/keyboard and `show()` no longer open the dropdown.",
5602
6537
  "displayType": "undefined | false | true"
5603
6538
  }
5604
6539
  ],
@@ -5611,9 +6546,9 @@
5611
6546
  },
5612
6547
  {
5613
6548
  "name": "kai-scope-change",
5614
- "detail": "{ filters: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }",
6549
+ "detail": "{ filters: { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } | undefined }",
5615
6550
  "description": "A scope was chosen (`undefined` filters = \"All Content\").",
5616
- "displayDetail": "{ filters: SearchFilters | undefined }"
6551
+ "displayDetail": "{ filters: { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } | undefined }"
5617
6552
  }
5618
6553
  ],
5619
6554
  "methods": [
@@ -5650,6 +6585,16 @@
5650
6585
  "className": "KaiScreenElement",
5651
6586
  "displayName": "Screen",
5652
6587
  "props": [
6588
+ {
6589
+ "name": "theme",
6590
+ "type": "\"light\" | \"dark\" | \"auto\"",
6591
+ "optional": true,
6592
+ "scalar": true,
6593
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6594
+ "default": "'auto'",
6595
+ "universal": true,
6596
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6597
+ },
5653
6598
  {
5654
6599
  "name": "open",
5655
6600
  "type": "undefined | false | true",
@@ -5740,6 +6685,11 @@
5740
6685
  ],
5741
6686
  "tokens": [],
5742
6687
  "slots": [
6688
+ {
6689
+ "name": "",
6690
+ "mode": "inject",
6691
+ "doc": "The screen body, below the title bar."
6692
+ },
5743
6693
  {
5744
6694
  "name": "title",
5745
6695
  "mode": "replace",
@@ -5779,6 +6729,16 @@
5779
6729
  "className": "KaiScrollAreaElement",
5780
6730
  "displayName": "ScrollArea",
5781
6731
  "props": [
6732
+ {
6733
+ "name": "theme",
6734
+ "type": "\"light\" | \"dark\" | \"auto\"",
6735
+ "optional": true,
6736
+ "scalar": true,
6737
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6738
+ "default": "'auto'",
6739
+ "universal": true,
6740
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6741
+ },
5782
6742
  {
5783
6743
  "name": "orientation",
5784
6744
  "type": "undefined | \"vertical\" | \"horizontal\" | \"both\"",
@@ -5799,6 +6759,13 @@
5799
6759
  }
5800
6760
  ],
5801
6761
  "tokens": [],
6762
+ "slots": [
6763
+ {
6764
+ "name": "",
6765
+ "mode": "inject",
6766
+ "doc": "The scrollable content."
6767
+ }
6768
+ ],
5802
6769
  "parts": [
5803
6770
  {
5804
6771
  "name": "viewport",
@@ -5812,6 +6779,16 @@
5812
6779
  "className": "KaiScrollButtonElement",
5813
6780
  "displayName": "ScrollButton",
5814
6781
  "props": [
6782
+ {
6783
+ "name": "theme",
6784
+ "type": "\"light\" | \"dark\" | \"auto\"",
6785
+ "optional": true,
6786
+ "scalar": true,
6787
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6788
+ "default": "'auto'",
6789
+ "universal": true,
6790
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6791
+ },
5815
6792
  {
5816
6793
  "name": "for",
5817
6794
  "type": "undefined | string",
@@ -5822,12 +6799,12 @@
5822
6799
  },
5823
6800
  {
5824
6801
  "name": "variant",
5825
- "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
6802
+ "type": "undefined | \"outline\" | \"ghost\" | \"default\"",
5826
6803
  "optional": true,
5827
6804
  "scalar": true,
5828
6805
  "description": "Button visual variant: `'outline' | 'ghost' | 'default'`. Defaults to `'outline'`.",
5829
6806
  "default": "'outline'",
5830
- "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
6807
+ "displayType": "undefined | \"outline\" | \"ghost\" | \"default\""
5831
6808
  },
5832
6809
  {
5833
6810
  "name": "size",
@@ -5843,7 +6820,7 @@
5843
6820
  {
5844
6821
  "name": "kai-scroll",
5845
6822
  "detail": null,
5846
- "description": "Emitted when the user clicks the button and `scrollToBottom()` is called. Carries no detail consumers use it to know a manual scroll occurred.",
6823
+ "description": "Emitted when the user clicks the button and `scrollToBottom()` is called. Carries no detail; consumers use it to know a manual scroll occurred.",
5847
6824
  "displayDetail": null
5848
6825
  }
5849
6826
  ],
@@ -5862,12 +6839,22 @@
5862
6839
  "className": "KaiSearchElement",
5863
6840
  "displayName": "Search",
5864
6841
  "props": [
6842
+ {
6843
+ "name": "theme",
6844
+ "type": "\"light\" | \"dark\" | \"auto\"",
6845
+ "optional": true,
6846
+ "scalar": true,
6847
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6848
+ "default": "'auto'",
6849
+ "universal": true,
6850
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6851
+ },
5865
6852
  {
5866
6853
  "name": "value",
5867
6854
  "type": "undefined | string",
5868
6855
  "optional": true,
5869
6856
  "scalar": true,
5870
- "description": "Controlled query settable and reflected to the `value` attribute. Read `el.value` for live state.",
6857
+ "description": "Controlled query. Settable and reflected to the `value` attribute. Read `el.value` for live state.",
5871
6858
  "displayType": "undefined | string"
5872
6859
  },
5873
6860
  {
@@ -5940,7 +6927,13 @@
5940
6927
  "name": "focus",
5941
6928
  "params": "",
5942
6929
  "returns": "void",
5943
- "description": ""
6930
+ "description": "Focus the search input inside the shadow root. A native `focus()` on the host lands on the host itself and never reaches it."
6931
+ },
6932
+ {
6933
+ "name": "clear",
6934
+ "params": "",
6935
+ "returns": "void",
6936
+ "description": "Empty the field and fire `kai-search` with an empty value immediately, cancelling any debounced search still in flight, then return focus to the input. Same path as the trailing clear button."
5944
6937
  }
5945
6938
  ],
5946
6939
  "composedFrom": [
@@ -5984,15 +6977,26 @@
5984
6977
  "className": "KaiSegmentedElement",
5985
6978
  "displayName": "Segmented",
5986
6979
  "props": [
6980
+ {
6981
+ "name": "theme",
6982
+ "type": "\"light\" | \"dark\" | \"auto\"",
6983
+ "optional": true,
6984
+ "scalar": true,
6985
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
6986
+ "default": "'auto'",
6987
+ "universal": true,
6988
+ "displayType": "\"light\" | \"dark\" | \"auto\""
6989
+ },
5987
6990
  {
5988
6991
  "name": "options",
5989
6992
  "type": "{ value: string; label: string; icon?: undefined | string }[]",
5990
6993
  "optional": false,
5991
6994
  "scalar": false,
5992
6995
  "description": "The selectable segments, left to right. Set as a JS property (array).",
5993
- "typeName": "Option[]",
6996
+ "typeName": "KaiSegmentedOption[]",
5994
6997
  "typeShape": "{ value: string; label: string; icon?: undefined | string }[]",
5995
6998
  "default": "[]",
6999
+ "typeImport": "KaiSegmentedOption",
5996
7000
  "displayType": "{ value: string; label: string; icon?: undefined | string }[]"
5997
7001
  },
5998
7002
  {
@@ -6000,7 +7004,7 @@
6000
7004
  "type": "undefined | string",
6001
7005
  "optional": true,
6002
7006
  "scalar": true,
6003
- "description": "Controlled selected `value` settable and reflected to the `value` attribute. `el.value = 'preview'` drives it; choosing a segment updates it and fires `kai-change`. Read `el.value` for live state.",
7007
+ "description": "Controlled selected `value`. Settable and reflected to the `value` attribute. `el.value = 'preview'` drives it; choosing a segment updates it and fires `kai-change`. Read `el.value` for live state.",
6004
7008
  "displayType": "undefined | string"
6005
7009
  },
6006
7010
  {
@@ -6048,14 +7052,24 @@
6048
7052
  "className": "KaiSeparatorElement",
6049
7053
  "displayName": "Separator",
6050
7054
  "props": [
7055
+ {
7056
+ "name": "theme",
7057
+ "type": "\"light\" | \"dark\" | \"auto\"",
7058
+ "optional": true,
7059
+ "scalar": true,
7060
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7061
+ "default": "'auto'",
7062
+ "universal": true,
7063
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7064
+ },
6051
7065
  {
6052
7066
  "name": "orientation",
6053
- "type": "undefined | \"vertical\" | \"horizontal\"",
7067
+ "type": "undefined | \"horizontal\" | \"vertical\"",
6054
7068
  "optional": true,
6055
7069
  "scalar": true,
6056
- "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row it stretches to the row height).",
7070
+ "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height).",
6057
7071
  "default": "'horizontal'",
6058
- "displayType": "undefined | \"vertical\" | \"horizontal\""
7072
+ "displayType": "undefined | \"horizontal\" | \"vertical\""
6059
7073
  }
6060
7074
  ],
6061
7075
  "events": [],
@@ -6081,6 +7095,16 @@
6081
7095
  "className": "KaiSettingItemElement",
6082
7096
  "displayName": "SettingItem",
6083
7097
  "props": [
7098
+ {
7099
+ "name": "theme",
7100
+ "type": "\"light\" | \"dark\" | \"auto\"",
7101
+ "optional": true,
7102
+ "scalar": true,
7103
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7104
+ "default": "'auto'",
7105
+ "universal": true,
7106
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7107
+ },
6084
7108
  {
6085
7109
  "name": "label",
6086
7110
  "type": "undefined | string",
@@ -6134,6 +7158,16 @@
6134
7158
  "className": "KaiSettingsGroupElement",
6135
7159
  "displayName": "SettingsGroup",
6136
7160
  "props": [
7161
+ {
7162
+ "name": "theme",
7163
+ "type": "\"light\" | \"dark\" | \"auto\"",
7164
+ "optional": true,
7165
+ "scalar": true,
7166
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7167
+ "default": "'auto'",
7168
+ "universal": true,
7169
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7170
+ },
6137
7171
  {
6138
7172
  "name": "heading",
6139
7173
  "type": "undefined | string",
@@ -6162,6 +7196,13 @@
6162
7196
  }
6163
7197
  ],
6164
7198
  "tokens": [],
7199
+ "slots": [
7200
+ {
7201
+ "name": "",
7202
+ "mode": "inject",
7203
+ "doc": "The `<kai-setting-item>` rows in this group."
7204
+ }
7205
+ ],
6165
7206
  "parts": [
6166
7207
  {
6167
7208
  "name": "header",
@@ -6180,6 +7221,16 @@
6180
7221
  "className": "KaiSkeletonElement",
6181
7222
  "displayName": "Skeleton",
6182
7223
  "props": [
7224
+ {
7225
+ "name": "theme",
7226
+ "type": "\"light\" | \"dark\" | \"auto\"",
7227
+ "optional": true,
7228
+ "scalar": true,
7229
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7230
+ "default": "'auto'",
7231
+ "universal": true,
7232
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7233
+ },
6183
7234
  {
6184
7235
  "name": "variant",
6185
7236
  "type": "undefined | \"text\" | \"rect\" | \"circle\"",
@@ -6237,16 +7288,27 @@
6237
7288
  "className": "KaiSkillsElement",
6238
7289
  "displayName": "Skills",
6239
7290
  "props": [
7291
+ {
7292
+ "name": "theme",
7293
+ "type": "\"light\" | \"dark\" | \"auto\"",
7294
+ "optional": true,
7295
+ "scalar": true,
7296
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7297
+ "default": "'auto'",
7298
+ "universal": true,
7299
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7300
+ },
6240
7301
  {
6241
7302
  "name": "skills",
6242
- "type": "{ id: string; name: string }[]",
6243
- "optional": false,
7303
+ "type": "undefined | { id: string; name: string }[]",
7304
+ "optional": true,
6244
7305
  "scalar": false,
6245
- "description": "The active skills to badge. Set as a JS property.",
7306
+ "description": "The active skills to badge. Set as a JS property. Omit to supply them as `<kai-skill>` light-DOM children instead; when both are present the property's skills come first. Nothing renders when there are none.",
6246
7307
  "typeName": "Skill[]",
6247
7308
  "typeShape": "{ id: string; name: string }[]",
6248
7309
  "default": "[]",
6249
- "displayType": "{ id: string; name: string }[]"
7310
+ "typeImport": "Skill",
7311
+ "displayType": "undefined | { id: string; name: string }[]"
6250
7312
  }
6251
7313
  ],
6252
7314
  "events": [],
@@ -6258,13 +7320,33 @@
6258
7320
  "storyId": "solid-advanced-elements-messageskills--docs"
6259
7321
  }
6260
7322
  ],
6261
- "tokens": []
7323
+ "tokens": [],
7324
+ "declarativeChildren": [
7325
+ {
7326
+ "tag": "kai-skill",
7327
+ "attributes": [
7328
+ "id"
7329
+ ],
7330
+ "text": true,
7331
+ "description": "Parse a single light-DOM `<kai-skill>` element into a `Skill` descriptor. Attribute / content mapping: - `id` → Skill.id (falls back to `name` when absent) - `textContent` → Skill.name (the human-readable badge label) Example: `<kai-skill id=\"web-search\">Web Search</kai-skill>`"
7332
+ }
7333
+ ]
6262
7334
  },
6263
7335
  {
6264
7336
  "tag": "kai-source",
6265
7337
  "className": "KaiSourceElement",
6266
7338
  "displayName": "Source",
6267
7339
  "props": [
7340
+ {
7341
+ "name": "theme",
7342
+ "type": "\"light\" | \"dark\" | \"auto\"",
7343
+ "optional": true,
7344
+ "scalar": true,
7345
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7346
+ "default": "'auto'",
7347
+ "universal": true,
7348
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7349
+ },
6268
7350
  {
6269
7351
  "name": "href",
6270
7352
  "type": "undefined | string",
@@ -6287,7 +7369,7 @@
6287
7369
  "type": "undefined | string",
6288
7370
  "optional": true,
6289
7371
  "scalar": true,
6290
- "description": "Hover-card headline. Attribute: `headline` (`title` is avoided it's a global HTML attribute that reflects in a CE constructor and breaks it).",
7372
+ "description": "Hover-card headline. Attribute: `headline` (`title` is avoided because it is a global HTML attribute that reflects in a CE constructor and breaks it).",
6291
7373
  "default": "''",
6292
7374
  "displayType": "undefined | string"
6293
7375
  },
@@ -6341,16 +7423,27 @@
6341
7423
  "className": "KaiSourcesElement",
6342
7424
  "displayName": "Sources",
6343
7425
  "props": [
7426
+ {
7427
+ "name": "theme",
7428
+ "type": "\"light\" | \"dark\" | \"auto\"",
7429
+ "optional": true,
7430
+ "scalar": true,
7431
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7432
+ "default": "'auto'",
7433
+ "universal": true,
7434
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7435
+ },
6344
7436
  {
6345
7437
  "name": "sources",
6346
- "type": "{ href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]",
6347
- "optional": false,
7438
+ "type": "undefined | { href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]",
7439
+ "optional": true,
6348
7440
  "scalar": false,
6349
- "description": "The sources to render. Set as a JS property.",
6350
- "typeName": "SourceItem[]",
7441
+ "description": "The sources to render. Set as a JS property. Omit to supply them as `<kai-source>` light-DOM children instead; when both are present the property's sources come first.",
7442
+ "typeName": "KaiSourceItem[]",
6351
7443
  "typeShape": "{ href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]",
6352
7444
  "default": "[]",
6353
- "displayType": "SourceItem[]"
7445
+ "typeImport": "KaiSourceItem",
7446
+ "displayType": "undefined | { href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]"
6354
7447
  },
6355
7448
  {
6356
7449
  "name": "showFavicon",
@@ -6366,7 +7459,7 @@
6366
7459
  "type": "undefined | false | true",
6367
7460
  "optional": true,
6368
7461
  "scalar": true,
6369
- "description": "When true, each citation chip is labelled with its 1-based index in the merged (prop + declarative-children) list (`[1]`, `[2]`, …) instead of the per-item `label` or domain fallback. HTML attribute: `numbered` (boolean bare attribute or `numbered=\"true\"`). JS property: `el.numbered = true`.",
7462
+ "description": "When true, each citation chip is labelled with its 1-based index in the merged (prop + declarative-children) list (`[1]`, `[2]`, …) instead of the per-item `label` or domain fallback. HTML attribute: `numbered` (boolean: a bare attribute or `numbered=\"true\"`). JS property: `el.numbered = true`.",
6370
7463
  "default": "false",
6371
7464
  "displayType": "undefined | false | true"
6372
7465
  }
@@ -6395,13 +7488,37 @@
6395
7488
  "storyId": "solid-advanced-elements-sourcelist--docs"
6396
7489
  }
6397
7490
  ],
6398
- "tokens": []
7491
+ "tokens": [],
7492
+ "declarativeChildren": [
7493
+ {
7494
+ "tag": "kai-source",
7495
+ "attributes": [
7496
+ "description",
7497
+ "headline",
7498
+ "href",
7499
+ "label",
7500
+ "show-favicon"
7501
+ ],
7502
+ "text": false,
7503
+ "description": "Parse a single light-DOM `<kai-source>` element into a `KaiSourceItem` descriptor. Attribute mapping: - `href` → KaiSourceItem.href - `label` → KaiSourceItem.label - `headline` → KaiSourceItem.title (matches kai-source's prop name; \"title\" is a reserved HTMLElement attribute so kai-source uses \"headline\") - `description` → KaiSourceItem.description - `show-favicon`→ KaiSourceItem.showFavicon (bare boolean attribute)"
7504
+ }
7505
+ ]
6399
7506
  },
6400
7507
  {
6401
7508
  "tag": "kai-status",
6402
7509
  "className": "KaiStatusElement",
6403
7510
  "displayName": "Status",
6404
7511
  "props": [
7512
+ {
7513
+ "name": "theme",
7514
+ "type": "\"light\" | \"dark\" | \"auto\"",
7515
+ "optional": true,
7516
+ "scalar": true,
7517
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7518
+ "default": "'auto'",
7519
+ "universal": true,
7520
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7521
+ },
6405
7522
  {
6406
7523
  "name": "status",
6407
7524
  "type": "undefined | \"new\" | \"online\" | \"busy\" | \"away\" | \"offline\"",
@@ -6461,23 +7578,33 @@
6461
7578
  "className": "KaiSuggestionsElement",
6462
7579
  "displayName": "Suggestions",
6463
7580
  "props": [
7581
+ {
7582
+ "name": "theme",
7583
+ "type": "\"light\" | \"dark\" | \"auto\"",
7584
+ "optional": true,
7585
+ "scalar": true,
7586
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7587
+ "default": "'auto'",
7588
+ "universal": true,
7589
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7590
+ },
6464
7591
  {
6465
7592
  "name": "suggestions",
6466
- "type": "(string | { label: string; value?: undefined | string; icon?: undefined | string })[]",
6467
- "optional": false,
7593
+ "type": "undefined | (string | { label: string; value?: undefined | string; icon?: undefined | string })[]",
7594
+ "optional": true,
6468
7595
  "scalar": false,
6469
- "description": "The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property.",
7596
+ "description": "The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property. Omit to supply them as `<kai-suggestion>` light-DOM children instead; when both are present the property's suggestions come first.",
6470
7597
  "default": "[]",
6471
- "displayType": "(string | { label: string; value?: undefined | string; icon?: undefined | string })[]"
7598
+ "displayType": "undefined | (string | { label: string; value?: undefined | string; icon?: undefined | string })[]"
6472
7599
  },
6473
7600
  {
6474
7601
  "name": "variant",
6475
- "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
7602
+ "type": "undefined | \"outline\" | \"ghost\" | \"default\"",
6476
7603
  "optional": true,
6477
7604
  "scalar": true,
6478
7605
  "description": "Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled).",
6479
7606
  "default": "'outline'",
6480
- "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
7607
+ "displayType": "undefined | \"outline\" | \"ghost\" | \"default\""
6481
7608
  },
6482
7609
  {
6483
7610
  "name": "size",
@@ -6490,12 +7617,12 @@
6490
7617
  },
6491
7618
  {
6492
7619
  "name": "layout",
6493
- "type": "undefined | \"list\" | \"chips\"",
7620
+ "type": "undefined | \"chips\" | \"list\"",
6494
7621
  "optional": true,
6495
7622
  "scalar": true,
6496
- "description": "Layout: `'chips'` (default) renders a wrapping row of rounded pills; `'list'` renders a vertical, full-width \"Ideas for you\" list each row is left-aligned with a leading `icon`, a label, and a hover background.",
7623
+ "description": "Layout: `'chips'` (default) renders a wrapping row of rounded pills; `'list'` renders a vertical, full-width \"Ideas for you\" list where each row is left-aligned with a leading `icon`, a label, and a hover background.",
6497
7624
  "default": "'chips'",
6498
- "displayType": "undefined | \"list\" | \"chips\""
7625
+ "displayType": "undefined | \"chips\" | \"list\""
6499
7626
  },
6500
7627
  {
6501
7628
  "name": "block",
@@ -6531,19 +7658,40 @@
6531
7658
  "storyId": "solid-advanced-elements-promptsuggestion--docs"
6532
7659
  }
6533
7660
  ],
6534
- "tokens": []
7661
+ "tokens": [],
7662
+ "declarativeChildren": [
7663
+ {
7664
+ "tag": "kai-suggestion",
7665
+ "attributes": [
7666
+ "icon",
7667
+ "value"
7668
+ ],
7669
+ "text": true,
7670
+ "description": "Parse a single `<kai-suggestion>` node into an `Item` descriptor."
7671
+ }
7672
+ ]
6535
7673
  },
6536
7674
  {
6537
7675
  "tag": "kai-switch",
6538
7676
  "className": "KaiSwitchElement",
6539
7677
  "displayName": "Switch",
6540
7678
  "props": [
7679
+ {
7680
+ "name": "theme",
7681
+ "type": "\"light\" | \"dark\" | \"auto\"",
7682
+ "optional": true,
7683
+ "scalar": true,
7684
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7685
+ "default": "'auto'",
7686
+ "universal": true,
7687
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7688
+ },
6541
7689
  {
6542
7690
  "name": "checked",
6543
7691
  "type": "undefined | false | true",
6544
7692
  "optional": true,
6545
7693
  "scalar": true,
6546
- "description": "Controlled checked state settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-switch checked>`) drives it; the toggle UI updates it and fires `kai-change`. Read `el.checked` for live state.",
7694
+ "description": "Controlled checked state. Settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-switch checked>`) drives it; the toggle UI updates it and fires `kai-change`. Read `el.checked` for live state.",
6547
7695
  "displayType": "undefined | false | true"
6548
7696
  },
6549
7697
  {
@@ -6623,12 +7771,25 @@
6623
7771
  "className": "KaiTabsElement",
6624
7772
  "displayName": "Tabs",
6625
7773
  "props": [
7774
+ {
7775
+ "name": "theme",
7776
+ "type": "\"light\" | \"dark\" | \"auto\"",
7777
+ "optional": true,
7778
+ "scalar": true,
7779
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7780
+ "default": "'auto'",
7781
+ "universal": true,
7782
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7783
+ },
6626
7784
  {
6627
7785
  "name": "items",
6628
7786
  "type": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]",
6629
7787
  "optional": true,
6630
7788
  "scalar": false,
6631
7789
  "description": "Tabs to render. Set as a JS property, not an HTML attribute.",
7790
+ "typeName": "KaiTabItem[]",
7791
+ "typeShape": "{ id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]",
7792
+ "typeImport": "KaiTabItem",
6632
7793
  "displayType": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]"
6633
7794
  },
6634
7795
  {
@@ -6721,13 +7882,26 @@
6721
7882
  "className": "KaiTasksElement",
6722
7883
  "displayName": "Tasks",
6723
7884
  "props": [
7885
+ {
7886
+ "name": "theme",
7887
+ "type": "\"light\" | \"dark\" | \"auto\"",
7888
+ "optional": true,
7889
+ "scalar": true,
7890
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
7891
+ "default": "'auto'",
7892
+ "universal": true,
7893
+ "displayType": "\"light\" | \"dark\" | \"auto\""
7894
+ },
6724
7895
  {
6725
7896
  "name": "data",
6726
- "type": "undefined | Record<string, unknown>",
7897
+ "type": "undefined | { mode?: undefined | \"select\" | \"progress\"; heading?: undefined | string; tasks: { id: string; label: string; description?: undefined | string; checked?: undefined | false | true; disabled?: undefined | false | true }[]; selectAll?: undefined | false | true; confirmLabel?: undefined | string; allowEmpty?: undefined | false | true; min?: undefined | number; max?: undefined | number; dismissible?: undefined | false | true }",
6727
7898
  "optional": true,
6728
7899
  "scalar": false,
6729
7900
  "description": "The tasks definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import `TasksCardData` from `@kitn.ai/ui` for the full shape.",
6730
- "displayType": "undefined | Record<string, unknown>"
7901
+ "typeName": "TasksCardData",
7902
+ "typeShape": "{ mode?: undefined | \"select\" | \"progress\"; heading?: undefined | string; tasks: { id: string; label: string; description?: undefined | string; checked?: undefined | false | true; disabled?: undefined | false | true }[]; selectAll?: undefined | false | true; confirmLabel?: undefined | string; allowEmpty?: undefined | false | true; min?: undefined | number; max?: undefined | number; dismissible?: undefined | false | true }",
7903
+ "typeImport": "TasksCardData",
7904
+ "displayType": "undefined | { mode?: undefined | \"select\" | \"progress\"; heading?: undefined | string; tasks: { id: string; label: string; description?: undefined | string; checked?: undefined | false | true; disabled?: undefined | false | true }[]; selectAll?: undefined | false | true; confirmLabel?: undefined | string; allowEmpty?: undefined | false | true; min?: undefined | number; max?: undefined | number; dismissible?: undefined | false | true }"
6731
7905
  },
6732
7906
  {
6733
7907
  "name": "cardId",
@@ -6792,7 +7966,7 @@
6792
7966
  {
6793
7967
  "name": "kai-value-change",
6794
7968
  "detail": "{ value: string[] }",
6795
- "description": "The selection changed on a toggle the selected ids in input order.",
7969
+ "description": "The selection changed on a toggle. Carries the selected ids in input order.",
6796
7970
  "displayDetail": "{ value: string[] }"
6797
7971
  }
6798
7972
  ],
@@ -6813,7 +7987,7 @@
6813
7987
  "name": "send",
6814
7988
  "params": "",
6815
7989
  "returns": "void",
6816
- "description": "Confirm the current selection emits the `submit` CardEvent + resolves (only when the min/max gate passes). Named `send`, not `submit`."
7990
+ "description": "Confirm the current selection: emits the `submit` CardEvent + resolves (only when the min/max gate passes). Named `send`, not `submit`."
6817
7991
  },
6818
7992
  {
6819
7993
  "name": "focus",
@@ -6848,6 +8022,16 @@
6848
8022
  "className": "KaiTextShimmerElement",
6849
8023
  "displayName": "TextShimmer",
6850
8024
  "props": [
8025
+ {
8026
+ "name": "theme",
8027
+ "type": "\"light\" | \"dark\" | \"auto\"",
8028
+ "optional": true,
8029
+ "scalar": true,
8030
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8031
+ "default": "'auto'",
8032
+ "universal": true,
8033
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8034
+ },
6851
8035
  {
6852
8036
  "name": "text",
6853
8037
  "type": "undefined | string",
@@ -6901,6 +8085,16 @@
6901
8085
  "className": "KaiThinkingBarElement",
6902
8086
  "displayName": "ThinkingBar",
6903
8087
  "props": [
8088
+ {
8089
+ "name": "theme",
8090
+ "type": "\"light\" | \"dark\" | \"auto\"",
8091
+ "optional": true,
8092
+ "scalar": true,
8093
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8094
+ "default": "'auto'",
8095
+ "universal": true,
8096
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8097
+ },
6904
8098
  {
6905
8099
  "name": "text",
6906
8100
  "type": "undefined | string",
@@ -6952,31 +8146,44 @@
6952
8146
  "className": "KaiThreadElement",
6953
8147
  "displayName": "Thread",
6954
8148
  "props": [
8149
+ {
8150
+ "name": "theme",
8151
+ "type": "\"light\" | \"dark\" | \"auto\"",
8152
+ "optional": true,
8153
+ "scalar": true,
8154
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8155
+ "default": "'auto'",
8156
+ "universal": true,
8157
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8158
+ },
6955
8159
  {
6956
8160
  "name": "messages",
6957
- "type": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
8161
+ "type": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
6958
8162
  "optional": true,
6959
8163
  "scalar": false,
6960
- "description": "The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions/avatar. Set as a JS property (`el.messages = [...]`); a NEW array reference per streaming chunk re-renders (mutating in place does not).",
6961
- "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
8164
+ "description": "The full message thread to render, newest last. Each entry carries its role, ordered `parts`, and optional actions/avatar/feedback. Set as a JS property (`el.messages = [...]`); a NEW array reference per streaming chunk re-renders (mutating in place does not).",
8165
+ "typeName": "ChatMessage[]",
8166
+ "typeShape": "{ id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
8167
+ "typeImport": "ChatMessage",
8168
+ "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
6962
8169
  },
6963
8170
  {
6964
8171
  "name": "loading",
6965
8172
  "type": "undefined | false | true",
6966
8173
  "optional": true,
6967
8174
  "scalar": true,
6968
- "description": "Show a typing indicator on the pending assistant turn set while awaiting the assistant's reply.",
8175
+ "description": "Show a typing indicator on the pending assistant turn. Set it while awaiting the assistant's reply.",
6969
8176
  "default": "false",
6970
8177
  "displayType": "undefined | false | true"
6971
8178
  },
6972
8179
  {
6973
8180
  "name": "proseSize",
6974
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
8181
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
6975
8182
  "optional": true,
6976
8183
  "scalar": true,
6977
8184
  "description": "Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`). Defaults to `'sm'`.",
6978
8185
  "default": "'sm'",
6979
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
8186
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
6980
8187
  },
6981
8188
  {
6982
8189
  "name": "codeTheme",
@@ -7021,6 +8228,22 @@
7021
8228
  "scalar": true,
7022
8229
  "description": "Extra classes applied to the thread's inner root.",
7023
8230
  "displayType": "undefined | string"
8231
+ },
8232
+ {
8233
+ "name": "cardTypes",
8234
+ "type": "undefined | Record<string, string>",
8235
+ "optional": true,
8236
+ "scalar": false,
8237
+ "description": "Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
8238
+ "displayType": "undefined | Record<string, string>"
8239
+ },
8240
+ {
8241
+ "name": "cardSchemas",
8242
+ "type": "undefined | Record<string, object>",
8243
+ "optional": true,
8244
+ "scalar": false,
8245
+ "description": "JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `\"type\"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one.",
8246
+ "displayType": "undefined | Record<string, object>"
7024
8247
  }
7025
8248
  ],
7026
8249
  "events": [
@@ -7060,17 +8283,27 @@
7060
8283
  "className": "KaiToastRegionElement",
7061
8284
  "displayName": "ToastRegion",
7062
8285
  "props": [
8286
+ {
8287
+ "name": "theme",
8288
+ "type": "\"light\" | \"dark\" | \"auto\"",
8289
+ "optional": true,
8290
+ "scalar": true,
8291
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8292
+ "default": "'auto'",
8293
+ "universal": true,
8294
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8295
+ },
7063
8296
  {
7064
8297
  "name": "toasts",
7065
- "type": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
7066
- "optional": false,
8298
+ "type": "undefined | { id: string; message: string; variant?: undefined | \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
8299
+ "optional": true,
7067
8300
  "scalar": false,
7068
- "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update.",
8301
+ "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts.",
7069
8302
  "typeName": "ToastItem[]",
7070
- "typeShape": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
8303
+ "typeShape": "{ id: string; message: string; variant?: undefined | \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
7071
8304
  "default": "[]",
7072
8305
  "typeImport": "ToastItem",
7073
- "displayType": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]"
8306
+ "displayType": "undefined | { id: string; message: string; variant?: undefined | \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]"
7074
8307
  },
7075
8308
  {
7076
8309
  "name": "position",
@@ -7135,9 +8368,9 @@
7135
8368
  },
7136
8369
  {
7137
8370
  "name": "kai-dismiss",
7138
- "detail": "{ id: string; reason: \"action\" | \"timeout\" | \"close\" }",
8371
+ "detail": "{ id: string; reason: \"timeout\" | \"close\" | \"action\" }",
7139
8372
  "description": "A toast left the stack. `reason` is `'timeout' | 'close' | 'action'`.",
7140
- "displayDetail": "{ id: string; reason: \"action\" | \"timeout\" | \"close\" }"
8373
+ "displayDetail": "{ id: string; reason: \"timeout\" | \"close\" | \"action\" }"
7141
8374
  }
7142
8375
  ],
7143
8376
  "methods": [],
@@ -7155,13 +8388,26 @@
7155
8388
  "className": "KaiToolElement",
7156
8389
  "displayName": "Tool",
7157
8390
  "props": [
8391
+ {
8392
+ "name": "theme",
8393
+ "type": "\"light\" | \"dark\" | \"auto\"",
8394
+ "optional": true,
8395
+ "scalar": true,
8396
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8397
+ "default": "'auto'",
8398
+ "universal": true,
8399
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8400
+ },
7158
8401
  {
7159
8402
  "name": "tool",
7160
- "type": "undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }",
8403
+ "type": "undefined | { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }",
7161
8404
  "optional": true,
7162
8405
  "scalar": false,
7163
8406
  "description": "The tool-call to display. Set as a JS property.",
7164
- "displayType": "ToolPart | undefined"
8407
+ "typeName": "ToolPart",
8408
+ "typeShape": "{ type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }",
8409
+ "typeImport": "ToolPart",
8410
+ "displayType": "undefined | { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }"
7165
8411
  },
7166
8412
  {
7167
8413
  "name": "open",
@@ -7184,7 +8430,7 @@
7184
8430
  "type": "undefined | false | true",
7185
8431
  "optional": true,
7186
8432
  "scalar": true,
7187
- "description": "Gate the disclosure trigger programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
8433
+ "description": "Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
7188
8434
  "displayType": "undefined | false | true"
7189
8435
  }
7190
8436
  ],
@@ -7235,6 +8481,16 @@
7235
8481
  "className": "KaiTooltipElement",
7236
8482
  "displayName": "Tooltip",
7237
8483
  "props": [
8484
+ {
8485
+ "name": "theme",
8486
+ "type": "\"light\" | \"dark\" | \"auto\"",
8487
+ "optional": true,
8488
+ "scalar": true,
8489
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8490
+ "default": "'auto'",
8491
+ "universal": true,
8492
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8493
+ },
7238
8494
  {
7239
8495
  "name": "content",
7240
8496
  "type": "undefined | string",
@@ -7328,19 +8584,36 @@
7328
8584
  "storyId": "solid-advanced-primitives-tooltip--docs"
7329
8585
  }
7330
8586
  ],
7331
- "tokens": []
8587
+ "tokens": [],
8588
+ "slots": [
8589
+ {
8590
+ "name": "",
8591
+ "mode": "inject",
8592
+ "doc": "The TRIGGER the tooltip describes. The tip text is the `text` prop."
8593
+ }
8594
+ ]
7332
8595
  },
7333
8596
  {
7334
8597
  "tag": "kai-voice-input",
7335
8598
  "className": "KaiVoiceInputElement",
7336
8599
  "displayName": "VoiceInput",
7337
8600
  "props": [
8601
+ {
8602
+ "name": "theme",
8603
+ "type": "\"light\" | \"dark\" | \"auto\"",
8604
+ "optional": true,
8605
+ "scalar": true,
8606
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8607
+ "default": "'auto'",
8608
+ "universal": true,
8609
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8610
+ },
7338
8611
  {
7339
8612
  "name": "transcribe",
7340
8613
  "type": "undefined | (audio: Blob) => Promise<string>",
7341
8614
  "optional": true,
7342
8615
  "scalar": false,
7343
- "description": "Transcriber the host supplies records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event.",
8616
+ "description": "Transcriber the host supplies: records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event.",
7344
8617
  "displayType": "undefined | (audio: Blob) => Promise<string>"
7345
8618
  },
7346
8619
  {
@@ -7374,13 +8647,13 @@
7374
8647
  {
7375
8648
  "name": "kai-audio-captured",
7376
8649
  "detail": "{ blob: Blob }",
7377
- "description": "Raw audio captured (before transcription) for hosts that prefer to handle transcription themselves instead of via the `transcribe` property. Also the unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only the blob is produced (no text).",
8650
+ "description": "Raw audio captured (before transcription), for hosts that prefer to handle transcription themselves instead of via the `transcribe` property. Also the unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only the blob is produced (no text).",
7378
8651
  "displayDetail": "{ blob: Blob }"
7379
8652
  },
7380
8653
  {
7381
8654
  "name": "kai-recording-change",
7382
8655
  "detail": "{ recording: false | true }",
7383
- "description": "Recording started or stopped lets the host drive its own UI (waveform, push-to-talk indicator) in sync with the mic. Fires on real transitions only (manual click and programmatic start()/stop()), never on mount.",
8656
+ "description": "Recording started or stopped. Lets the host drive its own UI (waveform, push-to-talk indicator) in sync with the mic. Fires on real transitions only (manual click and programmatic start()/stop()), never on mount.",
7384
8657
  "displayDetail": "{ recording: false | true }"
7385
8658
  },
7386
8659
  {
@@ -7392,7 +8665,7 @@
7392
8665
  {
7393
8666
  "name": "kai-transcription",
7394
8667
  "detail": "{ text: string }",
7395
- "description": "Final transcript the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set).",
8668
+ "description": "Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set).",
7396
8669
  "displayDetail": "{ text: string }"
7397
8670
  }
7398
8671
  ],
@@ -7424,6 +8697,16 @@
7424
8697
  "className": "KaiVoiceOutputElement",
7425
8698
  "displayName": "VoiceOutput",
7426
8699
  "props": [
8700
+ {
8701
+ "name": "theme",
8702
+ "type": "\"light\" | \"dark\" | \"auto\"",
8703
+ "optional": true,
8704
+ "scalar": true,
8705
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8706
+ "default": "'auto'",
8707
+ "universal": true,
8708
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8709
+ },
7427
8710
  {
7428
8711
  "name": "text",
7429
8712
  "type": "undefined | string",
@@ -7447,7 +8730,7 @@
7447
8730
  "type": "undefined | (text: string) => Promise<Blob>",
7448
8731
  "optional": true,
7449
8732
  "scalar": false,
7450
- "description": "TTS model seam the host supplies given text, returns an audio `Blob` to play. This is a **function-valued property** (`el.synthesize = async text => blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be modelled as a fire-and-forget event, hence a property.",
8733
+ "description": "TTS model seam the host supplies: given text, returns an audio `Blob` to play. This is a **function-valued property** (`el.synthesize = async text => blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be modelled as a fire-and-forget event, hence a property.",
7451
8734
  "displayType": "undefined | (text: string) => Promise<Blob>"
7452
8735
  },
7453
8736
  {
@@ -7464,13 +8747,13 @@
7464
8747
  {
7465
8748
  "name": "kai-speaking-change",
7466
8749
  "detail": "{ speaking: false | true }",
7467
- "description": "Playback started or stopped drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount.",
8750
+ "description": "Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount.",
7468
8751
  "displayDetail": "{ speaking: false | true }"
7469
8752
  },
7470
8753
  {
7471
8754
  "name": "kai-synthesized",
7472
8755
  "detail": "{ blob: Blob }",
7473
- "description": "The model path (`synthesize`) resolved audio the raw `Blob` before playback.",
8756
+ "description": "The model path (`synthesize`) resolved audio: the raw `Blob` before playback.",
7474
8757
  "displayDetail": "{ blob: Blob }"
7475
8758
  }
7476
8759
  ],
@@ -7521,29 +8804,39 @@
7521
8804
  "className": "KaiWorkspaceElement",
7522
8805
  "displayName": "Workspace",
7523
8806
  "props": [
8807
+ {
8808
+ "name": "theme",
8809
+ "type": "\"light\" | \"dark\" | \"auto\"",
8810
+ "optional": true,
8811
+ "scalar": true,
8812
+ "description": "Color mode (`auto` follows prefers-color-scheme).",
8813
+ "default": "'auto'",
8814
+ "universal": true,
8815
+ "displayType": "\"light\" | \"dark\" | \"auto\""
8816
+ },
7524
8817
  {
7525
8818
  "name": "groups",
7526
- "type": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
7527
- "optional": false,
8819
+ "type": "undefined | { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
8820
+ "optional": true,
7528
8821
  "scalar": false,
7529
- "description": "Pre-bucketed conversation groups for the sidebar. Set as a JS property.",
8822
+ "description": "The sidebar's section headers, rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped sidebar. Set as a JS property.",
7530
8823
  "typeName": "ConversationGroup[]",
7531
8824
  "typeShape": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
7532
8825
  "default": "[]",
7533
8826
  "typeImport": "ConversationGroup",
7534
- "displayType": "ConversationGroup[]"
8827
+ "displayType": "undefined | { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]"
7535
8828
  },
7536
8829
  {
7537
8830
  "name": "conversations",
7538
- "type": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
7539
- "optional": false,
8831
+ "type": "undefined | { id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
8832
+ "optional": true,
7540
8833
  "scalar": false,
7541
- "description": "Flat conversation list (auto-bucketed if `groups` is empty). Set as a JS property.",
8834
+ "description": "Every conversation in the sidebar, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing ungrouped section (headerless when `compact`), so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit for an empty sidebar, or when `no-conversations` replaces the built-in list with your own `sidebar-header` content.",
7542
8835
  "typeName": "ConversationSummary[]",
7543
8836
  "typeShape": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
7544
8837
  "default": "[]",
7545
8838
  "typeImport": "ConversationSummary",
7546
- "displayType": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
8839
+ "displayType": "undefined | { id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
7547
8840
  },
7548
8841
  {
7549
8842
  "name": "activeId",
@@ -7555,15 +8848,15 @@
7555
8848
  },
7556
8849
  {
7557
8850
  "name": "messages",
7558
- "type": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
7559
- "optional": false,
8851
+ "type": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
8852
+ "optional": true,
7560
8853
  "scalar": false,
7561
- "description": "The active conversation's message thread, newest last. Set as a JS property.",
8854
+ "description": "The active conversation's message thread, newest last. Set as a JS property (`el.messages = [...]`); a NEW array reference per streaming chunk re-renders (mutating in place does not). Omit for an empty thread.",
7562
8855
  "typeName": "ChatMessage[]",
7563
- "typeShape": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
8856
+ "typeShape": "{ id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
7564
8857
  "default": "[]",
7565
8858
  "typeImport": "ChatMessage",
7566
- "displayType": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
8859
+ "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; parts: ({ type: \"text\"; text: string; raw?: undefined | { source: string; payload: unknown } } | { type: \"reasoning\"; text: string; label?: undefined | string; index?: undefined | number; streamId?: undefined | string; signature?: undefined | string; raw?: undefined | { source: string; payload: unknown } } | { type: \"tool\"; tool: { type: string; kind?: undefined | \"command\" | \"file-change\" | \"search\" | \"fetch\" | \"mcp\" | \"image\" | \"generic\"; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; rawInput?: undefined | string; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string; raw?: undefined | { source: string; payload: unknown } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"card\"; envelope: { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }; raw?: undefined | { source: string; payload: unknown } } | { type: \"source\"; source: { id?: undefined | string; url?: undefined | string; title?: undefined | string; snippet?: undefined | string; index?: undefined | number }; raw?: undefined | { source: string; payload: unknown } } | { type: \"file\"; attachment: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }; raw?: undefined | { source: string; payload: unknown } })[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
7567
8860
  },
7568
8861
  {
7569
8862
  "name": "value",
@@ -7610,12 +8903,12 @@
7610
8903
  },
7611
8904
  {
7612
8905
  "name": "proseSize",
7613
- "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
8906
+ "type": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\"",
7614
8907
  "optional": true,
7615
8908
  "scalar": true,
7616
8909
  "description": "",
7617
8910
  "default": "'sm'",
7618
- "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
8911
+ "displayType": "undefined | \"xs\" | \"sm\" | \"base\" | \"lg\""
7619
8912
  },
7620
8913
  {
7621
8914
  "name": "codeTheme",
@@ -7649,6 +8942,9 @@
7649
8942
  "optional": true,
7650
8943
  "scalar": false,
7651
8944
  "description": "",
8945
+ "typeName": "ModelOption[]",
8946
+ "typeShape": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
8947
+ "typeImport": "ModelOption",
7652
8948
  "displayType": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
7653
8949
  },
7654
8950
  {
@@ -7665,6 +8961,9 @@
7665
8961
  "optional": true,
7666
8962
  "scalar": false,
7667
8963
  "description": "",
8964
+ "typeName": "ChatThreadContextUsage",
8965
+ "typeShape": "{ usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }",
8966
+ "typeImport": "ChatThreadContextUsage",
7668
8967
  "displayType": "ContextData | undefined"
7669
8968
  },
7670
8969
  {
@@ -7700,6 +8999,9 @@
7700
8999
  "optional": true,
7701
9000
  "scalar": false,
7702
9001
  "description": "Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input.",
9002
+ "typeName": "TriggerDef[]",
9003
+ "typeShape": "{ char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
9004
+ "typeImport": "TriggerDef",
7703
9005
  "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
7704
9006
  },
7705
9007
  {
@@ -7776,6 +9078,22 @@
7776
9078
  "scalar": true,
7777
9079
  "description": "Suppress the built-in ConversationList so the `sidebar-header` slot owns the whole rail flex region (for apps that supply their own rail nav). Default false. Attribute: `no-conversations`.",
7778
9080
  "displayType": "undefined | false | true"
9081
+ },
9082
+ {
9083
+ "name": "cardTypes",
9084
+ "type": "undefined | Record<string, string>",
9085
+ "optional": true,
9086
+ "scalar": false,
9087
+ "description": "Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
9088
+ "displayType": "undefined | Record<string, string>"
9089
+ },
9090
+ {
9091
+ "name": "cardSchemas",
9092
+ "type": "undefined | Record<string, object>",
9093
+ "optional": true,
9094
+ "scalar": false,
9095
+ "description": "JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `\"type\"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one.",
9096
+ "displayType": "undefined | Record<string, object>"
7779
9097
  }
7780
9098
  ],
7781
9099
  "events": [