entasis 0.10.2 → 0.12.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 (841) hide show
  1. package/README.md +1 -1
  2. package/dist/attachments/disclosurePanel.svelte.d.ts +84 -0
  3. package/dist/attachments/disclosurePanel.svelte.js +277 -0
  4. package/dist/attachments/portal.d.ts +17 -1
  5. package/dist/attachments/portal.js +39 -2
  6. package/dist/attachments/spinnerOverlay.svelte.js +12 -0
  7. package/dist/attachments/transitionSize.d.ts +6 -0
  8. package/dist/attachments/transitionSize.js +30 -0
  9. package/dist/components/AIAskUserQuestion/AIAskUserQuestion.svelte +131 -17
  10. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte +26 -6
  11. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte.d.ts +6 -0
  12. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte +27 -53
  13. package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte.d.ts +3 -4
  14. package/dist/components/AIAskUserQuestion/AIAskUserQuestionHeader.svelte +19 -16
  15. package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte +180 -21
  16. package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte.d.ts +9 -1
  17. package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte +56 -0
  18. package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte.d.ts +4 -0
  19. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.d.ts +1 -1
  20. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.js +26 -8
  21. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.props.d.ts +62 -5
  22. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.d.ts +42 -0
  23. package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.js +53 -12
  24. package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.d.ts +17 -1
  25. package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.js +56 -8
  26. package/dist/components/AIAskUserQuestion/index.d.ts +3 -1
  27. package/dist/components/AIAskUserQuestion/index.js +2 -0
  28. package/dist/components/AIAskUserQuestion/schemas.d.ts +44 -0
  29. package/dist/components/AIAskUserQuestion/schemas.js +10 -3
  30. package/dist/components/AIChat/AIChat.svelte +10 -0
  31. package/dist/components/AIChat/AIChat.svelte.d.ts +2 -2
  32. package/dist/components/AIChat/AIChatComposerSurface.svelte +23 -5
  33. package/dist/components/AIChat/AIChatComposerSurface.svelte.d.ts +5 -0
  34. package/dist/components/AIChat/AIChatSkeleton.svelte +29 -37
  35. package/dist/components/AIChat/AIChatSurface.svelte +30 -2
  36. package/dist/components/AIChat/AIChatSurface.svelte.d.ts +1 -1
  37. package/dist/components/AIChat/AIChatThreadSurface.svelte +11 -1
  38. package/dist/components/AIChat/AIChatThreadSurface.svelte.d.ts +3 -1
  39. package/dist/components/AIChat/aiChat.mcp.d.ts +1 -1
  40. package/dist/components/AIChat/aiChat.mcp.js +31 -15
  41. package/dist/components/AIChat/aiChat.props.d.ts +36 -10
  42. package/dist/components/AIChat/aiChat.theme.d.ts +9 -0
  43. package/dist/components/AIChat/aiChat.theme.js +21 -4
  44. package/dist/components/AIChat/aiChatSkeleton.props.d.ts +5 -0
  45. package/dist/components/AIChat/index.d.ts +1 -1
  46. package/dist/components/AIComposer/AIComposer.svelte +102 -5
  47. package/dist/components/AIComposer/AIComposer.svelte.d.ts +1 -0
  48. package/dist/components/AIComposer/AIComposerFooter.svelte +54 -12
  49. package/dist/components/AIComposer/AIComposerFooter.svelte.d.ts +2 -0
  50. package/dist/components/AIComposer/AIComposerQueue.svelte +8 -3
  51. package/dist/components/AIComposer/aiComposer.editor.theme.js +13 -2
  52. package/dist/components/AIComposer/aiComposer.mcp.d.ts +1 -1
  53. package/dist/components/AIComposer/aiComposer.mcp.js +15 -7
  54. package/dist/components/AIComposer/aiComposer.props.d.ts +27 -7
  55. package/dist/components/AIComposer/aiComposer.theme.d.ts +42 -3
  56. package/dist/components/AIComposer/aiComposer.theme.js +37 -5
  57. package/dist/components/AIComposer/aiComposerFileController.svelte.d.ts +20 -0
  58. package/dist/components/AIComposer/aiComposerFileController.svelte.js +75 -9
  59. package/dist/components/AIComposer/aiComposerSourceAdapter.js +22 -4
  60. package/dist/components/AIComposer/aiComposerSubmitController.svelte.d.ts +12 -0
  61. package/dist/components/AIComposer/aiComposerSubmitController.svelte.js +16 -6
  62. package/dist/components/AIContext/AIContext.svelte +7 -3
  63. package/dist/components/AIContext/aiContext.mcp.d.ts +1 -1
  64. package/dist/components/AIContext/aiContext.mcp.js +1 -1
  65. package/dist/components/AIContext/aiContext.props.d.ts +4 -1
  66. package/dist/components/AIContext/aiContext.theme.d.ts +3 -0
  67. package/dist/components/AIContext/aiContext.theme.js +7 -2
  68. package/dist/components/AIConversation/AIConversation.svelte.d.ts +2 -2
  69. package/dist/components/AIFilePreview/aiFilePreview.theme.js +1 -1
  70. package/dist/components/AIMarker/AIMarker.svelte +2 -0
  71. package/dist/components/AIMarker/aiMarker.mcp.d.ts +1 -1
  72. package/dist/components/AIMarker/aiMarker.mcp.js +2 -0
  73. package/dist/components/AIMarker/aiMarker.props.d.ts +3 -0
  74. package/dist/components/AIMarker/aiMarker.theme.js +2 -2
  75. package/dist/components/AIMessage/AIMessage.svelte +38 -16
  76. package/dist/components/AIMessage/aiMessage.mcp.d.ts +1 -1
  77. package/dist/components/AIMessage/aiMessage.mcp.js +20 -6
  78. package/dist/components/AIMessage/aiMessage.props.d.ts +18 -2
  79. package/dist/components/AIMessage/aiMessage.theme.d.ts +51 -6
  80. package/dist/components/AIMessage/aiMessage.theme.js +91 -32
  81. package/dist/components/AIMessageActions/AIMessageActions.svelte +19 -9
  82. package/dist/components/AIMessageActions/aiMessageActions.mcp.d.ts +1 -1
  83. package/dist/components/AIMessageActions/aiMessageActions.mcp.js +11 -3
  84. package/dist/components/AIMessageActions/aiMessageActions.theme.js +36 -9
  85. package/dist/components/AIModelSelector/AIModelSelector.svelte +25 -10
  86. package/dist/components/AIModelSelector/aiModelSelector.mcp.d.ts +1 -1
  87. package/dist/components/AIModelSelector/aiModelSelector.mcp.js +1 -1
  88. package/dist/components/AIModelSelector/aiModelSelector.theme.d.ts +3 -0
  89. package/dist/components/AIModelSelector/aiModelSelector.theme.js +7 -3
  90. package/dist/components/AIReasoning/AIReasoning.svelte +135 -38
  91. package/dist/components/AIReasoning/aiReasoning.mcp.d.ts +1 -1
  92. package/dist/components/AIReasoning/aiReasoning.mcp.js +11 -5
  93. package/dist/components/AIReasoning/aiReasoning.props.d.ts +15 -4
  94. package/dist/components/AIReasoning/aiReasoning.theme.d.ts +45 -0
  95. package/dist/components/AIReasoning/aiReasoning.theme.js +47 -7
  96. package/dist/components/AISuggestion/AISuggestion.svelte +2 -1
  97. package/dist/components/AISuggestion/AISuggestions.svelte +2 -1
  98. package/dist/components/AISuggestion/aiSuggestion.mcp.d.ts +1 -1
  99. package/dist/components/AISuggestion/aiSuggestion.mcp.js +8 -1
  100. package/dist/components/AISuggestion/aiSuggestion.props.d.ts +4 -1
  101. package/dist/components/AISuggestion/aiSuggestion.theme.js +1 -1
  102. package/dist/components/AISuggestion/aiSuggestions.props.d.ts +7 -0
  103. package/dist/components/AIThread/AIThread.svelte +378 -95
  104. package/dist/components/AIThread/AIThreadAskUserQuestion.svelte +1 -0
  105. package/dist/components/AIThread/AIThreadItems.svelte +266 -64
  106. package/dist/components/AIThread/AIThreadItems.svelte.d.ts +7 -3
  107. package/dist/components/AIThread/AIThreadMarker.svelte +8 -1
  108. package/dist/components/AIThread/AIThreadMarker.svelte.d.ts +1 -0
  109. package/dist/components/AIThread/aiThread.mcp.d.ts +1 -1
  110. package/dist/components/AIThread/aiThread.mcp.js +34 -20
  111. package/dist/components/AIThread/aiThread.props.d.ts +73 -8
  112. package/dist/components/AIThread/aiThread.theme.d.ts +78 -0
  113. package/dist/components/AIThread/aiThread.theme.js +108 -9
  114. package/dist/components/AIThread/index.d.ts +1 -1
  115. package/dist/components/AIThread/threadAskUserQuestion.d.ts +4 -1
  116. package/dist/components/AIThread/threadAskUserQuestion.js +8 -4
  117. package/dist/components/AIThread/threadRenderItems.d.ts +74 -3
  118. package/dist/components/AIThread/threadRenderItems.js +265 -77
  119. package/dist/components/AIThread/threadScrollController.d.ts +0 -8
  120. package/dist/components/AIThread/threadScrollController.js +2 -39
  121. package/dist/components/AIThread/threadTools.d.ts +11 -0
  122. package/dist/components/AIThread/threadTools.js +79 -0
  123. package/dist/components/AIThreadToc/AIThreadToc.svelte +188 -18
  124. package/dist/components/AIThreadToc/AIThreadTocPreview.svelte +25 -2
  125. package/dist/components/AIThreadToc/AIThreadTocPreview.svelte.d.ts +3 -0
  126. package/dist/components/AIThreadToc/aiThreadToc.d.ts +4 -2
  127. package/dist/components/AIThreadToc/aiThreadToc.js +17 -5
  128. package/dist/components/AIThreadToc/aiThreadToc.mcp.d.ts +1 -1
  129. package/dist/components/AIThreadToc/aiThreadToc.mcp.js +13 -3
  130. package/dist/components/AIThreadToc/aiThreadToc.props.d.ts +11 -0
  131. package/dist/components/AIThreadToc/aiThreadToc.theme.d.ts +3 -0
  132. package/dist/components/AIThreadToc/aiThreadToc.theme.js +15 -6
  133. package/dist/components/AITool/AITool.svelte +56 -21
  134. package/dist/components/AITool/AIToolCallList.svelte +79 -29
  135. package/dist/components/AITool/AIToolCallList.svelte.d.ts +6 -2
  136. package/dist/components/AITool/AIToolStatusMark.svelte +52 -0
  137. package/dist/components/AITool/AIToolStatusMark.svelte.d.ts +14 -0
  138. package/dist/components/AITool/AIToolValueSection.svelte +126 -28
  139. package/dist/components/AITool/AIToolValueSection.svelte.d.ts +6 -2
  140. package/dist/components/AITool/AIToolValueTree.svelte +11 -16
  141. package/dist/components/AITool/AIToolValueTree.svelte.d.ts +2 -3
  142. package/dist/components/AITool/aiTool.mcp.d.ts +1 -1
  143. package/dist/components/AITool/aiTool.mcp.js +36 -8
  144. package/dist/components/AITool/aiTool.props.d.ts +52 -6
  145. package/dist/components/AITool/aiTool.theme.d.ts +117 -39
  146. package/dist/components/AITool/aiTool.theme.js +144 -140
  147. package/dist/components/AITool/aiToolClock.svelte.d.ts +18 -0
  148. package/dist/components/AITool/aiToolClock.svelte.js +62 -0
  149. package/dist/components/AITool/aiToolPrimitiveThemes.d.ts +0 -2
  150. package/dist/components/AITool/aiToolPrimitiveThemes.js +0 -10
  151. package/dist/components/AITool/index.d.ts +2 -1
  152. package/dist/components/AITool/index.js +1 -0
  153. package/dist/components/AITool/toolRendering.d.ts +33 -1
  154. package/dist/components/AITool/toolRendering.js +179 -15
  155. package/dist/components/AITool/toolValueTree.d.ts +14 -1
  156. package/dist/components/AITool/toolValueTree.js +126 -27
  157. package/dist/components/Accordion/Accordion.svelte +109 -109
  158. package/dist/components/Accordion/Accordion.svelte.d.ts +0 -1
  159. package/dist/components/Accordion/AccordionPanel.svelte +64 -0
  160. package/dist/components/Accordion/AccordionPanel.svelte.d.ts +20 -0
  161. package/dist/components/Accordion/accordion.attributes.d.ts +24 -0
  162. package/dist/components/Accordion/accordion.attributes.js +20 -0
  163. package/dist/components/Accordion/accordion.mcp.d.ts +1 -1
  164. package/dist/components/Accordion/accordion.mcp.js +78 -22
  165. package/dist/components/Accordion/accordion.props.d.ts +54 -10
  166. package/dist/components/Accordion/accordion.theme.d.ts +3 -0
  167. package/dist/components/Accordion/accordion.theme.js +4 -0
  168. package/dist/components/Accordion/index.d.ts +1 -0
  169. package/dist/components/Accordion/index.js +1 -0
  170. package/dist/components/AudioPlayer/audioPlayerVolumeControl.slider.theme.d.ts +31 -1
  171. package/dist/components/Avatar/Avatar.svelte +60 -10
  172. package/dist/components/Avatar/AvatarGroup.svelte +9 -0
  173. package/dist/components/Avatar/avatar.mcp.d.ts +1 -1
  174. package/dist/components/Avatar/avatar.mcp.js +13 -5
  175. package/dist/components/Avatar/avatar.props.d.ts +28 -1
  176. package/dist/components/Avatar/avatar.theme.js +3 -3
  177. package/dist/components/Avatar/index.d.ts +1 -1
  178. package/dist/components/Breadcrumbs/breadcrumbs.mcp.d.ts +1 -1
  179. package/dist/components/Breadcrumbs/breadcrumbs.mcp.js +1 -1
  180. package/dist/components/Button/Button.svelte +35 -15
  181. package/dist/components/Button/button.mcp.d.ts +1 -1
  182. package/dist/components/Button/button.mcp.js +8 -4
  183. package/dist/components/Button/button.props.d.ts +23 -8
  184. package/dist/components/Button/button.theme.d.ts +12 -0
  185. package/dist/components/Button/button.theme.js +17 -4
  186. package/dist/components/ButtonGroup/buttonGroup.mcp.d.ts +1 -1
  187. package/dist/components/ButtonGroup/buttonGroup.mcp.js +1 -1
  188. package/dist/components/ButtonGroup/buttonGroup.props.d.ts +4 -1
  189. package/dist/components/Collapsible/Collapsible.svelte +125 -19
  190. package/dist/components/Collapsible/collapsible.attributes.d.ts +21 -0
  191. package/dist/components/Collapsible/collapsible.attributes.js +17 -0
  192. package/dist/components/Collapsible/collapsible.mcp.d.ts +1 -1
  193. package/dist/components/Collapsible/collapsible.mcp.js +62 -12
  194. package/dist/components/Collapsible/collapsible.props.d.ts +39 -8
  195. package/dist/components/Collapsible/collapsible.theme.js +3 -1
  196. package/dist/components/Collapsible/index.d.ts +1 -0
  197. package/dist/components/Collapsible/index.js +1 -0
  198. package/dist/components/Command/Command.svelte +56 -14
  199. package/dist/components/Command/command.mcp.d.ts +1 -1
  200. package/dist/components/Command/command.mcp.js +12 -6
  201. package/dist/components/Command/command.props.d.ts +39 -6
  202. package/dist/components/Command/command.state.svelte.d.ts +40 -11
  203. package/dist/components/Command/command.state.svelte.js +75 -28
  204. package/dist/components/Command/command.theme.js +4 -3
  205. package/dist/components/Confirmation/Confirmation.svelte +72 -31
  206. package/dist/components/Confirmation/confirmation.mcp.d.ts +1 -1
  207. package/dist/components/Confirmation/confirmation.mcp.js +5 -4
  208. package/dist/components/ContextMenu/ContextMenu.svelte +126 -16
  209. package/dist/components/ContextMenu/contextMenu.mcp.d.ts +1 -1
  210. package/dist/components/ContextMenu/contextMenu.mcp.js +10 -7
  211. package/dist/components/ContextMenu/contextMenu.props.d.ts +13 -4
  212. package/dist/components/ContextMenu/contextMenu.theme.d.ts +3 -3
  213. package/dist/components/ContextMenu/contextMenu.theme.js +3 -2
  214. package/dist/components/DataTable/DataTable.svelte +4 -9
  215. package/dist/components/DataTable/DataTableEditor.svelte +5 -0
  216. package/dist/components/DataTable/DataTableFilter.svelte +1 -0
  217. package/dist/components/DataTable/DataTableToolbar.svelte +1 -0
  218. package/dist/components/DataTable/dataTable.mcp.d.ts +1 -1
  219. package/dist/components/DataTable/dataTable.mcp.js +4 -2
  220. package/dist/components/DataTable/dataTable.theme.d.ts +0 -3
  221. package/dist/components/DataTable/dataTable.theme.js +9 -6
  222. package/dist/components/Dialog/Dialog.svelte +120 -35
  223. package/dist/components/Dialog/Dialog.svelte.d.ts +1 -1
  224. package/dist/components/Dialog/DialogBackdrop.svelte +21 -1
  225. package/dist/components/Dialog/dialog.api.d.ts +65 -0
  226. package/dist/components/Dialog/dialog.api.js +1 -0
  227. package/dist/components/Dialog/dialog.attributes.d.ts +23 -0
  228. package/dist/components/Dialog/dialog.attributes.js +19 -0
  229. package/dist/components/Dialog/dialog.indent.d.ts +6 -0
  230. package/dist/components/Dialog/dialog.indent.js +16 -0
  231. package/dist/components/Dialog/dialog.mcp.d.ts +1 -1
  232. package/dist/components/Dialog/dialog.mcp.js +195 -22
  233. package/dist/components/Dialog/dialog.props.d.ts +102 -19
  234. package/dist/components/Dialog/dialog.snap.d.ts +40 -0
  235. package/dist/components/Dialog/dialog.snap.js +78 -0
  236. package/dist/components/Dialog/dialog.state.svelte.d.ts +122 -10
  237. package/dist/components/Dialog/dialog.state.svelte.js +525 -66
  238. package/dist/components/Dialog/dialog.theme.d.ts +48 -0
  239. package/dist/components/Dialog/dialog.theme.js +32 -9
  240. package/dist/components/Dialog/index.d.ts +4 -1
  241. package/dist/components/Dialog/index.js +1 -0
  242. package/dist/components/DocumentViewer/DocumentSearchControl.svelte +5 -3
  243. package/dist/components/DocumentViewer/documentOutput.js +2 -1
  244. package/dist/components/FloatingWindow/FloatingWindow.svelte +20 -32
  245. package/dist/components/FloatingWindow/FloatingWindow.svelte.d.ts +1 -1
  246. package/dist/components/FloatingWindow/floatingWindow.mcp.d.ts +1 -1
  247. package/dist/components/FloatingWindow/floatingWindow.mcp.js +3 -3
  248. package/dist/components/FloatingWindow/floatingWindow.props.d.ts +9 -4
  249. package/dist/components/FloatingWindow/floatingWindow.state.svelte.d.ts +8 -2
  250. package/dist/components/FloatingWindow/floatingWindow.state.svelte.js +18 -7
  251. package/dist/components/Form/Ask/Ask.svelte +9 -13
  252. package/dist/components/Form/Ask/ask.mcp.d.ts +1 -1
  253. package/dist/components/Form/Ask/ask.mcp.js +1 -1
  254. package/dist/components/Form/Ask/ask.props.d.ts +1 -1
  255. package/dist/components/Form/Autocomplete/Autocomplete.svelte +418 -0
  256. package/dist/components/Form/Autocomplete/Autocomplete.svelte.d.ts +4 -0
  257. package/dist/components/Form/Autocomplete/autocomplete.items.d.ts +30 -0
  258. package/dist/components/Form/Autocomplete/autocomplete.items.js +64 -0
  259. package/dist/components/Form/Autocomplete/autocomplete.mcp.d.ts +1 -0
  260. package/dist/components/Form/Autocomplete/autocomplete.mcp.js +134 -0
  261. package/dist/components/Form/Autocomplete/autocomplete.props.d.ts +146 -0
  262. package/dist/components/Form/Autocomplete/autocomplete.props.js +1 -0
  263. package/dist/components/Form/Autocomplete/autocomplete.theme.d.ts +213 -0
  264. package/dist/components/Form/Autocomplete/autocomplete.theme.js +119 -0
  265. package/dist/components/Form/Autocomplete/index.d.ts +3 -0
  266. package/dist/components/Form/Autocomplete/index.js +2 -0
  267. package/dist/components/Form/Calendar/CalendarInput.svelte +9 -0
  268. package/dist/components/Form/Calendar/CalendarMonthYearPicker.svelte +3 -0
  269. package/dist/components/Form/Calendar/CalendarPrimitive.svelte +5 -0
  270. package/dist/components/Form/Calendar/calendar.mcp.d.ts +1 -1
  271. package/dist/components/Form/Calendar/calendar.mcp.js +2 -1
  272. package/dist/components/Form/Calendar/calendarInput.props.d.ts +2 -0
  273. package/dist/components/Form/Calendar/useCalendar.svelte.d.ts +3 -0
  274. package/dist/components/Form/Calendar/useCalendar.svelte.js +3 -0
  275. package/dist/components/Form/Checkbox/Checkbox.svelte +17 -2
  276. package/dist/components/Form/Checkbox/checkbox.mcp.d.ts +1 -1
  277. package/dist/components/Form/Checkbox/checkbox.mcp.js +11 -1
  278. package/dist/components/Form/Checkbox/checkbox.props.d.ts +12 -1
  279. package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte +69 -32
  280. package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte.d.ts +10 -2
  281. package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte +123 -74
  282. package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte.d.ts +12 -12
  283. package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.d.ts +1 -1
  284. package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.js +11 -7
  285. package/dist/components/Form/CheckboxesInput/checkboxesInput.props.d.ts +25 -9
  286. package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.d.ts +12 -0
  287. package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.js +9 -4
  288. package/dist/components/Form/CheckboxesInput/choiceEnter.d.ts +11 -0
  289. package/dist/components/Form/CheckboxesInput/choiceEnter.js +27 -0
  290. package/dist/components/Form/ColorInput/ColorInput.svelte +12 -3
  291. package/dist/components/Form/ColorInput/colorInput.mcp.d.ts +1 -1
  292. package/dist/components/Form/ColorInput/colorInput.mcp.js +1 -0
  293. package/dist/components/Form/ColorPicker/ColorPicker.svelte +11 -2
  294. package/dist/components/Form/ColorPicker/ColorPickerInput.svelte +9 -0
  295. package/dist/components/Form/ColorPicker/colorPicker.mcp.d.ts +1 -1
  296. package/dist/components/Form/ColorPicker/colorPicker.mcp.js +1 -0
  297. package/dist/components/Form/ColorPicker/colorPicker.props.d.ts +2 -0
  298. package/dist/components/Form/ColorPicker/colorPicker.state.svelte.d.ts +4 -0
  299. package/dist/components/Form/ColorPicker/colorPicker.state.svelte.js +12 -8
  300. package/dist/components/Form/Combobox/Combobox.svelte +145 -185
  301. package/dist/components/Form/Combobox/Combobox.svelte.d.ts +1 -1
  302. package/dist/components/Form/Combobox/ComboboxPopup.svelte +128 -0
  303. package/dist/components/Form/Combobox/ComboboxPopup.svelte.d.ts +28 -0
  304. package/dist/components/Form/Combobox/combobox.attributes.d.ts +34 -0
  305. package/dist/components/Form/Combobox/combobox.attributes.js +25 -0
  306. package/dist/components/Form/Combobox/combobox.items.d.ts +28 -0
  307. package/dist/components/Form/Combobox/combobox.items.js +68 -0
  308. package/dist/components/Form/Combobox/combobox.mcp.d.ts +1 -1
  309. package/dist/components/Form/Combobox/combobox.mcp.js +104 -13
  310. package/dist/components/Form/Combobox/combobox.props.d.ts +113 -19
  311. package/dist/components/Form/Combobox/combobox.state.svelte.d.ts +137 -0
  312. package/dist/components/Form/Combobox/combobox.state.svelte.js +375 -0
  313. package/dist/components/Form/Combobox/combobox.theme.d.ts +63 -0
  314. package/dist/components/Form/Combobox/combobox.theme.js +37 -1
  315. package/dist/components/Form/Combobox/index.d.ts +2 -1
  316. package/dist/components/Form/Combobox/index.js +1 -0
  317. package/dist/components/Form/DateInput/DateInput.svelte +11 -3
  318. package/dist/components/Form/DateInput/dateInput.mcp.d.ts +1 -1
  319. package/dist/components/Form/DateInput/dateInput.mcp.js +5 -0
  320. package/dist/components/Form/DateSelector/DateSelector.svelte +5 -2
  321. package/dist/components/Form/DateSelector/DateSelectorInput.svelte +9 -0
  322. package/dist/components/Form/DateSelector/dateSelector.mcp.d.ts +1 -1
  323. package/dist/components/Form/DateSelector/dateSelector.mcp.js +2 -2
  324. package/dist/components/Form/DateSelector/dateSelector.props.d.ts +2 -0
  325. package/dist/components/Form/Field/Field.svelte +258 -32
  326. package/dist/components/Form/Field/Field.svelte.d.ts +15 -6
  327. package/dist/components/Form/Field/FieldGroup.svelte +29 -0
  328. package/dist/components/Form/Field/FieldGroup.svelte.d.ts +11 -0
  329. package/dist/components/Form/Field/FieldHiddenInputs.svelte +187 -0
  330. package/dist/components/Form/Field/FieldHiddenInputs.svelte.d.ts +26 -0
  331. package/dist/components/Form/Field/field.d.ts +75 -10
  332. package/dist/components/Form/Field/field.mcp.d.ts +1 -1
  333. package/dist/components/Form/Field/field.mcp.js +158 -18
  334. package/dist/components/Form/Field/field.messages.d.ts +47 -0
  335. package/dist/components/Form/Field/field.messages.js +64 -0
  336. package/dist/components/Form/Field/field.state.svelte.d.ts +117 -40
  337. package/dist/components/Form/Field/field.state.svelte.js +525 -16
  338. package/dist/components/Form/Field/field.theme.d.ts +46 -0
  339. package/dist/components/Form/Field/field.theme.js +33 -0
  340. package/dist/components/Form/Field/fieldHiddenInputs.props.d.ts +61 -0
  341. package/dist/components/Form/Field/fieldHiddenInputs.props.js +1 -0
  342. package/dist/components/Form/Field/fieldNativeForm.svelte.d.ts +14 -0
  343. package/dist/components/Form/Field/fieldNativeForm.svelte.js +113 -0
  344. package/dist/components/Form/Field/index.d.ts +5 -2
  345. package/dist/components/Form/Field/index.js +1 -0
  346. package/dist/components/Form/Field/schemas.js +7 -2
  347. package/dist/components/Form/File/FileInput.svelte +24 -3
  348. package/dist/components/Form/File/fileInput.mcp.d.ts +1 -1
  349. package/dist/components/Form/File/fileInput.mcp.js +1 -0
  350. package/dist/components/Form/Form/Form.svelte +49 -15
  351. package/dist/components/Form/Form/FormActions.svelte +3 -1
  352. package/dist/components/Form/Form/FormActions.svelte.d.ts +42 -2
  353. package/dist/components/Form/Form/FormFieldRenderer.svelte +96 -12
  354. package/dist/components/Form/Form/FormFieldRenderer.svelte.d.ts +3 -2
  355. package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
  356. package/dist/components/Form/Form/form.d.ts +84 -11
  357. package/dist/components/Form/Form/form.mcp.d.ts +1 -1
  358. package/dist/components/Form/Form/form.mcp.js +178 -12
  359. package/dist/components/Form/Form/form.props.d.ts +32 -1
  360. package/dist/components/Form/Form/form.registry.d.ts +28 -0
  361. package/dist/components/Form/Form/form.registry.js +59 -0
  362. package/dist/components/Form/Form/form.state.svelte.d.ts +1186 -420
  363. package/dist/components/Form/Form/form.state.svelte.js +322 -28
  364. package/dist/components/Form/Form/index.d.ts +4 -1
  365. package/dist/components/Form/Form/index.js +1 -0
  366. package/dist/components/Form/Form/visibility.d.ts +3130 -1863
  367. package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
  368. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
  369. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
  370. package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
  371. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
  372. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
  373. package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
  374. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1050 -408
  375. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
  376. package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
  377. package/dist/components/Form/NumberInput/index.d.ts +1 -1
  378. package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
  379. package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
  380. package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
  381. package/dist/components/Form/PasswordInput/Password.svelte +28 -1
  382. package/dist/components/Form/PasswordInput/index.d.ts +1 -1
  383. package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
  384. package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
  385. package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
  386. package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
  387. package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
  388. package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
  389. package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
  390. package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
  391. package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
  392. package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
  393. package/dist/components/Form/PinInput/PinInput.svelte +44 -9
  394. package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
  395. package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
  396. package/dist/components/Form/PinInput/index.d.ts +1 -1
  397. package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
  398. package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
  399. package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
  400. package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
  401. package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
  402. package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
  403. package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
  404. package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
  405. package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
  406. package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
  407. package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
  408. package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
  409. package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
  410. package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
  411. package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
  412. package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
  413. package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
  414. package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
  415. package/dist/components/Form/Select/Select.svelte +186 -48
  416. package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
  417. package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
  418. package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
  419. package/dist/components/Form/Select/index.d.ts +2 -1
  420. package/dist/components/Form/Select/index.js +1 -0
  421. package/dist/components/Form/Select/select.align.d.ts +5 -0
  422. package/dist/components/Form/Select/select.align.js +19 -5
  423. package/dist/components/Form/Select/select.attributes.d.ts +36 -0
  424. package/dist/components/Form/Select/select.attributes.js +27 -0
  425. package/dist/components/Form/Select/select.mcp.d.ts +1 -1
  426. package/dist/components/Form/Select/select.mcp.js +103 -18
  427. package/dist/components/Form/Select/select.props.d.ts +87 -10
  428. package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
  429. package/dist/components/Form/Select/select.state.svelte.js +354 -59
  430. package/dist/components/Form/Select/select.theme.d.ts +21 -0
  431. package/dist/components/Form/Select/select.theme.js +22 -0
  432. package/dist/components/Form/Slider/Slider.svelte +54 -14
  433. package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
  434. package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
  435. package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
  436. package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
  437. package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
  438. package/dist/components/Form/Slider/index.d.ts +1 -1
  439. package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
  440. package/dist/components/Form/Slider/slider.mcp.js +55 -11
  441. package/dist/components/Form/Slider/slider.props.d.ts +35 -2
  442. package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
  443. package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
  444. package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
  445. package/dist/components/Form/Slider/slider.theme.js +35 -17
  446. package/dist/components/Form/Switch/Switch.svelte +61 -38
  447. package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
  448. package/dist/components/Form/Switch/switch.mcp.js +25 -5
  449. package/dist/components/Form/Switch/switch.props.d.ts +14 -1
  450. package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
  451. package/dist/components/Form/Switch/switch.theme.js +8 -3
  452. package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
  453. package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
  454. package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
  455. package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
  456. package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
  457. package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
  458. package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
  459. package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
  460. package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
  461. package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
  462. package/dist/components/Form/TextArea/TextArea.svelte +8 -0
  463. package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
  464. package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
  465. package/dist/components/Form/TextInput/TextInput.svelte +8 -1
  466. package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
  467. package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
  468. package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
  469. package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
  470. package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
  471. package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
  472. package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
  473. package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
  474. package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
  475. package/dist/components/HoverCard/HoverCard.svelte +100 -10
  476. package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
  477. package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
  478. package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
  479. package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
  480. package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
  481. package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
  482. package/dist/components/HoverCard/hoverCard.theme.js +9 -2
  483. package/dist/components/HoverCard/index.d.ts +1 -0
  484. package/dist/components/HoverCard/index.js +1 -0
  485. package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
  486. package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
  487. package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
  488. package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
  489. package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
  490. package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
  491. package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
  492. package/dist/components/Kanban/kanban.theme.js +7 -3
  493. package/dist/components/Layout/layoutSpacing.d.ts +2 -2
  494. package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
  495. package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
  496. package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
  497. package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
  498. package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
  499. package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
  500. package/dist/components/Map/maplibre-cdn.js +3 -2
  501. package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
  502. package/dist/components/Markdown/markdown.mcp.js +2 -1
  503. package/dist/components/Markdown/markdown.theme.js +18 -9
  504. package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
  505. package/dist/components/Menu/Menu.svelte +3 -3
  506. package/dist/components/Menu/Menu.svelte.d.ts +1 -1
  507. package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
  508. package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
  509. package/dist/components/Menu/MenuFloating.svelte +421 -74
  510. package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
  511. package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
  512. package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
  513. package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
  514. package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
  515. package/dist/components/Menu/MenuSearchField.svelte +54 -0
  516. package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
  517. package/dist/components/Menu/MenuStacked.svelte +404 -158
  518. package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
  519. package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
  520. package/dist/components/Menu/index.d.ts +2 -1
  521. package/dist/components/Menu/index.js +1 -0
  522. package/dist/components/Menu/menu.attributes.d.ts +37 -0
  523. package/dist/components/Menu/menu.attributes.js +28 -0
  524. package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
  525. package/dist/components/Menu/menu.filter.svelte.js +143 -0
  526. package/dist/components/Menu/menu.mcp.d.ts +1 -1
  527. package/dist/components/Menu/menu.mcp.js +227 -17
  528. package/dist/components/Menu/menu.platform.d.ts +5 -0
  529. package/dist/components/Menu/menu.platform.js +11 -0
  530. package/dist/components/Menu/menu.props.d.ts +172 -9
  531. package/dist/components/Menu/menu.theme.d.ts +147 -0
  532. package/dist/components/Menu/menu.theme.js +101 -0
  533. package/dist/components/Menu/menuTree.d.ts +35 -1
  534. package/dist/components/Menu/menuTree.js +158 -1
  535. package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
  536. package/dist/components/MenuBar/menuBar.mcp.js +4 -2
  537. package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
  538. package/dist/components/MenuOption/MenuOption.svelte +5 -1
  539. package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
  540. package/dist/components/MenuOption/menuOption.mcp.js +8 -0
  541. package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
  542. package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
  543. package/dist/components/MenuOption/menuOption.theme.js +24 -4
  544. package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
  545. package/dist/components/Mermaid/mermaid.mcp.js +8 -8
  546. package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
  547. package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
  548. package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
  549. package/dist/components/Mermaid/mermaid.theme.js +26 -1
  550. package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
  551. package/dist/components/Meter/Meter.svelte +110 -24
  552. package/dist/components/Meter/Meter.svelte.d.ts +12 -12
  553. package/dist/components/Meter/meter.mcp.d.ts +1 -1
  554. package/dist/components/Meter/meter.mcp.js +23 -37
  555. package/dist/components/Meter/meter.props.d.ts +36 -44
  556. package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
  557. package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
  558. package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
  559. package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
  560. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
  561. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
  562. package/dist/components/NavigationMenu/index.d.ts +4 -0
  563. package/dist/components/NavigationMenu/index.js +3 -0
  564. package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
  565. package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
  566. package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
  567. package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
  568. package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
  569. package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
  570. package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
  571. package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
  572. package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
  573. package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
  574. package/dist/components/Overlay/Overlay.svelte +19 -30
  575. package/dist/components/Overlay/index.d.ts +1 -0
  576. package/dist/components/Overlay/index.js +1 -0
  577. package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
  578. package/dist/components/Overlay/overlay.attributes.js +14 -0
  579. package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
  580. package/dist/components/Overlay/overlay.mcp.js +21 -3
  581. package/dist/components/Overlay/overlay.props.d.ts +8 -4
  582. package/dist/components/Popover/Popover.svelte +163 -52
  583. package/dist/components/Popover/Popover.svelte.d.ts +23 -2
  584. package/dist/components/Popover/PopoverSession.svelte +12 -0
  585. package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
  586. package/dist/components/Popover/index.d.ts +10 -2
  587. package/dist/components/Popover/index.js +4 -1
  588. package/dist/components/Popover/popover.api.d.ts +83 -0
  589. package/dist/components/Popover/popover.api.js +1 -0
  590. package/dist/components/Popover/popover.attributes.d.ts +32 -0
  591. package/dist/components/Popover/popover.attributes.js +28 -0
  592. package/dist/components/Popover/popover.claims.d.ts +19 -0
  593. package/dist/components/Popover/popover.claims.js +45 -0
  594. package/dist/components/Popover/popover.mcp.d.ts +1 -1
  595. package/dist/components/Popover/popover.mcp.js +163 -31
  596. package/dist/components/Popover/popover.position.d.ts +226 -0
  597. package/dist/components/Popover/popover.position.js +402 -0
  598. package/dist/components/Popover/popover.props.d.ts +179 -24
  599. package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
  600. package/dist/components/Popover/popover.state.svelte.js +1034 -194
  601. package/dist/components/Popover/popover.theme.d.ts +15 -0
  602. package/dist/components/Popover/popover.theme.js +27 -2
  603. package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
  604. package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
  605. package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
  606. package/dist/components/PopupMenu/popupMenu.context.js +52 -0
  607. package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
  608. package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
  609. package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
  610. package/dist/components/Progress/Progress.svelte +160 -0
  611. package/dist/components/Progress/Progress.svelte.d.ts +4 -0
  612. package/dist/components/Progress/index.d.ts +3 -0
  613. package/dist/components/Progress/index.js +2 -0
  614. package/dist/components/Progress/progress.mcp.d.ts +1 -0
  615. package/dist/components/Progress/progress.mcp.js +101 -0
  616. package/dist/components/Progress/progress.props.d.ts +79 -0
  617. package/dist/components/Progress/progress.props.js +1 -0
  618. package/dist/components/Progress/progress.theme.d.ts +129 -0
  619. package/dist/components/Progress/progress.theme.js +83 -0
  620. package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
  621. package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
  622. package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
  623. package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
  624. package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
  625. package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
  626. package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
  627. package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
  628. package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
  629. package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
  630. package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
  631. package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
  632. package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
  633. package/dist/components/RichTextInput/suggestions.js +2 -0
  634. package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
  635. package/dist/components/ScrollArea/index.d.ts +2 -1
  636. package/dist/components/ScrollArea/index.js +1 -0
  637. package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
  638. package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
  639. package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
  640. package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
  641. package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
  642. package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
  643. package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
  644. package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
  645. package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
  646. package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
  647. package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
  648. package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
  649. package/dist/components/Sidebar/SidebarAction.svelte +13 -3
  650. package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
  651. package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
  652. package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
  653. package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
  654. package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
  655. package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
  656. package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
  657. package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
  658. package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
  659. package/dist/components/Sidebar/index.d.ts +1 -0
  660. package/dist/components/Sidebar/index.js +1 -0
  661. package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
  662. package/dist/components/Sidebar/sidebar-position.js +31 -2
  663. package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
  664. package/dist/components/Sidebar/sidebar.attributes.js +29 -0
  665. package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
  666. package/dist/components/Sidebar/sidebar.mcp.js +45 -10
  667. package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
  668. package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
  669. package/dist/components/Sidebar/sidebar.theme.js +113 -62
  670. package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
  671. package/dist/components/Stepper/Stepper.svelte +2 -0
  672. package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
  673. package/dist/components/Stepper/stepper.mcp.js +1 -0
  674. package/dist/components/Stepper/stepper.props.d.ts +5 -0
  675. package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
  676. package/dist/components/Stepper/stepper.state.svelte.js +31 -12
  677. package/dist/components/Tabbar/Tabbar.svelte +55 -16
  678. package/dist/components/Tabbar/index.d.ts +1 -1
  679. package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
  680. package/dist/components/Tabbar/tabbar.mcp.js +26 -9
  681. package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
  682. package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
  683. package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
  684. package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
  685. package/dist/components/Tabs/Tabs.svelte +73 -16
  686. package/dist/components/Tabs/index.d.ts +2 -1
  687. package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
  688. package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
  689. package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
  690. package/dist/components/Tabs/tabs.mcp.js +22 -4
  691. package/dist/components/Tabs/tabs.props.d.ts +39 -12
  692. package/dist/components/Tabs/tabs.theme.js +3 -1
  693. package/dist/components/Theme/Theme.svelte +44 -27
  694. package/dist/components/Theme/helper.d.ts +16 -2
  695. package/dist/components/Theme/helper.js +46 -4
  696. package/dist/components/Theme/theme.mcp.d.ts +1 -1
  697. package/dist/components/Theme/theme.mcp.js +103 -0
  698. package/dist/components/Theme/theme.props.d.ts +16 -0
  699. package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
  700. package/dist/components/Theme/theme.state.svelte.js +18 -1
  701. package/dist/components/Toast/Toast.svelte +184 -39
  702. package/dist/components/Toast/Toaster.svelte +14 -10
  703. package/dist/components/Toast/index.d.ts +1 -0
  704. package/dist/components/Toast/toast.mcp.d.ts +1 -1
  705. package/dist/components/Toast/toast.mcp.js +47 -6
  706. package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
  707. package/dist/components/Toast/toast.state.svelte.js +513 -68
  708. package/dist/components/Toast/toast.theme.js +1 -1
  709. package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
  710. package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
  711. package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
  712. package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
  713. package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
  714. package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
  715. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
  716. package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
  717. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
  718. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
  719. package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
  720. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
  721. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
  722. package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
  723. package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
  724. package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
  725. package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
  726. package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
  727. package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
  728. package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
  729. package/dist/components/Tooltip/Tooltip.svelte +4 -12
  730. package/dist/components/Tooltip/TooltipHost.svelte +136 -15
  731. package/dist/components/Tooltip/index.d.ts +1 -0
  732. package/dist/components/Tooltip/index.js +1 -0
  733. package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
  734. package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
  735. package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
  736. package/dist/components/Tooltip/tooltip.attributes.js +28 -0
  737. package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
  738. package/dist/components/Tooltip/tooltip.mcp.js +111 -10
  739. package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
  740. package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
  741. package/dist/components/Tooltip/tooltip.surface.js +42 -0
  742. package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
  743. package/dist/components/Utils/BeforeHydratation.svelte +14 -3
  744. package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
  745. package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
  746. package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
  747. package/dist/generated/componentAliases.d.ts +3 -0
  748. package/dist/generated/componentAliases.js +3 -0
  749. package/dist/generated/componentContract.d.ts +79 -34
  750. package/dist/generated/componentContract.js +231 -6
  751. package/dist/generated/componentMcpRegistry.js +6 -0
  752. package/dist/i18n/ar.js +107 -3
  753. package/dist/i18n/context.svelte.d.ts +6 -0
  754. package/dist/i18n/context.svelte.js +12 -0
  755. package/dist/i18n/de.js +101 -3
  756. package/dist/i18n/en.d.ts +91 -2
  757. package/dist/i18n/en.js +101 -3
  758. package/dist/i18n/es.js +101 -3
  759. package/dist/i18n/fr.js +101 -3
  760. package/dist/i18n/ja.js +101 -3
  761. package/dist/i18n/pt.js +101 -3
  762. package/dist/i18n/zh.js +101 -3
  763. package/dist/tailwind/geometry.js +7 -0
  764. package/dist/tailwind/global.js +31 -0
  765. package/dist/types/index.d.ts +1 -0
  766. package/dist/types/types.mcp.d.ts +1 -1
  767. package/dist/types/types.mcp.js +23 -0
  768. package/dist/utils/cspNonce.d.ts +16 -0
  769. package/dist/utils/cspNonce.js +39 -0
  770. package/dist/utils/cva/merge.d.ts +5 -1
  771. package/dist/utils/cva/merge.js +6 -4
  772. package/dist/utils/focus.d.ts +34 -0
  773. package/dist/utils/focus.js +93 -0
  774. package/dist/utils/focusHistory.d.ts +21 -0
  775. package/dist/utils/focusHistory.js +99 -0
  776. package/dist/utils/handlers.d.ts +7 -0
  777. package/dist/utils/handlers.js +14 -0
  778. package/dist/utils/hoverIntent.d.ts +42 -0
  779. package/dist/utils/hoverIntent.js +57 -0
  780. package/dist/utils/id.d.ts +7 -0
  781. package/dist/utils/id.js +15 -0
  782. package/dist/utils/layers.svelte.d.ts +32 -4
  783. package/dist/utils/layers.svelte.js +214 -21
  784. package/dist/utils/listFilter.d.ts +44 -0
  785. package/dist/utils/listFilter.js +130 -0
  786. package/dist/utils/match.d.ts +35 -0
  787. package/dist/utils/match.js +36 -0
  788. package/dist/utils/number.d.ts +126 -0
  789. package/dist/utils/number.js +401 -0
  790. package/dist/utils/openChange.d.ts +88 -0
  791. package/dist/utils/openChange.js +71 -0
  792. package/dist/utils/openLifecycle.svelte.d.ts +41 -0
  793. package/dist/utils/openLifecycle.svelte.js +134 -0
  794. package/dist/utils/pointerDrag.d.ts +10 -0
  795. package/dist/utils/pointerDrag.js +37 -2
  796. package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
  797. package/dist/utils/pragmaticDragAndDrop.js +8 -3
  798. package/dist/utils/range.d.ts +62 -0
  799. package/dist/utils/range.js +70 -0
  800. package/dist/utils/requestNativeSubmit.d.ts +17 -0
  801. package/dist/utils/requestNativeSubmit.js +47 -0
  802. package/dist/utils/safeArea.svelte.d.ts +10 -1
  803. package/dist/utils/safeArea.svelte.js +19 -11
  804. package/dist/utils/stateAttributes.d.ts +108 -0
  805. package/dist/utils/stateAttributes.js +78 -0
  806. package/dist/utils/swipeVelocity.d.ts +32 -0
  807. package/dist/utils/swipeVelocity.js +59 -0
  808. package/dist/utils/timer.svelte.d.ts +65 -2
  809. package/dist/utils/timer.svelte.js +159 -25
  810. package/dist/utils/trigger.d.ts +41 -0
  811. package/dist/utils/trigger.js +103 -0
  812. package/dist/utils/typeahead.d.ts +9 -0
  813. package/dist/utils/typeahead.js +21 -9
  814. package/dist/utils/useDndList.svelte.d.ts +1 -1
  815. package/dist/utils/useDndList.svelte.js +6 -23
  816. package/dist/utils/useFocusScope.svelte.d.ts +29 -0
  817. package/dist/utils/useFocusScope.svelte.js +189 -27
  818. package/dist/utils/useHoverAction.svelte.d.ts +44 -4
  819. package/dist/utils/useHoverAction.svelte.js +161 -51
  820. package/dist/utils/useKeyDown.svelte.d.ts +19 -2
  821. package/dist/utils/useKeyDown.svelte.js +19 -12
  822. package/dist/utils/useListNavigation.svelte.d.ts +94 -13
  823. package/dist/utils/useListNavigation.svelte.js +261 -35
  824. package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
  825. package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
  826. package/dist/utils/useNavigation.svelte.d.ts +36 -3
  827. package/dist/utils/useNavigation.svelte.js +699 -332
  828. package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
  829. package/dist/utils/usePressAndHold.svelte.js +191 -0
  830. package/dist/utils/useScrollLock.svelte.d.ts +20 -1
  831. package/dist/utils/useScrollLock.svelte.js +54 -13
  832. package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
  833. package/dist/utils/useSlidingIndicator.svelte.js +27 -5
  834. package/dist/utils/useTabBridge.svelte.d.ts +20 -0
  835. package/dist/utils/useTabBridge.svelte.js +109 -0
  836. package/dist/utils/values.d.ts +15 -0
  837. package/dist/utils/values.js +49 -0
  838. package/package.json +31 -2
  839. package/dist/generated/componentMcpRegistry.d.ts +0 -142
  840. package/dist/utils/useDrag.svelte.d.ts +0 -11
  841. package/dist/utils/useDrag.svelte.js +0 -55
@@ -1,4 +1,6 @@
1
1
  <script lang="ts" generics="TMessage extends AIThreadItem = AIThreadItem">
2
+ import { getContext } from 'svelte';
3
+ import type { Attachment } from 'svelte/attachments';
2
4
  import { useClipboard } from '../../utils/useClipboard.svelte.js';
3
5
  import Alert from '../Alert/Alert.svelte';
4
6
  import Button from '../Button/Button.svelte';
@@ -7,6 +9,7 @@
7
9
  import { copyIcon } from '../Icons/copy.js';
8
10
  import { pencilSimpleIcon } from '../Icons/pencilSimple.js';
9
11
  import Slot from '../Slot/Slot.svelte';
12
+ import { tooltip } from '../Tooltip/tooltip.attachment.svelte.js';
10
13
  import type { AIThreadItem } from '../AIThread/aiThread.props.js';
11
14
  import { getAIConversation } from '../AIConversation/aiConversation.state.svelte.js';
12
15
  import type { AIMessageActionState, AIMessageActionsProps } from './aiMessageActions.props.js';
@@ -84,6 +87,12 @@
84
87
  Boolean(customActions || actionState.canCopy || actionState.canEdit || actionState.canRetry)
85
88
  );
86
89
  const buttonSize = $derived(size === 'large' ? 'normal' : 'small');
90
+ // Icon-only buttons name themselves for assistive technology through `label`; the tooltip shows
91
+ // the same name to sighted pointer and keyboard users. Tooltips need a Theme (it hosts the
92
+ // shared surface), so outside one the buttons keep their accessible name only.
93
+ const hasTooltipHost = Boolean(getContext('entasisTheme'));
94
+ const withTooltip = (content: string): Attachment<HTMLElement> | undefined =>
95
+ hasTooltipHost ? tooltip({ content, position: 'bottom' }) : undefined;
87
96
 
88
97
  function resolveRoleLayout(
89
98
  value: AIThreadItem['role']
@@ -120,13 +129,11 @@
120
129
  errorMessage = undefined;
121
130
  try {
122
131
  const didCopy = await copyMessage();
123
- if (!didCopy) errorMessage = 'Unable to copy this message.';
132
+ if (!didCopy) errorMessage = t.aiMessageCopyFailed;
124
133
  } catch (error) {
125
134
  setActionError(
126
135
  error,
127
- clipboard.copied
128
- ? 'The message was copied, but the copy action failed.'
129
- : 'Unable to copy this message.'
136
+ clipboard.copied ? t.aiMessageCopyCallbackFailed : t.aiMessageCopyFailed
130
137
  );
131
138
  }
132
139
  }
@@ -136,7 +143,7 @@
136
143
  try {
137
144
  await editMessage();
138
145
  } catch (error) {
139
- setActionError(error, 'Unable to edit this message.');
146
+ setActionError(error, t.aiMessageEditFailed);
140
147
  }
141
148
  }
142
149
 
@@ -145,7 +152,7 @@
145
152
  try {
146
153
  await retryMessage();
147
154
  } catch (error) {
148
- setActionError(error, 'Unable to retry this message.');
155
+ setActionError(error, t.aiMessageRetryFailed);
149
156
  }
150
157
  }
151
158
 
@@ -170,6 +177,7 @@
170
177
  variant="ghost"
171
178
  label={actionState.copied ? t.copied : t.copy}
172
179
  onclick={() => void handleCopy()}
180
+ {@attach withTooltip(actionState.copied ? t.copied : t.copy)}
173
181
  class={classes.button({ size })}
174
182
  >{@render (actionState.copied ? checkIcon : copyIcon)({ size: 14 })}</Button
175
183
  >{/if}
@@ -180,6 +188,7 @@
180
188
  variant="ghost"
181
189
  label={t.aiMessageEdit}
182
190
  onclick={() => void handleEdit()}
191
+ {@attach withTooltip(t.aiMessageEdit)}
183
192
  class={classes.button({ size })}>{@render pencilSimpleIcon({ size: 14 })}</Button
184
193
  >{/if}
185
194
  {#if actionState.canRetry}<Button
@@ -189,11 +198,12 @@
189
198
  variant="ghost"
190
199
  label={t.aiMessageRetry}
191
200
  onclick={() => void handleRetry()}
201
+ {@attach withTooltip(t.aiMessageRetry)}
192
202
  class={classes.button({ size })}>{@render arrowsClockwiseIcon({ size: 14 })}</Button
193
203
  >{/if}
194
204
  {/if}
195
- {#if errorMessage}<div data-slot="ai-message-actions-error" class={classes.error()}>
196
- <Alert color="danger" variant="soft" description={errorMessage} />
197
- </div>{/if}
198
205
  </div>
206
+ {#if errorMessage}<div data-slot="ai-message-actions-error" class={classes.error()}>
207
+ <Alert {size} color="danger" variant="soft" description={errorMessage} />
208
+ </div>{/if}
199
209
  {/if}
@@ -1 +1 @@
1
- export declare const aiMessageActionsDescription = "\n# AIMessageActions\n\nCopy, edit, and retry actions for an AI message. Defaults integrate with the nearest AIConversation.\n\n## Resolution and availability\n\n`message` supplies role and content. Direct `role` and `content` win, while `messageIndex`\nwins over the `index` alias. `copyable`, `editable`, and `retryable` win over the\ncompatibility `copy`, `edit`, and `retry` aliases.\n\nCopy requires non-empty content. Edit additionally requires a user role and either `onEdit` or a\nconversation. Retry requires an assistant role and either `onRetry` or a conversation plus a\nmessage index. Direct callbacks take precedence. Otherwise edit writes the content into the\nconversation input and retry targets the indexed message. Pass `conversation={null}` to disable\nscoped conversation lookup.\n\n`visibility` accepts `always`, `hover`, or `none`. `actions={false}` suppresses the\ncomplete surface. A supplied `actions` slot wins over the equivalent `children` slot. Both\nreceive complete `AIMessageActionState`, including the resolved size, capability flags, and\nawaitable copy, edit, and retry methods. `size` accepts `small`, `normal`, or `large` and\nscales the default controls. The copy callback runs only after clipboard success. Failures raised by\nthe default buttons render through the semantic error region.\n\n```svelte\n<script>\n import { AIMessageActions } from './index.ts';\n</script>\n\n{#snippet actions({ copied, copy })}\n <button type=\"button\" onclick={() => void copy()}>\n {copied ? 'Copied' : 'Copy answer'}\n </button>\n{/snippet}\n\n<AIMessageActions content=\"Answer\" {actions} />\n```\n\nThe root forwards native div attributes and attachments when actions are available, plus bindable\n`ref`, `class`, and `theme`. Theme parts cover `root`, `button`, and `error`, with role,\nvisibility, and size variants on the root and size variants on the button.\n";
1
+ export declare const aiMessageActionsDescription = "\n# AIMessageActions\n\nCopy, edit, and retry actions for an AI message. Defaults integrate with the nearest AIConversation.\n\n## Resolution and availability\n\n`message` supplies role and content. Direct `role` and `content` win, while `messageIndex`\nwins over the `index` alias. `copyable`, `editable`, and `retryable` win over the\ncompatibility `copy`, `edit`, and `retry` aliases.\n\nCopy requires non-empty content. Edit additionally requires a user role and either `onEdit` or a\nconversation. Retry requires an assistant role and either `onRetry` or a conversation plus a\nmessage index. Direct callbacks take precedence. Otherwise edit writes the content into the\nconversation input and retry targets the indexed message. Pass `conversation={null}` to disable\nscoped conversation lookup.\n\n`visibility` accepts `always`, `hover`, or `none`. `hover` reveals the row when its message\n(`group/message`) or the row itself is hovered or focused, and always shows it on touch screens,\nwhich cannot hover. The row takes layout space in every mode but `none`, and its buttons are\npulled out by their own inset so the first icon lines up with the text edge (the end edge for\nuser rows). The row is as wide as its buttons and never wraps, so a one-word message keeps its\nicons on one line. Each icon button keeps its accessible name and, inside a `Theme`, shows it as a\ntooltip. `actions={false}` suppresses the\ncomplete surface. A supplied `actions` slot wins over the equivalent `children` slot. Both\nreceive complete `AIMessageActionState`, including the resolved size, capability flags, and\nawaitable copy, edit, and retry methods. `size` accepts `small`, `normal`, or `large` and\nscales the default controls. The copy callback runs only after clipboard success. Failures raised by\nthe default buttons render through the semantic error region, placed after the button row (not\ninside it) and visible whatever the row's visibility.\n\n```svelte\n<script>\n import { AIMessageActions } from './index.ts';\n</script>\n\n{#snippet actions({ copied, copy })}\n <button type=\"button\" onclick={() => void copy()}>\n {copied ? 'Copied' : 'Copy answer'}\n </button>\n{/snippet}\n\n<AIMessageActions content=\"Answer\" {actions} />\n```\n\nThe root forwards native div attributes and attachments when actions are available, plus bindable\n`ref`, `class`, and `theme`. `setAIMessageActionsTheme` and `<Theme components>` overrides\napply under the `ai-message-actions` key. Theme parts cover `root`, `button`, and `error`, with role,\nvisibility, and size variants on the root and size variants on the button.\n";
@@ -15,12 +15,19 @@ message index. Direct callbacks take precedence. Otherwise edit writes the conte
15
15
  conversation input and retry targets the indexed message. Pass \`conversation={null}\` to disable
16
16
  scoped conversation lookup.
17
17
 
18
- \`visibility\` accepts \`always\`, \`hover\`, or \`none\`. \`actions={false}\` suppresses the
18
+ \`visibility\` accepts \`always\`, \`hover\`, or \`none\`. \`hover\` reveals the row when its message
19
+ (\`group/message\`) or the row itself is hovered or focused, and always shows it on touch screens,
20
+ which cannot hover. The row takes layout space in every mode but \`none\`, and its buttons are
21
+ pulled out by their own inset so the first icon lines up with the text edge (the end edge for
22
+ user rows). The row is as wide as its buttons and never wraps, so a one-word message keeps its
23
+ icons on one line. Each icon button keeps its accessible name and, inside a \`Theme\`, shows it as a
24
+ tooltip. \`actions={false}\` suppresses the
19
25
  complete surface. A supplied \`actions\` slot wins over the equivalent \`children\` slot. Both
20
26
  receive complete \`AIMessageActionState\`, including the resolved size, capability flags, and
21
27
  awaitable copy, edit, and retry methods. \`size\` accepts \`small\`, \`normal\`, or \`large\` and
22
28
  scales the default controls. The copy callback runs only after clipboard success. Failures raised by
23
- the default buttons render through the semantic error region.
29
+ the default buttons render through the semantic error region, placed after the button row (not
30
+ inside it) and visible whatever the row's visibility.
24
31
 
25
32
  \`\`\`svelte
26
33
  <script>
@@ -37,6 +44,7 @@ the default buttons render through the semantic error region.
37
44
  \`\`\`
38
45
 
39
46
  The root forwards native div attributes and attachments when actions are available, plus bindable
40
- \`ref\`, \`class\`, and \`theme\`. Theme parts cover \`root\`, \`button\`, and \`error\`, with role,
47
+ \`ref\`, \`class\`, and \`theme\`. \`setAIMessageActionsTheme\` and \`<Theme components>\` overrides
48
+ apply under the \`ai-message-actions\` key. Theme parts cover \`root\`, \`button\`, and \`error\`, with role,
41
49
  visibility, and size variants on the root and size variants on the button.
42
50
  `;
@@ -1,24 +1,50 @@
1
1
  import { cva, setComponentTheme, useComponentTheme } from '../../utils/cva/index.js';
2
+ // The action row takes layout space (it is never positioned over the next row) and its ghost
3
+ // buttons are pulled out by their own inset, so the first icon lines up with the edge of the text
4
+ // or bubble above: the start edge for assistant rows, the end edge for user rows. The row is as wide
5
+ // as its buttons and never wraps, whatever the width of a short bubble above it.
2
6
  const defaultRoot = cva({
3
- base: 'flex min-h-[var(--control-height-sm)] w-full flex-wrap items-center gap-xs px-xs transition-opacity motion-reduce:transition-none',
7
+ base: 'flex min-h-[var(--control-height-sm)] w-max max-w-none shrink-0 flex-nowrap items-center gap-xs transition-opacity motion-reduce:transition-none',
4
8
  variants: {
5
9
  role: {
6
- user: 'justify-end',
10
+ user: 'ms-auto justify-end',
7
11
  assistant: 'justify-start',
8
- system: 'justify-center',
12
+ system: 'mx-auto justify-center',
9
13
  tool: 'justify-start'
10
14
  },
11
15
  visibility: {
12
- hover: 'opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 hover:opacity-100 focus-within:opacity-100',
16
+ // Revealed by hovering or focusing the row or its message; a touch screen cannot hover,
17
+ // so there the row always shows.
18
+ hover: 'opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 hover:opacity-100 focus-within:opacity-100 pointer-coarse:opacity-100',
13
19
  always: 'opacity-100',
14
20
  none: 'hidden'
15
21
  },
16
22
  size: {
17
- small: 'min-h-6 gap-micro px-micro',
18
- normal: 'min-h-[var(--control-height-sm)] gap-xs px-xs',
19
- large: 'min-h-[var(--control-height-md)] gap-sm px-xs'
23
+ small: 'min-h-6 gap-micro',
24
+ normal: 'min-h-[var(--control-height-sm)] gap-xs',
25
+ large: 'min-h-[var(--control-height-md)] gap-sm'
20
26
  }
21
27
  },
28
+ compoundVariants: [
29
+ {
30
+ role: ['assistant', 'tool'],
31
+ size: 'small',
32
+ class: '-ms-[calc((var(--spacing)*6-0.75rem)/2)]'
33
+ },
34
+ {
35
+ role: ['assistant', 'tool'],
36
+ size: 'normal',
37
+ class: '-ms-[calc((var(--control-height-sm)-0.875rem)/2)]'
38
+ },
39
+ {
40
+ role: ['assistant', 'tool'],
41
+ size: 'large',
42
+ class: '-ms-[calc((var(--control-height-md)-1.125rem)/2)]'
43
+ },
44
+ { role: 'user', size: 'small', class: '-me-[calc((var(--spacing)*6-0.75rem)/2)]' },
45
+ { role: 'user', size: 'normal', class: '-me-[calc((var(--control-height-sm)-0.875rem)/2)]' },
46
+ { role: 'user', size: 'large', class: '-me-[calc((var(--control-height-md)-1.125rem)/2)]' }
47
+ ],
22
48
  defaultVariants: { role: 'assistant', visibility: 'always', size: 'normal' }
23
49
  });
24
50
  const defaultButton = cva({
@@ -32,11 +58,12 @@ const defaultButton = cva({
32
58
  },
33
59
  defaultVariants: { size: 'normal' }
34
60
  });
35
- const defaultError = cva({ base: 'w-full basis-full pt-xs' });
61
+ // Rendered after the row, not inside it, so a message never widens or wraps the button row.
62
+ const defaultError = cva({ base: 'w-full min-w-0 pt-xs' });
36
63
  export const aiMessageActionsTheme = {
37
64
  root: defaultRoot,
38
65
  button: defaultButton,
39
66
  error: defaultError
40
67
  };
41
68
  export const setAIMessageActionsTheme = setComponentTheme('ai-message-actions');
42
- export const useAIMessageActionsTheme = useComponentTheme('aiMessageActions', aiMessageActionsTheme);
69
+ export const useAIMessageActionsTheme = useComponentTheme('ai-message-actions', aiMessageActionsTheme);
@@ -3,7 +3,7 @@
3
3
  import { checkIcon } from '../Icons/check.js';
4
4
  import Button from '../Button/Button.svelte';
5
5
  import type { MenuItem } from '../Menu/menu.props.js';
6
- import type { PopoverState } from '../Popover/popover.state.svelte.js';
6
+ import type { PopoverApi } from '../Popover/popover.api.js';
7
7
  import PopupMenu from '../PopupMenu/PopupMenu.svelte';
8
8
  import Slot from '../Slot/Slot.svelte';
9
9
  import TextInput from '../Form/TextInput/TextInput.svelte';
@@ -138,13 +138,18 @@
138
138
  if (tokens >= 1_000) return `${Math.round(tokens / 1_000)}K`;
139
139
  return `${tokens}`;
140
140
  }
141
- function modelItem(model: AIModelSelectorModel): MenuItem {
141
+ /**
142
+ * `showProvider` is off where a provider heading already names the provider (or every model
143
+ * shares one), so a row never repeats it as its description. The selected row keeps its
144
+ * context-window badge next to the check.
145
+ */
146
+ function modelItem(model: AIModelSelectorModel, showProvider = true): MenuItem {
142
147
  return {
143
148
  type: 'option',
144
149
  title: model.label,
145
- description: model.description ?? model.provider,
150
+ description: model.description ?? (showProvider ? model.provider : undefined),
146
151
  prefix: model.icon,
147
- suffix: selectedValue === model.id ? checkIcon : contextLabel(model.contextWindow),
152
+ suffix: selectedValue === model.id ? selectedSuffix : contextLabel(model.contextWindow),
148
153
  disabled: disabled || model.disabled,
149
154
  active: selectedValue === model.id,
150
155
  class: classes.option({ selected: selectedValue === model.id }),
@@ -157,7 +162,7 @@
157
162
  };
158
163
  }
159
164
  function groupItem(group: AIModelSelectorGroup): MenuItem {
160
- const modelItems = (group.models ?? []).map(modelItem);
165
+ const modelItems = (group.models ?? []).map((model) => modelItem(model));
161
166
  const groupItems = (group.groups ?? []).map(groupItem);
162
167
  const menu = [
163
168
  ...modelItems,
@@ -210,8 +215,8 @@
210
215
  const provider = model.provider ?? resolvedLabels.providerFallback;
211
216
  providers.set(provider, [...(providers.get(provider) ?? []), model]);
212
217
  }
213
- if (providers.size === 1 && providers.has(resolvedLabels.providerFallback))
214
- return source.map(modelItem);
218
+ // One provider needs no heading: it would only repeat what every row shares.
219
+ if (providers.size <= 1) return source.map((model) => modelItem(model, false));
215
220
  return [...providers.entries()].flatMap(([provider, providerModels], index) => [
216
221
  ...(index > 0 ? [{ type: 'separator' } satisfies MenuItem] : []),
217
222
  {
@@ -222,7 +227,7 @@
222
227
  fullWidth: true,
223
228
  class: classes.provider()
224
229
  } satisfies MenuItem,
225
- ...providerModels.map(modelItem)
230
+ ...providerModels.map((model) => modelItem(model, false))
226
231
  ]);
227
232
  }
228
233
  function resolveSupplementalItems(source: readonly AIModelSelectorMenuItem[]): MenuItem[] {
@@ -280,6 +285,14 @@
280
285
  ]);
281
286
  </script>
282
287
 
288
+ {#snippet selectedSuffix()}
289
+ {@const context = contextLabel(selectedModel?.contextWindow)}
290
+ <span data-slot="ai-model-selector-selected" class={classes.optionMeta()}>
291
+ {#if context}<span>{context}</span>{/if}
292
+ {@render checkIcon({ size: 14 })}
293
+ </span>
294
+ {/snippet}
295
+
283
296
  {#snippet emptyContent()}
284
297
  <span data-slot="ai-model-selector-empty">
285
298
  <Slot render={empty ?? resolvedLabels.empty} payload={selectorState} />
@@ -294,12 +307,13 @@
294
307
  placeholder={resolvedLabels.searchPlaceholder}
295
308
  label={resolvedLabels.searchPlaceholder}
296
309
  theme={{ label: { base: 'sr-only' } }}
310
+ inputAttrs={{ 'data-1p-ignore': true }}
297
311
  onValueChange={(nextValue: string | null) => setQuery(nextValue ?? '')}
298
312
  />{/if}
299
313
  </div>
300
314
  {/snippet}
301
315
 
302
- {#snippet selectorTrigger(popover: PopoverState)}
316
+ {#snippet selectorTrigger(popover: PopoverApi)}
303
317
  {#if children}
304
318
  <button
305
319
  type="button"
@@ -318,7 +332,8 @@
318
332
  <Button
319
333
  type="button"
320
334
  data-slot="ai-model-selector-trigger"
321
- variant="soft"
335
+ variant="ghost"
336
+ color="neutral"
322
337
  size="small"
323
338
  {disabled}
324
339
  haspopup="menu"
@@ -1 +1 @@
1
- export declare const aiModelSelectorDescription = "\n# AIModelSelector\n\nModel selection built on Entasis `PopupMenu` and `Menu`. It accepts flat `models`, recursive `groups`, disabled entries, provider labels, optional keyword search, context-window metadata, and supplemental standard Menu items.\n\nBind `value`, `open`, and `query` for direct control. `defaultValue` and `defaultOpen` apply once when their live props are omitted; `onValueChange` receives `{ value, model }`, and `onOpenChange` reports component-owned disclosure changes. Set `searchable={false}` to remove the search header and ignore, without erasing, a bound query. When `value` is omitted or undefined inside `AIConversation`, selection reads and updates `conversation.selectedModel`. A direct string or `null` wins over provider state; `null` is the bindable controlled-empty value because Svelte substitutes prop fallbacks for `undefined`. `placeholder` follows the same omission rule before the compact `labels` object and conversation placeholder, with `null` suppressing visible placeholder text.\n\nThe `children` trigger, `search` header, and `empty` snippets receive `{ model, value, open, query, searchable, disabled, labels, select, setQuery, setOpen, toggle }`. The resolved `labels` cover the empty trigger, its accessible fallback name, search field, empty result, and providerless-group heading. The trigger remains owned by PopupMenu, so keyboard navigation and focus return continue to work with custom content. Theme slots cover the root, trigger, trigger content/icon/label, popover, search header, menu, provider headings, model options, nested groups, and empty state.\n\nSearch is case-insensitive across model id, label, provider, description, and `keywords`. A matching group label preserves that group; otherwise recursive groups retain only matching descendants. `menuItems` uses the public `MenuItem` union and is appended after the models, so recursive checked submenus can own reasoning effort, speed, verbosity, or provider-specific controls. Models without a provider use the configurable `providerFallback` heading, while option descriptions fall back to the provider name. Disabled selectors recursively disable supplemental menu items as well as groups and models.\n\n```svelte\n<AIModelSelector\n\t models={[{ id: 'fast', label: 'Fast', provider: 'Acme', contextWindow: 128000 }]}\n\t groups={[{ label: 'Research', models: researchModels }]}\n\t searchable={false}\n\t menuItems={[{ type: 'submenu', title: 'Reasoning effort', menu: reasoningItems }]}\n\t bind:value\n onValueChange={({ value, model }) => selectModel(value, model)}\n/>\n```\n";
1
+ export declare const aiModelSelectorDescription = "\n# AIModelSelector\n\nModel selection built on Entasis `PopupMenu` and `Menu`. It accepts flat `models`, recursive `groups`, disabled entries, provider labels, optional keyword search, context-window metadata, and supplemental standard Menu items.\n\nBind `value`, `open`, and `query` for direct control. `defaultValue` and `defaultOpen` apply once when their live props are omitted; `onValueChange` receives `{ value, model }`, and `onOpenChange` reports component-owned disclosure changes. Set `searchable={false}` to remove the search header and ignore, without erasing, a bound query. When `value` is omitted or undefined inside `AIConversation`, selection reads and updates `conversation.selectedModel`. A direct string or `null` wins over provider state; `null` is the bindable controlled-empty value because Svelte substitutes prop fallbacks for `undefined`. `placeholder` follows the same omission rule before the compact `labels` object and conversation placeholder, with `null` suppressing visible placeholder text.\n\nThe `children` trigger, `search` header, and `empty` snippets receive `{ model, value, open, query, searchable, disabled, labels, select, setQuery, setOpen, toggle }`. The resolved `labels` cover the empty trigger, its accessible fallback name, search field, empty result, and providerless-group heading. The trigger remains owned by PopupMenu, so keyboard navigation and focus return continue to work with custom content. Theme slots cover the root, trigger, trigger content/icon/label, popover, search header, menu, provider headings, model options, nested groups, and empty state.\n\nSearch is case-insensitive across model id, label, provider, description, and `keywords`. A matching group label preserves that group; otherwise recursive groups retain only matching descendants. `menuItems` uses the public `MenuItem` union and is appended after the models, so recursive checked submenus can own reasoning effort, speed, verbosity, or provider-specific controls. Models without a provider use the configurable `providerFallback` heading. When every flat model shares one provider no heading is shown, and a row never repeats a provider that a heading already names; only rows inside `groups` fall back to the provider as their description. The selected row keeps its context-window badge next to the check mark. The default trigger is a ghost text button sized to its label that can shrink and truncate in a crowded footer; the `optionMeta` theme slot styles the selected row's badge and check. Disabled selectors recursively disable supplemental menu items as well as groups and models.\n\n```svelte\n<AIModelSelector\n\t models={[{ id: 'fast', label: 'Fast', provider: 'Acme', contextWindow: 128000 }]}\n\t groups={[{ label: 'Research', models: researchModels }]}\n\t searchable={false}\n\t menuItems={[{ type: 'submenu', title: 'Reasoning effort', menu: reasoningItems }]}\n\t bind:value\n onValueChange={({ value, model }) => selectModel(value, model)}\n/>\n```\n";
@@ -7,7 +7,7 @@ Bind \`value\`, \`open\`, and \`query\` for direct control. \`defaultValue\` and
7
7
 
8
8
  The \`children\` trigger, \`search\` header, and \`empty\` snippets receive \`{ model, value, open, query, searchable, disabled, labels, select, setQuery, setOpen, toggle }\`. The resolved \`labels\` cover the empty trigger, its accessible fallback name, search field, empty result, and providerless-group heading. The trigger remains owned by PopupMenu, so keyboard navigation and focus return continue to work with custom content. Theme slots cover the root, trigger, trigger content/icon/label, popover, search header, menu, provider headings, model options, nested groups, and empty state.
9
9
 
10
- Search is case-insensitive across model id, label, provider, description, and \`keywords\`. A matching group label preserves that group; otherwise recursive groups retain only matching descendants. \`menuItems\` uses the public \`MenuItem\` union and is appended after the models, so recursive checked submenus can own reasoning effort, speed, verbosity, or provider-specific controls. Models without a provider use the configurable \`providerFallback\` heading, while option descriptions fall back to the provider name. Disabled selectors recursively disable supplemental menu items as well as groups and models.
10
+ Search is case-insensitive across model id, label, provider, description, and \`keywords\`. A matching group label preserves that group; otherwise recursive groups retain only matching descendants. \`menuItems\` uses the public \`MenuItem\` union and is appended after the models, so recursive checked submenus can own reasoning effort, speed, verbosity, or provider-specific controls. Models without a provider use the configurable \`providerFallback\` heading. When every flat model shares one provider no heading is shown, and a row never repeats a provider that a heading already names; only rows inside \`groups\` fall back to the provider as their description. The selected row keeps its context-window badge next to the check mark. The default trigger is a ghost text button sized to its label that can shrink and truncate in a crowded footer; the \`optionMeta\` theme slot styles the selected row's badge and check. Disabled selectors recursively disable supplemental menu items as well as groups and models.
11
11
 
12
12
  \`\`\`svelte
13
13
  <AIModelSelector
@@ -20,6 +20,7 @@ export declare const aiModelSelectorTheme: {
20
20
  false: string;
21
21
  };
22
22
  }> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
23
+ optionMeta: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
23
24
  group: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
24
25
  empty: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
25
26
  };
@@ -46,6 +47,7 @@ export declare const setAIModelSelectorTheme: (theme: InferComponentTheme<{
46
47
  false: string;
47
48
  };
48
49
  }> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
50
+ optionMeta: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
49
51
  group: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
50
52
  empty: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
51
53
  }>) => void;
@@ -70,6 +72,7 @@ export declare const useAIModelSelectorTheme: import("../../utils/cva/theme.js")
70
72
  false: string;
71
73
  };
72
74
  }> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
75
+ optionMeta: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
73
76
  group: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
74
77
  empty: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
75
78
  }>;
@@ -1,7 +1,9 @@
1
1
  import { cva, setComponentTheme, useComponentTheme } from '../../utils/cva/index.js';
2
2
  const defaultRoot = cva({ base: 'inline-flex min-w-0' });
3
- const defaultTrigger = cva({ base: 'min-w-44 justify-between gap-md' });
4
- const defaultTriggerContent = cva({ base: 'flex min-w-0 items-center gap-md' });
3
+ // A ghost text button sized to its label, like the model picker beside send in Claude and
4
+ // ChatGPT. It may shrink inside a crowded composer footer; the label truncates first.
5
+ const defaultTrigger = cva({ base: 'min-w-0 max-w-full shrink justify-between gap-xs' });
6
+ const defaultTriggerContent = cva({ base: 'flex min-w-0 items-center gap-sm' });
5
7
  const defaultTriggerIcon = cva({
6
8
  base: 'flex size-5 shrink-0 items-center justify-center rounded-sm border border-neutral-muted bg-surface text-xs'
7
9
  });
@@ -19,6 +21,7 @@ const defaultOption = cva({
19
21
  variants: { selected: { true: '', false: '' } },
20
22
  defaultVariants: { selected: false }
21
23
  });
24
+ const defaultOptionMeta = cva({ base: 'inline-flex items-center gap-sm' });
22
25
  const defaultGroup = cva({ base: '' });
23
26
  const defaultEmpty = cva({ base: 'justify-start text-neutral/70' });
24
27
  export const aiModelSelectorTheme = {
@@ -32,8 +35,9 @@ export const aiModelSelectorTheme = {
32
35
  menu: defaultMenu,
33
36
  provider: defaultProvider,
34
37
  option: defaultOption,
38
+ optionMeta: defaultOptionMeta,
35
39
  group: defaultGroup,
36
40
  empty: defaultEmpty
37
41
  };
38
42
  export const setAIModelSelectorTheme = setComponentTheme('ai-model-selector');
39
- export const useAIModelSelectorTheme = useComponentTheme('aiModelSelector', aiModelSelectorTheme);
43
+ export const useAIModelSelectorTheme = useComponentTheme('ai-model-selector', aiModelSelectorTheme);
@@ -4,8 +4,9 @@
4
4
  import { brainIcon } from '../Icons/brain.js';
5
5
  import Markdown from '../Markdown/Markdown.svelte';
6
6
  import Slot from '../Slot/Slot.svelte';
7
- import SpinnerText from '../SpinnerText/SpinnerText.svelte';
7
+ import { formatAIElapsed } from '../AITool/toolRendering.js';
8
8
  import { untrack } from 'svelte';
9
+ import type { Attachment } from 'svelte/attachments';
9
10
  import type { CollapsibleThemeProps } from '../Collapsible/collapsible.theme.js';
10
11
  import type {
11
12
  AIReasoningLabels,
@@ -18,9 +19,11 @@
18
19
  const AUTO_CLOSE_DELAY = 1000;
19
20
  const MS_IN_S = 1000;
20
21
  const MESSAGE_INTERVAL = 2000;
22
+ const ELAPSED_TICK = 1000;
21
23
 
22
24
  let {
23
25
  ref = $bindable(),
26
+ size = 'normal',
24
27
  content,
25
28
  streaming = false,
26
29
  defaultOpen,
@@ -48,22 +51,30 @@
48
51
  const autoOpen = untrack(() => defaultOpen !== false);
49
52
  let computedDuration = $state<number | undefined>(undefined);
50
53
  let messageIndex = $state(0);
54
+ let streamStartedAt = $state<number | null>(null);
55
+ let now = $state(0);
56
+ let overflowing = $state(false);
51
57
  const duration = $derived(durationProp ?? computedDuration);
52
58
  const resolvedLabels = $derived<AIReasoningLabels>({
53
59
  thinking: labels?.thinking ?? t.aiReasoningThinking,
54
60
  thoughtForFewSeconds: labels?.thoughtForFewSeconds ?? t.aiReasoningFewSeconds,
55
- duration: labels?.duration ?? t.aiReasoningDuration
61
+ duration: labels?.duration ?? formatDuration
56
62
  });
63
+ const messages = $derived(
64
+ thinkingMessages?.length ? [...new Set(thinkingMessages)] : [resolvedLabels.thinking]
65
+ );
57
66
  const thinkingMessage = $derived(
58
- thinkingMessages?.length
59
- ? (thinkingMessages[messageIndex % thinkingMessages.length] ?? resolvedLabels.thinking)
60
- : resolvedLabels.thinking
67
+ messages[messageIndex % messages.length] ?? resolvedLabels.thinking
68
+ );
69
+ // Elapsed seconds while streaming, shown once the first second has passed.
70
+ const elapsed = $derived(
71
+ streaming && streamStartedAt !== null ? Math.max(0, now - streamStartedAt) : undefined
61
72
  );
62
- const displayedThinkingMessages = $derived([thinkingMessage]);
63
73
  const reasoningState = $derived<AIReasoningState>({
64
74
  open: openState.value,
65
75
  streaming,
66
76
  duration,
77
+ elapsed: elapsed === undefined ? undefined : Math.floor(elapsed / MS_IN_S),
67
78
  message: thinkingMessage,
68
79
  labels: resolvedLabels
69
80
  });
@@ -80,7 +91,12 @@
80
91
 
81
92
  let hasAutoClosed = false;
82
93
  let didAutoOpen = false;
83
- let startedAt: number | null = null;
94
+
95
+ function formatDuration(seconds: number): string {
96
+ if (seconds <= 0) return t.aiReasoningUnderSecond;
97
+ if (seconds < 60) return t.aiReasoningDuration(seconds);
98
+ return t.aiReasoningDurationLong(formatAIElapsed(seconds * MS_IN_S, t));
99
+ }
84
100
 
85
101
  function setOpen(nextOpen: boolean) {
86
102
  if (openState.value === nextOpen) return;
@@ -91,31 +107,56 @@
91
107
  $effect(() => {
92
108
  if (!streaming) return;
93
109
  messageIndex = 0;
94
- const messages = thinkingMessages;
95
- if (!messages || messages.length <= 1) return;
110
+ const count = messages.length;
111
+ if (count <= 1) return;
96
112
  const interval = setInterval(() => {
97
- messageIndex = (messageIndex + 1) % messages.length;
113
+ messageIndex = (messageIndex + 1) % count;
98
114
  }, MESSAGE_INTERVAL);
99
115
  return () => clearInterval(interval);
100
116
  });
101
117
 
102
118
  $effect(() => {
103
119
  if (streaming) {
104
- if (startedAt === null) {
105
- startedAt = Date.now();
106
- hasAutoClosed = false;
107
- }
108
- if (!didAutoOpen && autoOpen) {
109
- setOpen(true);
110
- didAutoOpen = true;
111
- }
112
- } else if (startedAt !== null) {
113
- computedDuration = Math.ceil((Date.now() - startedAt) / MS_IN_S);
114
- startedAt = null;
115
- didAutoOpen = false;
120
+ untrack(() => {
121
+ if (streamStartedAt === null) {
122
+ streamStartedAt = Date.now();
123
+ now = streamStartedAt;
124
+ hasAutoClosed = false;
125
+ }
126
+ if (!didAutoOpen && autoOpen) {
127
+ setOpen(true);
128
+ didAutoOpen = true;
129
+ }
130
+ });
131
+ } else {
132
+ untrack(() => {
133
+ if (streamStartedAt === null) return;
134
+ // Rounded, so a sub-half-second thought reads "less than a second" rather than 1.
135
+ computedDuration = Math.round((Date.now() - streamStartedAt) / MS_IN_S);
136
+ streamStartedAt = null;
137
+ didAutoOpen = false;
138
+ });
116
139
  }
117
140
  });
118
141
 
142
+ /** The widest elapsed reading in the same unit as `milliseconds` (59s, 59m 59s, 99h 59m). */
143
+ function widestElapsed(milliseconds: number): number {
144
+ const seconds = Math.floor(milliseconds / MS_IN_S);
145
+ if (seconds < 60) return 59 * MS_IN_S;
146
+ if (seconds < 3600) return 3599 * MS_IN_S;
147
+ const hourDigits = String(Math.floor(seconds / 3600)).length;
148
+ return (Number('9'.repeat(hourDigits)) * 3600 + 59 * 60) * MS_IN_S;
149
+ }
150
+
151
+ // Live elapsed time: one tick per second, only while streaming.
152
+ $effect(() => {
153
+ if (!streaming) return;
154
+ const timer = setInterval(() => {
155
+ now = Date.now();
156
+ }, ELAPSED_TICK);
157
+ return () => clearInterval(timer);
158
+ });
159
+
119
160
  $effect(() => {
120
161
  if (computedDuration === undefined || streaming || !openState.value || hasAutoClosed) return;
121
162
  const closeTimer = setTimeout(
@@ -127,30 +168,79 @@
127
168
  );
128
169
  return () => clearTimeout(closeTimer);
129
170
  });
171
+
172
+ // While streaming, the body is a bounded window pinned to its latest lines; the top fades only
173
+ // once earlier lines have actually scrolled out of it.
174
+ const followLatest: Attachment<HTMLElement> = (node) => {
175
+ const body = node.firstElementChild;
176
+ if (!(body instanceof HTMLElement) || typeof ResizeObserver === 'undefined') return;
177
+ const measure = () => {
178
+ overflowing = body.offsetHeight > node.clientHeight + 1;
179
+ };
180
+ const observer = new ResizeObserver(measure);
181
+ observer.observe(node);
182
+ observer.observe(body);
183
+ measure();
184
+ return () => {
185
+ observer.disconnect();
186
+ overflowing = false;
187
+ };
188
+ };
130
189
  </script>
131
190
 
132
191
  {#snippet defaultTrigger()}
133
- {@render brainIcon({ size: 16, class: classes.icon() })}
134
- {#if streaming || duration === 0}
135
- <SpinnerText
136
- texts={displayedThinkingMessages}
137
- shimmer
138
- showSpinner={false}
139
- size="small"
140
- class={classes.status()}
141
- />
192
+ {@render brainIcon({ size: 16, class: classes.icon(), 'aria-hidden': 'true' })}
193
+ {#if streaming}
194
+ <!-- Every label sits in one grid cell, so the trigger keeps the widest label's width and the
195
+ chevron never shifts while messages cycle. Only the current one is visible and named. -->
196
+ <span data-slot="ai-reasoning-status" class={classes.status()}>
197
+ {#each messages as message, index (message)}
198
+ <span
199
+ class={classes.message({ current: index === messageIndex % messages.length })}
200
+ aria-hidden={index === messageIndex % messages.length ? undefined : 'true'}
201
+ >
202
+ {message}
203
+ </span>
204
+ {/each}
205
+ </span>
206
+ {#if elapsed !== undefined && elapsed >= MS_IN_S}
207
+ <!-- The widest reading of the current unit shares the cell, so the chevron holds still as
208
+ the count gains a digit (9s → 10s) and only steps once per unit change. -->
209
+ <span data-slot="ai-reasoning-elapsed" aria-hidden="true" class={classes.elapsed()}>
210
+ <span class={classes.elapsedReserve()}>· {formatAIElapsed(widestElapsed(elapsed), t)}</span>
211
+ <span>· {formatAIElapsed(elapsed, t)}</span>
212
+ </span>
213
+ {/if}
142
214
  {:else if duration === undefined}
143
- <span class={classes.duration()}>{resolvedLabels.thoughtForFewSeconds}</span>
215
+ <span data-slot="ai-reasoning-duration" class={classes.duration()}>
216
+ {resolvedLabels.thoughtForFewSeconds}
217
+ </span>
144
218
  {:else}
145
- <span class={classes.duration()}>{resolvedLabels.duration(duration)}</span>
219
+ <span data-slot="ai-reasoning-duration" class={classes.duration()}>
220
+ {resolvedLabels.duration(duration)}
221
+ </span>
222
+ {/if}
223
+ {/snippet}
224
+
225
+ {#snippet body()}
226
+ {#if content != null}
227
+ <Markdown
228
+ {content}
229
+ size={size === 'large' ? 'normal' : 'small'}
230
+ {...markdown}
231
+ renderHtml={false}
232
+ />
233
+ {:else if childrenSlot}
234
+ <Slot render={childrenSlot} payload={reasoningState} />
146
235
  {/if}
147
236
  {/snippet}
148
237
 
149
238
  <Collapsible
150
239
  bind:ref
151
240
  bind:open={openState.value}
152
- {onOpenChange}
241
+ onOpenChange={(nextOpen) => onOpenChange?.(nextOpen)}
153
242
  icon={triggerSlot === undefined ? undefined : 'none'}
243
+ {size}
154
244
  class={classes.root({ className })}
155
245
  theme={collapsibleTheme}
156
246
  {...rootAttributes}
@@ -158,9 +248,16 @@
158
248
  {#snippet trigger()}
159
249
  <Slot render={triggerSlot ?? defaultTrigger} payload={reasoningState} />
160
250
  {/snippet}
161
- {#if content != null}
162
- <Markdown {content} size="small" {...markdown} renderHtml={false} />
163
- {:else if childrenSlot}
164
- <Slot render={childrenSlot} payload={reasoningState} />
251
+ {#if streaming}
252
+ <div
253
+ data-slot="ai-reasoning-stream"
254
+ data-overflowing={overflowing || undefined}
255
+ class={classes.stream({ overflowing })}
256
+ {@attach followLatest}
257
+ >
258
+ <div class={classes.streamBody()}>{@render body()}</div>
259
+ </div>
260
+ {:else}
261
+ {@render body()}
165
262
  {/if}
166
263
  </Collapsible>