entasis 0.11.0 → 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 (839) 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 +256 -30
  326. package/dist/components/Form/Field/Field.svelte.d.ts +9 -0
  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 +64 -8
  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 +109 -3
  337. package/dist/components/Form/Field/field.state.svelte.js +508 -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 +47 -14
  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 +40 -2
  354. package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
  355. package/dist/components/Form/Form/form.d.ts +35 -6
  356. package/dist/components/Form/Form/form.mcp.d.ts +1 -1
  357. package/dist/components/Form/Form/form.mcp.js +113 -13
  358. package/dist/components/Form/Form/form.props.d.ts +32 -1
  359. package/dist/components/Form/Form/form.registry.d.ts +2 -2
  360. package/dist/components/Form/Form/form.registry.js +1 -4
  361. package/dist/components/Form/Form/form.state.svelte.d.ts +1138 -413
  362. package/dist/components/Form/Form/form.state.svelte.js +319 -26
  363. package/dist/components/Form/Form/index.d.ts +3 -1
  364. package/dist/components/Form/Form/visibility.d.ts +3096 -1831
  365. package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
  366. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
  367. package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
  368. package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
  369. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
  370. package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
  371. package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
  372. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1022 -408
  373. package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
  374. package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
  375. package/dist/components/Form/NumberInput/index.d.ts +1 -1
  376. package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
  377. package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
  378. package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
  379. package/dist/components/Form/PasswordInput/Password.svelte +28 -1
  380. package/dist/components/Form/PasswordInput/index.d.ts +1 -1
  381. package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
  382. package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
  383. package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
  384. package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
  385. package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
  386. package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
  387. package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
  388. package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
  389. package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
  390. package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
  391. package/dist/components/Form/PinInput/PinInput.svelte +44 -9
  392. package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
  393. package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
  394. package/dist/components/Form/PinInput/index.d.ts +1 -1
  395. package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
  396. package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
  397. package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
  398. package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
  399. package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
  400. package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
  401. package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
  402. package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
  403. package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
  404. package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
  405. package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
  406. package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
  407. package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
  408. package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
  409. package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
  410. package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
  411. package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
  412. package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
  413. package/dist/components/Form/Select/Select.svelte +186 -48
  414. package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
  415. package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
  416. package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
  417. package/dist/components/Form/Select/index.d.ts +2 -1
  418. package/dist/components/Form/Select/index.js +1 -0
  419. package/dist/components/Form/Select/select.align.d.ts +5 -0
  420. package/dist/components/Form/Select/select.align.js +19 -5
  421. package/dist/components/Form/Select/select.attributes.d.ts +36 -0
  422. package/dist/components/Form/Select/select.attributes.js +27 -0
  423. package/dist/components/Form/Select/select.mcp.d.ts +1 -1
  424. package/dist/components/Form/Select/select.mcp.js +103 -18
  425. package/dist/components/Form/Select/select.props.d.ts +87 -10
  426. package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
  427. package/dist/components/Form/Select/select.state.svelte.js +354 -59
  428. package/dist/components/Form/Select/select.theme.d.ts +21 -0
  429. package/dist/components/Form/Select/select.theme.js +22 -0
  430. package/dist/components/Form/Slider/Slider.svelte +54 -14
  431. package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
  432. package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
  433. package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
  434. package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
  435. package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
  436. package/dist/components/Form/Slider/index.d.ts +1 -1
  437. package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
  438. package/dist/components/Form/Slider/slider.mcp.js +55 -11
  439. package/dist/components/Form/Slider/slider.props.d.ts +35 -2
  440. package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
  441. package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
  442. package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
  443. package/dist/components/Form/Slider/slider.theme.js +35 -17
  444. package/dist/components/Form/Switch/Switch.svelte +61 -38
  445. package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
  446. package/dist/components/Form/Switch/switch.mcp.js +25 -5
  447. package/dist/components/Form/Switch/switch.props.d.ts +14 -1
  448. package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
  449. package/dist/components/Form/Switch/switch.theme.js +8 -3
  450. package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
  451. package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
  452. package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
  453. package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
  454. package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
  455. package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
  456. package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
  457. package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
  458. package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
  459. package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
  460. package/dist/components/Form/TextArea/TextArea.svelte +8 -0
  461. package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
  462. package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
  463. package/dist/components/Form/TextInput/TextInput.svelte +8 -1
  464. package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
  465. package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
  466. package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
  467. package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
  468. package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
  469. package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
  470. package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
  471. package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
  472. package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
  473. package/dist/components/HoverCard/HoverCard.svelte +100 -10
  474. package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
  475. package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
  476. package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
  477. package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
  478. package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
  479. package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
  480. package/dist/components/HoverCard/hoverCard.theme.js +9 -2
  481. package/dist/components/HoverCard/index.d.ts +1 -0
  482. package/dist/components/HoverCard/index.js +1 -0
  483. package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
  484. package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
  485. package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
  486. package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
  487. package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
  488. package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
  489. package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
  490. package/dist/components/Kanban/kanban.theme.js +7 -3
  491. package/dist/components/Layout/layoutSpacing.d.ts +2 -2
  492. package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
  493. package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
  494. package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
  495. package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
  496. package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
  497. package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
  498. package/dist/components/Map/maplibre-cdn.js +3 -2
  499. package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
  500. package/dist/components/Markdown/markdown.mcp.js +2 -1
  501. package/dist/components/Markdown/markdown.theme.js +18 -9
  502. package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
  503. package/dist/components/Menu/Menu.svelte +3 -3
  504. package/dist/components/Menu/Menu.svelte.d.ts +1 -1
  505. package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
  506. package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
  507. package/dist/components/Menu/MenuFloating.svelte +421 -74
  508. package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
  509. package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
  510. package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
  511. package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
  512. package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
  513. package/dist/components/Menu/MenuSearchField.svelte +54 -0
  514. package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
  515. package/dist/components/Menu/MenuStacked.svelte +404 -158
  516. package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
  517. package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
  518. package/dist/components/Menu/index.d.ts +2 -1
  519. package/dist/components/Menu/index.js +1 -0
  520. package/dist/components/Menu/menu.attributes.d.ts +37 -0
  521. package/dist/components/Menu/menu.attributes.js +28 -0
  522. package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
  523. package/dist/components/Menu/menu.filter.svelte.js +143 -0
  524. package/dist/components/Menu/menu.mcp.d.ts +1 -1
  525. package/dist/components/Menu/menu.mcp.js +227 -17
  526. package/dist/components/Menu/menu.platform.d.ts +5 -0
  527. package/dist/components/Menu/menu.platform.js +11 -0
  528. package/dist/components/Menu/menu.props.d.ts +172 -9
  529. package/dist/components/Menu/menu.theme.d.ts +147 -0
  530. package/dist/components/Menu/menu.theme.js +101 -0
  531. package/dist/components/Menu/menuTree.d.ts +35 -1
  532. package/dist/components/Menu/menuTree.js +158 -1
  533. package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
  534. package/dist/components/MenuBar/menuBar.mcp.js +4 -2
  535. package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
  536. package/dist/components/MenuOption/MenuOption.svelte +5 -1
  537. package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
  538. package/dist/components/MenuOption/menuOption.mcp.js +8 -0
  539. package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
  540. package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
  541. package/dist/components/MenuOption/menuOption.theme.js +24 -4
  542. package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
  543. package/dist/components/Mermaid/mermaid.mcp.js +8 -8
  544. package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
  545. package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
  546. package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
  547. package/dist/components/Mermaid/mermaid.theme.js +26 -1
  548. package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
  549. package/dist/components/Meter/Meter.svelte +110 -24
  550. package/dist/components/Meter/Meter.svelte.d.ts +12 -12
  551. package/dist/components/Meter/meter.mcp.d.ts +1 -1
  552. package/dist/components/Meter/meter.mcp.js +23 -37
  553. package/dist/components/Meter/meter.props.d.ts +36 -44
  554. package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
  555. package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
  556. package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
  557. package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
  558. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
  559. package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
  560. package/dist/components/NavigationMenu/index.d.ts +4 -0
  561. package/dist/components/NavigationMenu/index.js +3 -0
  562. package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
  563. package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
  564. package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
  565. package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
  566. package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
  567. package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
  568. package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
  569. package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
  570. package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
  571. package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
  572. package/dist/components/Overlay/Overlay.svelte +19 -30
  573. package/dist/components/Overlay/index.d.ts +1 -0
  574. package/dist/components/Overlay/index.js +1 -0
  575. package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
  576. package/dist/components/Overlay/overlay.attributes.js +14 -0
  577. package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
  578. package/dist/components/Overlay/overlay.mcp.js +21 -3
  579. package/dist/components/Overlay/overlay.props.d.ts +8 -4
  580. package/dist/components/Popover/Popover.svelte +163 -52
  581. package/dist/components/Popover/Popover.svelte.d.ts +23 -2
  582. package/dist/components/Popover/PopoverSession.svelte +12 -0
  583. package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
  584. package/dist/components/Popover/index.d.ts +10 -2
  585. package/dist/components/Popover/index.js +4 -1
  586. package/dist/components/Popover/popover.api.d.ts +83 -0
  587. package/dist/components/Popover/popover.api.js +1 -0
  588. package/dist/components/Popover/popover.attributes.d.ts +32 -0
  589. package/dist/components/Popover/popover.attributes.js +28 -0
  590. package/dist/components/Popover/popover.claims.d.ts +19 -0
  591. package/dist/components/Popover/popover.claims.js +45 -0
  592. package/dist/components/Popover/popover.mcp.d.ts +1 -1
  593. package/dist/components/Popover/popover.mcp.js +163 -31
  594. package/dist/components/Popover/popover.position.d.ts +226 -0
  595. package/dist/components/Popover/popover.position.js +402 -0
  596. package/dist/components/Popover/popover.props.d.ts +179 -24
  597. package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
  598. package/dist/components/Popover/popover.state.svelte.js +1034 -194
  599. package/dist/components/Popover/popover.theme.d.ts +15 -0
  600. package/dist/components/Popover/popover.theme.js +27 -2
  601. package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
  602. package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
  603. package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
  604. package/dist/components/PopupMenu/popupMenu.context.js +52 -0
  605. package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
  606. package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
  607. package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
  608. package/dist/components/Progress/Progress.svelte +160 -0
  609. package/dist/components/Progress/Progress.svelte.d.ts +4 -0
  610. package/dist/components/Progress/index.d.ts +3 -0
  611. package/dist/components/Progress/index.js +2 -0
  612. package/dist/components/Progress/progress.mcp.d.ts +1 -0
  613. package/dist/components/Progress/progress.mcp.js +101 -0
  614. package/dist/components/Progress/progress.props.d.ts +79 -0
  615. package/dist/components/Progress/progress.props.js +1 -0
  616. package/dist/components/Progress/progress.theme.d.ts +129 -0
  617. package/dist/components/Progress/progress.theme.js +83 -0
  618. package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
  619. package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
  620. package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
  621. package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
  622. package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
  623. package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
  624. package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
  625. package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
  626. package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
  627. package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
  628. package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
  629. package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
  630. package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
  631. package/dist/components/RichTextInput/suggestions.js +2 -0
  632. package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
  633. package/dist/components/ScrollArea/index.d.ts +2 -1
  634. package/dist/components/ScrollArea/index.js +1 -0
  635. package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
  636. package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
  637. package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
  638. package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
  639. package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
  640. package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
  641. package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
  642. package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
  643. package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
  644. package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
  645. package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
  646. package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
  647. package/dist/components/Sidebar/SidebarAction.svelte +13 -3
  648. package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
  649. package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
  650. package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
  651. package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
  652. package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
  653. package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
  654. package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
  655. package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
  656. package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
  657. package/dist/components/Sidebar/index.d.ts +1 -0
  658. package/dist/components/Sidebar/index.js +1 -0
  659. package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
  660. package/dist/components/Sidebar/sidebar-position.js +31 -2
  661. package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
  662. package/dist/components/Sidebar/sidebar.attributes.js +29 -0
  663. package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
  664. package/dist/components/Sidebar/sidebar.mcp.js +45 -10
  665. package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
  666. package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
  667. package/dist/components/Sidebar/sidebar.theme.js +113 -62
  668. package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
  669. package/dist/components/Stepper/Stepper.svelte +2 -0
  670. package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
  671. package/dist/components/Stepper/stepper.mcp.js +1 -0
  672. package/dist/components/Stepper/stepper.props.d.ts +5 -0
  673. package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
  674. package/dist/components/Stepper/stepper.state.svelte.js +31 -12
  675. package/dist/components/Tabbar/Tabbar.svelte +55 -16
  676. package/dist/components/Tabbar/index.d.ts +1 -1
  677. package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
  678. package/dist/components/Tabbar/tabbar.mcp.js +26 -9
  679. package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
  680. package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
  681. package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
  682. package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
  683. package/dist/components/Tabs/Tabs.svelte +73 -16
  684. package/dist/components/Tabs/index.d.ts +2 -1
  685. package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
  686. package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
  687. package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
  688. package/dist/components/Tabs/tabs.mcp.js +22 -4
  689. package/dist/components/Tabs/tabs.props.d.ts +39 -12
  690. package/dist/components/Tabs/tabs.theme.js +3 -1
  691. package/dist/components/Theme/Theme.svelte +44 -27
  692. package/dist/components/Theme/helper.d.ts +16 -2
  693. package/dist/components/Theme/helper.js +46 -4
  694. package/dist/components/Theme/theme.mcp.d.ts +1 -1
  695. package/dist/components/Theme/theme.mcp.js +103 -0
  696. package/dist/components/Theme/theme.props.d.ts +16 -0
  697. package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
  698. package/dist/components/Theme/theme.state.svelte.js +18 -1
  699. package/dist/components/Toast/Toast.svelte +184 -39
  700. package/dist/components/Toast/Toaster.svelte +14 -10
  701. package/dist/components/Toast/index.d.ts +1 -0
  702. package/dist/components/Toast/toast.mcp.d.ts +1 -1
  703. package/dist/components/Toast/toast.mcp.js +47 -6
  704. package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
  705. package/dist/components/Toast/toast.state.svelte.js +513 -68
  706. package/dist/components/Toast/toast.theme.js +1 -1
  707. package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
  708. package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
  709. package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
  710. package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
  711. package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
  712. package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
  713. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
  714. package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
  715. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
  716. package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
  717. package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
  718. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
  719. package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
  720. package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
  721. package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
  722. package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
  723. package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
  724. package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
  725. package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
  726. package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
  727. package/dist/components/Tooltip/Tooltip.svelte +4 -12
  728. package/dist/components/Tooltip/TooltipHost.svelte +136 -15
  729. package/dist/components/Tooltip/index.d.ts +1 -0
  730. package/dist/components/Tooltip/index.js +1 -0
  731. package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
  732. package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
  733. package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
  734. package/dist/components/Tooltip/tooltip.attributes.js +28 -0
  735. package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
  736. package/dist/components/Tooltip/tooltip.mcp.js +111 -10
  737. package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
  738. package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
  739. package/dist/components/Tooltip/tooltip.surface.js +42 -0
  740. package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
  741. package/dist/components/Utils/BeforeHydratation.svelte +14 -3
  742. package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
  743. package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
  744. package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
  745. package/dist/generated/componentAliases.d.ts +3 -0
  746. package/dist/generated/componentAliases.js +3 -0
  747. package/dist/generated/componentContract.d.ts +79 -34
  748. package/dist/generated/componentContract.js +225 -6
  749. package/dist/generated/componentMcpRegistry.js +6 -0
  750. package/dist/i18n/ar.js +107 -3
  751. package/dist/i18n/context.svelte.d.ts +6 -0
  752. package/dist/i18n/context.svelte.js +12 -0
  753. package/dist/i18n/de.js +101 -3
  754. package/dist/i18n/en.d.ts +91 -2
  755. package/dist/i18n/en.js +101 -3
  756. package/dist/i18n/es.js +101 -3
  757. package/dist/i18n/fr.js +101 -3
  758. package/dist/i18n/ja.js +101 -3
  759. package/dist/i18n/pt.js +101 -3
  760. package/dist/i18n/zh.js +101 -3
  761. package/dist/tailwind/geometry.js +7 -0
  762. package/dist/tailwind/global.js +31 -0
  763. package/dist/types/index.d.ts +1 -0
  764. package/dist/types/types.mcp.d.ts +1 -1
  765. package/dist/types/types.mcp.js +23 -0
  766. package/dist/utils/cspNonce.d.ts +16 -0
  767. package/dist/utils/cspNonce.js +39 -0
  768. package/dist/utils/cva/merge.d.ts +5 -1
  769. package/dist/utils/cva/merge.js +6 -4
  770. package/dist/utils/focus.d.ts +34 -0
  771. package/dist/utils/focus.js +93 -0
  772. package/dist/utils/focusHistory.d.ts +21 -0
  773. package/dist/utils/focusHistory.js +99 -0
  774. package/dist/utils/handlers.d.ts +7 -0
  775. package/dist/utils/handlers.js +14 -0
  776. package/dist/utils/hoverIntent.d.ts +42 -0
  777. package/dist/utils/hoverIntent.js +57 -0
  778. package/dist/utils/id.d.ts +7 -0
  779. package/dist/utils/id.js +15 -0
  780. package/dist/utils/layers.svelte.d.ts +32 -4
  781. package/dist/utils/layers.svelte.js +214 -21
  782. package/dist/utils/listFilter.d.ts +44 -0
  783. package/dist/utils/listFilter.js +130 -0
  784. package/dist/utils/match.d.ts +35 -0
  785. package/dist/utils/match.js +36 -0
  786. package/dist/utils/number.d.ts +126 -0
  787. package/dist/utils/number.js +401 -0
  788. package/dist/utils/openChange.d.ts +88 -0
  789. package/dist/utils/openChange.js +71 -0
  790. package/dist/utils/openLifecycle.svelte.d.ts +41 -0
  791. package/dist/utils/openLifecycle.svelte.js +134 -0
  792. package/dist/utils/pointerDrag.d.ts +10 -0
  793. package/dist/utils/pointerDrag.js +37 -2
  794. package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
  795. package/dist/utils/pragmaticDragAndDrop.js +8 -3
  796. package/dist/utils/range.d.ts +62 -0
  797. package/dist/utils/range.js +70 -0
  798. package/dist/utils/requestNativeSubmit.d.ts +17 -0
  799. package/dist/utils/requestNativeSubmit.js +47 -0
  800. package/dist/utils/safeArea.svelte.d.ts +10 -1
  801. package/dist/utils/safeArea.svelte.js +19 -11
  802. package/dist/utils/stateAttributes.d.ts +108 -0
  803. package/dist/utils/stateAttributes.js +78 -0
  804. package/dist/utils/swipeVelocity.d.ts +32 -0
  805. package/dist/utils/swipeVelocity.js +59 -0
  806. package/dist/utils/timer.svelte.d.ts +65 -2
  807. package/dist/utils/timer.svelte.js +159 -25
  808. package/dist/utils/trigger.d.ts +41 -0
  809. package/dist/utils/trigger.js +103 -0
  810. package/dist/utils/typeahead.d.ts +9 -0
  811. package/dist/utils/typeahead.js +21 -9
  812. package/dist/utils/useDndList.svelte.d.ts +1 -1
  813. package/dist/utils/useDndList.svelte.js +6 -23
  814. package/dist/utils/useFocusScope.svelte.d.ts +29 -0
  815. package/dist/utils/useFocusScope.svelte.js +189 -27
  816. package/dist/utils/useHoverAction.svelte.d.ts +44 -4
  817. package/dist/utils/useHoverAction.svelte.js +161 -51
  818. package/dist/utils/useKeyDown.svelte.d.ts +19 -2
  819. package/dist/utils/useKeyDown.svelte.js +19 -12
  820. package/dist/utils/useListNavigation.svelte.d.ts +94 -13
  821. package/dist/utils/useListNavigation.svelte.js +261 -35
  822. package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
  823. package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
  824. package/dist/utils/useNavigation.svelte.d.ts +36 -3
  825. package/dist/utils/useNavigation.svelte.js +699 -332
  826. package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
  827. package/dist/utils/usePressAndHold.svelte.js +191 -0
  828. package/dist/utils/useScrollLock.svelte.d.ts +20 -1
  829. package/dist/utils/useScrollLock.svelte.js +54 -13
  830. package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
  831. package/dist/utils/useSlidingIndicator.svelte.js +27 -5
  832. package/dist/utils/useTabBridge.svelte.d.ts +20 -0
  833. package/dist/utils/useTabBridge.svelte.js +109 -0
  834. package/dist/utils/values.d.ts +15 -0
  835. package/dist/utils/values.js +49 -0
  836. package/package.json +31 -2
  837. package/dist/generated/componentMcpRegistry.d.ts +0 -142
  838. package/dist/utils/useDrag.svelte.d.ts +0 -11
  839. package/dist/utils/useDrag.svelte.js +0 -55
@@ -1,11 +1,16 @@
1
1
  <script lang="ts" generics="TMessage extends AIThreadItem = AIThreadItem">
2
- import { createVirtualizer } from '@tanstack/svelte-virtual';
2
+ import { on } from 'svelte/events';
3
+ import {
4
+ createVirtualizer,
5
+ measureElement as measureVirtualElement
6
+ } from '@tanstack/svelte-virtual';
3
7
  import { onDestroy, tick, untrack } from 'svelte';
4
8
  import type { Attachment } from 'svelte/attachments';
5
9
  import { get } from 'svelte/store';
6
10
  import Alert from '../Alert/Alert.svelte';
7
11
  import Button from '../Button/Button.svelte';
8
12
  import type { AIMessageSize } from '../AIMessage/aiMessage.props.js';
13
+ import AISuggestions from '../AISuggestion/AISuggestions.svelte';
9
14
  import { arrowDownIcon } from '../Icons/arrowDown.js';
10
15
  import type {
11
16
  AIAskAnswers,
@@ -32,9 +37,6 @@
32
37
  import { AIThreadScrollController } from './threadScrollController.js';
33
38
  import { useI18n } from '../../i18n/context.svelte.js';
34
39
 
35
- type EndStateVirtualizer = {
36
- isAtEnd: (threshold?: number) => boolean;
37
- };
38
40
  const DENSITY_PADDING: Record<AIThreadDensity, number> = {
39
41
  compact: 8,
40
42
  normal: 16,
@@ -45,21 +47,11 @@
45
47
  normal: 96,
46
48
  comfortable: 120
47
49
  };
48
- const MESSAGE_ACTION_HEIGHT: Record<AIMessageSize, number> = {
49
- small: 24,
50
- normal: 28,
51
- large: 32
52
- };
53
- const MESSAGE_BOTTOM_PADDING: Record<AIMessageSize, number> = {
54
- small: 6,
55
- normal: 8,
56
- large: 10
57
- };
58
- const ITEM_BOTTOM_PADDING: Record<AIThreadDensity, number> = {
59
- compact: 2,
60
- normal: 8,
61
- comfortable: 14
62
- };
50
+ // The scroll-to-latest button shows as soon as the view is this far from the end.
51
+ const SCROLL_BUTTON_THRESHOLD = 8;
52
+ // Below this viewport width the table of contents and its gutter step aside (AIThreadToc's own
53
+ // narrow-container width), so a phone-width thread keeps its full width for messages.
54
+ const TOC_MIN_VIEWPORT_WIDTH = 480;
63
55
  function normalizeThreadScale(value: unknown): 'small' | 'normal' | 'large' {
64
56
  return value === 'small' || value === 'large' ? value : 'normal';
65
57
  }
@@ -75,7 +67,9 @@
75
67
  streaming,
76
68
  density = 'normal',
77
69
  messageSize = 'normal',
78
- messageVariant = 'bubble',
70
+ messageVariant = 'minimal',
71
+ messageColor,
72
+ contentWidth,
79
73
  followOutput = true,
80
74
  bottomThreshold = 80,
81
75
  estimateSize,
@@ -85,20 +79,25 @@
85
79
  paddingEnd,
86
80
  scrollBehavior = 'smooth',
87
81
  showScrollButton = true,
88
- scrollButtonPosition = 'right',
82
+ scrollButtonPosition = 'center',
89
83
  showToc = false,
90
84
  tocSide = 'left',
91
85
  tocMaxPins,
86
+ tocShowRange = false,
92
87
  tocTheme,
93
88
  activeAskUserQuestion,
94
89
  renderAskUserQuestion = true,
95
90
  askUserQuestionDisabled = false,
96
91
  suggestions,
92
+ showFollowUps = true,
97
93
  onSelect,
94
+ error: errorProp,
95
+ showError = true,
96
+ onErrorRetry,
98
97
  empty,
99
98
  message: messageSlot,
100
99
  messageActions,
101
- messageActionsVisibility,
100
+ messageActionsVisibility = 'latest',
102
101
  messageCopyable,
103
102
  messageEditable,
104
103
  messageRetryable,
@@ -133,21 +132,30 @@
133
132
  const conversation = getAIConversation<TMessage>();
134
133
  const generatedKeys = new WeakMap<object, string>();
135
134
  const questionPublisher = new AIThreadAskUserQuestionPublisher<TMessage>();
136
- const scrollController = new AIThreadScrollController(() => scrollBehavior);
135
+ const scrollController = new AIThreadScrollController();
137
136
  let generatedKeyId = 0;
138
137
  let viewport = $state<HTMLDivElement>();
139
138
  let viewportHeight = $state(0);
139
+ let viewportWidth = $state(0);
140
140
  let viewportScrollTop = $state(0);
141
141
  let isPinned = $state(true);
142
142
  let hasInitializedEnd = $state(false);
143
143
  let isInitializingEnd = $state(false);
144
144
  let isFollowingAppendedItem = $state(false);
145
+ // The thread follows new output only while the user is at the very end. Scrolling up stops it;
146
+ // scrolling back to the end resumes it. Nothing else moves the user's scroll position.
147
+ let lastScrollTop = 0;
148
+ // A pointer or a finger is down on the transcript: a scroll now is the reader dragging it (the
149
+ // scrollbar, a touch pan), not layout or the virtualizer moving the offset.
150
+ let isDragging = false;
151
+ let stickFrame: number | undefined;
152
+ // Set while the virtualizer handles its ResizeObserver delivery (see `measureItem`).
153
+ let isInResizeDelivery = false;
145
154
  let errorMessage = $state<string>();
146
155
  let questionStates = $state<Record<string, AIThreadAskUserQuestionState | undefined>>({});
147
156
  let questionValuesByKey = $state<Record<string, AIAskAnswers | undefined>>({});
148
157
  let previousRenderItemCount = 0;
149
158
  let previousFirstRenderItemKey: string | undefined;
150
- let shouldSmoothAppendedItem = false;
151
159
  let prependScrollTarget: 'start' | 'end' | undefined;
152
160
  let initialEndFrame: number | undefined;
153
161
  let initialEndSchedule = 0;
@@ -158,24 +166,23 @@
158
166
  );
159
167
  const resolvedPadding = $derived(Math.max(0, padding ?? DENSITY_PADDING[resolvedDensity]));
160
168
  const resolvedPaddingStart = $derived(Math.max(0, paddingStart ?? resolvedPadding));
161
- const messageActionOverflow = $derived(
162
- messageActions === false || messageActionsVisibility === 'none'
163
- ? 0
164
- : Math.max(
165
- 0,
166
- MESSAGE_ACTION_HEIGHT[resolvedMessageSize] -
167
- MESSAGE_BOTTOM_PADDING[resolvedMessageSize] -
168
- ITEM_BOTTOM_PADDING[resolvedDensity]
169
- )
170
- );
171
- const resolvedPaddingEnd = $derived(
172
- Math.max(0, paddingEnd ?? Math.max(resolvedPadding, messageActionOverflow))
173
- );
169
+ // Message actions take layout space inside their row, so the end padding no longer reserves
170
+ // room for an action bar hanging below the last message.
171
+ const resolvedPaddingEnd = $derived(Math.max(0, paddingEnd ?? resolvedPadding));
172
+ // The follow-up suggestions float over the bottom of the transcript (no band of their own), so
173
+ // the list ends that much lower: at the end, the last row still sits above the chips.
174
+ let followUpsHeight = $state(0);
174
175
 
175
176
  const resolvedMessages = $derived<readonly TMessage[]>(messages ?? conversation?.messages ?? []);
176
177
  const resolvedLiveText = $derived(liveText ?? conversation?.liveText);
177
178
  const resolvedStreaming = $derived(streaming ?? conversation?.streaming ?? false);
178
179
  const resolvedSuggestions = $derived(suggestions ?? conversation?.suggestions ?? []);
180
+ const resolvedError = $derived(errorProp !== undefined ? errorProp : conversation?.error);
181
+ const hasErrorRow = $derived(showError && resolvedError !== undefined);
182
+ const errorRetry = $derived(resolveErrorRetry());
183
+ const resolvedContentWidth = $derived(
184
+ typeof contentWidth === 'number' ? `${contentWidth}px` : contentWidth
185
+ );
179
186
  const messageKeys = $derived.by(() => createMessageKeys(resolvedMessages));
180
187
  const detectedQuestion = $derived<AIThreadAskUserQuestion<TMessage> | null>(
181
188
  findActiveAskUserQuestion(
@@ -198,22 +205,17 @@
198
205
  return deriveAIThreadRenderItems(resolvedMessages, {
199
206
  getMessageKey: (_message, index) => messageKeys[index] ?? `missing:${index}`,
200
207
  activeQuestion: resolvedQuestion,
201
- splitMessageParts: !messageSlot
208
+ splitMessageParts: !messageSlot,
209
+ questionStates,
210
+ questionValues: questionValuesByKey,
211
+ streaming: resolvedStreaming,
212
+ error: hasErrorRow
202
213
  });
203
214
  });
204
215
  const classes = $derived(useAIThreadTheme(theme));
205
216
  const isSettlingInitialEnd = $derived(
206
217
  renderItems.length > 0 && (!hasInitializedEnd || isInitializingEnd)
207
218
  );
208
- const shouldShowScrollButton = $derived(
209
- showScrollButton &&
210
- !isPinned &&
211
- !isFollowingAppendedItem &&
212
- !isSettlingInitialEnd &&
213
- !isViewportAtEnd() &&
214
- renderItems.length > 0
215
- );
216
-
217
219
  const virtualizerStore = createVirtualizer<HTMLDivElement, HTMLElement>(
218
220
  untrack(() => ({
219
221
  count: initialThreadCount(),
@@ -227,14 +229,52 @@
227
229
  scrollToFn: scrollController.scrollToFn,
228
230
  anchorTo: 'end',
229
231
  followOnAppend: followOnAppendBehavior(),
230
- scrollEndThreshold: Math.max(0, bottomThreshold),
232
+ scrollEndThreshold: endThreshold(),
231
233
  initialOffset: initialThreadOffset,
234
+ measureElement: measureThreadItem,
232
235
  onChange: handleVirtualizerChange
233
236
  }))
234
237
  );
235
238
 
236
239
  const virtualItems = $derived($virtualizerStore.getVirtualItems());
237
240
  const totalSize = $derived($virtualizerStore.getTotalSize());
241
+ // Read from reactive scroll state, not the DOM: a wheel, trackpad, key or scrollbar scroll
242
+ // updates `viewportScrollTop`, so the button appears as soon as the view leaves the end.
243
+ const distanceToEnd = $derived(Math.max(0, totalSize - viewportHeight - viewportScrollTop));
244
+ const shouldShowScrollButton = $derived(
245
+ showScrollButton &&
246
+ renderItems.length > 0 &&
247
+ !isFollowingAppendedItem &&
248
+ !isSettlingInitialEnd &&
249
+ distanceToEnd > SCROLL_BUTTON_THRESHOLD &&
250
+ (!isPinned || !followOutput)
251
+ );
252
+ const isPending = $derived(renderItems.at(-1)?.kind === 'pending');
253
+ const liveRegionText = $derived(
254
+ resolvedLiveText || (isPending ? t.aiReasoningThinking : undefined)
255
+ );
256
+ // The last turn, ignoring markers and system notices that may follow it (a context marker, a
257
+ // "model switched" notice): they do not end the turn.
258
+ const lastTurnMessage = $derived(
259
+ resolvedMessages.findLast(
260
+ (message) =>
261
+ message.type !== 'marker' && message.type !== 'context' && message.role !== 'system'
262
+ )
263
+ );
264
+ const shouldShowFollowUps = $derived(
265
+ showFollowUps &&
266
+ resolvedSuggestions.length > 0 &&
267
+ renderItems.length > 0 &&
268
+ !resolvedStreaming &&
269
+ !hasErrorRow &&
270
+ !resolvedQuestion &&
271
+ lastTurnMessage !== undefined &&
272
+ // After an assistant turn: its reply, or the tool calls that ended it.
273
+ lastTurnMessage.role !== 'user'
274
+ );
275
+ const followUpsInset = $derived(shouldShowFollowUps ? followUpsHeight : 0);
276
+ const listPaddingEnd = $derived(resolvedPaddingEnd + followUpsInset);
277
+
238
278
  const tocState = $derived.by(() => {
239
279
  const virtualizer = $virtualizerStore;
240
280
  const effectiveScrollOffset = isPinned
@@ -257,7 +297,11 @@
257
297
  });
258
298
  });
259
299
  const shouldRenderToc = $derived(
260
- showToc && tocState.entries.length > 1 && viewportHeight > 0 && totalSize > viewportHeight + 1
300
+ showToc &&
301
+ tocState.entries.length > 1 &&
302
+ viewportHeight > 0 &&
303
+ viewportWidth >= TOC_MIN_VIEWPORT_WIDTH &&
304
+ totalSize > viewportHeight + 1
261
305
  );
262
306
 
263
307
  $effect(() => {
@@ -267,7 +311,7 @@
267
311
  $effect(() => {
268
312
  const currentViewport = viewport;
269
313
  if (!currentViewport) return;
270
- const sync = () => syncThreadPosition(get(virtualizerStore));
314
+ const sync = () => syncThreadPosition();
271
315
  sync();
272
316
  const observer = new ResizeObserver(sync);
273
317
  observer.observe(currentViewport);
@@ -284,31 +328,23 @@
284
328
  ? 'end'
285
329
  : undefined
286
330
  : undefined;
287
- shouldSmoothAppendedItem =
288
- hasAddedItems &&
289
- !hasPrependedItems &&
290
- followOutput &&
291
- scrollBehavior === 'smooth' &&
292
- isViewportAtEnd();
293
- if (shouldSmoothAppendedItem) isFollowingAppendedItem = true;
294
331
  });
295
332
 
296
333
  $effect(() => {
297
334
  const count = renderItems.length;
298
335
  const currentViewport = viewport;
299
- scrollController.prepareSmoothAppendAdjustment(shouldSmoothAppendedItem);
300
336
  get(virtualizerStore).setOptions({
301
337
  count,
302
338
  getScrollElement: () => currentViewport ?? null,
303
339
  estimateSize: () => resolvedEstimateSize,
304
340
  overscan: Math.max(0, overscan),
305
341
  paddingStart: resolvedPaddingStart,
306
- paddingEnd: resolvedPaddingEnd,
342
+ paddingEnd: listPaddingEnd,
307
343
  getItemKey: renderItemKey,
308
344
  scrollToFn: scrollController.scrollToFn,
309
345
  anchorTo: 'end',
310
346
  followOnAppend: followOnAppendBehavior(),
311
- scrollEndThreshold: Math.max(0, bottomThreshold),
347
+ scrollEndThreshold: endThreshold(),
312
348
  onChange: handleVirtualizerChange
313
349
  });
314
350
  if (prependScrollTarget) {
@@ -316,19 +352,13 @@
316
352
  prependScrollTarget = undefined;
317
353
  scrollController.settlePrependedItems(
318
354
  target === 'start' ? scrollToStart : () => scrollToBottom('instant'),
319
- () => syncThreadPosition(get(virtualizerStore))
355
+ () => syncThreadPosition()
320
356
  );
321
357
  }
322
358
  previousRenderItemCount = count;
323
359
  previousFirstRenderItemKey = renderItems[0]?.key;
324
- if (shouldSmoothAppendedItem) {
325
- scrollController.scheduleSmoothAppendAdjustmentReset();
326
- scrollController.watchAppendFollowEnd(isViewportAtEnd, () => {
327
- isFollowingAppendedItem = false;
328
- syncThreadPosition(get(virtualizerStore));
329
- });
330
- }
331
360
  if (count === 0) {
361
+ isPinned = true;
332
362
  hasInitializedEnd = false;
333
363
  isInitializingEnd = false;
334
364
  isFollowingAppendedItem = false;
@@ -340,17 +370,67 @@
340
370
  hasInitializedEnd = true;
341
371
  scheduleInitialEndSettlement();
342
372
  }
343
- syncThreadPosition(get(virtualizerStore));
373
+ syncThreadPosition();
374
+ stickToEnd();
375
+ });
376
+
377
+ $effect(() => {
378
+ void isPinned;
379
+ untrack(applyFollowOptions);
344
380
  });
345
381
 
346
382
  onDestroy(() => {
347
383
  cancelInitialEndSettlement();
384
+ if (stickFrame !== undefined) cancelAnimationFrame(stickFrame);
348
385
  questionPublisher.destroy();
349
386
  scrollController.destroy();
350
387
  });
351
388
 
389
+ // The virtualizer re-measures rows from its ResizeObserver and re-renders the range in the same
390
+ // pass (a streamed row grows, the pinned view moves to the new end, rows enter and leave the
391
+ // overscan). A row that starts or stops being laid out while the browser is still delivering
392
+ // resize notifications cannot be delivered in that pass, and the browser reports a
393
+ // "ResizeObserver loop" error. Rows that mount during a delivery are measured and observed on the
394
+ // next frame, before the next delivery (their cached or estimated size holds until then), and a
395
+ // removed row stops being observed before the browser looks for further changes.
396
+ function measureThreadItem(
397
+ element: HTMLElement,
398
+ entry: ResizeObserverEntry | undefined,
399
+ instance: Parameters<typeof measureVirtualElement<HTMLElement>>[2]
400
+ ): number {
401
+ if (entry && !isInResizeDelivery) {
402
+ isInResizeDelivery = true;
403
+ setTimeout(() => (isInResizeDelivery = false));
404
+ }
405
+ return measureVirtualElement(element, entry, instance);
406
+ }
407
+
408
+ let isReleasingItems = false;
409
+
410
+ function releaseRemovedItems(): void {
411
+ if (isReleasingItems) return;
412
+ isReleasingItems = true;
413
+ queueMicrotask(() => {
414
+ isReleasingItems = false;
415
+ // With no node, the virtualizer unobserves and forgets every disconnected row.
416
+ get(virtualizerStore).measureElement(null);
417
+ });
418
+ }
419
+
352
420
  const measureItem: Attachment<HTMLElement> = (element) => {
353
- get(virtualizerStore).measureElement(element);
421
+ let frame: number | undefined;
422
+ if (isInResizeDelivery) {
423
+ frame = requestAnimationFrame(() => {
424
+ frame = undefined;
425
+ if (element.isConnected) get(virtualizerStore).measureElement(element);
426
+ });
427
+ } else {
428
+ get(virtualizerStore).measureElement(element);
429
+ }
430
+ return () => {
431
+ if (frame !== undefined) cancelAnimationFrame(frame);
432
+ releaseRemovedItems();
433
+ };
354
434
  };
355
435
 
356
436
  function createMessageKeys(currentMessages: readonly TMessage[]): string[] {
@@ -384,7 +464,7 @@
384
464
  function initialThreadOffset(): number {
385
465
  return Math.max(
386
466
  0,
387
- resolvedPaddingStart + resolvedPaddingEnd + renderItems.length * resolvedEstimateSize
467
+ resolvedPaddingStart + listPaddingEnd + renderItems.length * resolvedEstimateSize
388
468
  );
389
469
  }
390
470
 
@@ -392,63 +472,222 @@
392
472
  return renderItems.length;
393
473
  }
394
474
 
475
+ // The virtualizer keeps the end in view by itself when an item is appended or re-measured
476
+ // (streaming text, rows mounting as they scroll in) within `scrollEndThreshold` of the end. That
477
+ // is only wanted while the thread follows: once the user scrolls up, it would pull every small
478
+ // scroll back down. Read untracked: the effect below applies a change of `isPinned`.
479
+ // Always instant: a new row is in place on its first painted frame, like streamed text. A smooth
480
+ // follow painted it below the fold first, which on a short row reads as a one-frame stutter;
481
+ // `scrollBehavior` stays for the navigation the reader asks for (TOC, scroll to latest).
395
482
  function followOnAppendBehavior(): AIThreadScrollBehavior | false {
396
- return followOutput ? scrollBehavior : false;
483
+ return followOutput && untrack(() => isPinned) ? 'instant' : false;
397
484
  }
398
485
 
399
- function handleVirtualizerChange(instance: EndStateVirtualizer): void {
400
- syncThreadPosition(instance);
486
+ // Unpinned, no distance counts as the end (-1): a reader left exactly at the end by a layout
487
+ // change (a row shrinking under them) would otherwise be pulled down when that row grows again.
488
+ function endThreshold(): number {
489
+ return untrack(() => isPinned) ? Math.max(0, bottomThreshold) : -1;
490
+ }
491
+
492
+ let listElement = $state<HTMLDivElement | null>(null);
493
+
494
+ // Called from inside the virtualizer's measurement (a row's resize observer). When a row grows
495
+ // at the end it moves the offset to keep the end in view, but the list's height only follows a
496
+ // moment later through the template, so the browser clamps that move and the virtualizer retries
497
+ // it right after this callback. Sizing the list here, before the retry, lets it land before the
498
+ // frame is painted, instead of showing the new line below the fold for a frame.
499
+ function handleVirtualizerChange(instance: { getTotalSize: () => number }): void {
500
+ // Only while following: a reader who scrolled up keeps the template's pace, or the
501
+ // virtualizer's correction for a row growing across the fold would land in full and move them.
502
+ const following = isPinned && followOutput && !isInitializingEnd && !isFollowingAppendedItem;
503
+ if (following && viewport && listElement) {
504
+ listElement.style.height = `${instance.getTotalSize()}px`;
505
+ // With the list already at its new height, land on the end now rather than in
506
+ // `stickToEnd`'s next frame (a row growing at the end, the action bar mounting as a reply
507
+ // ends).
508
+ if (distanceFromEnd() > 1) viewport.scrollTop = viewport.scrollHeight;
509
+ }
510
+ syncThreadPosition();
401
511
  }
402
512
 
403
- function syncThreadPosition(instance: EndStateVirtualizer): void {
513
+ function syncThreadPosition(): void {
404
514
  if (!viewport) return;
405
515
  viewportHeight = viewport.clientHeight;
516
+ viewportWidth = viewport.clientWidth;
406
517
  viewportScrollTop = viewport.scrollTop;
407
518
  if (isInitializingEnd) {
408
519
  isPinned = true;
409
520
  return;
410
521
  }
411
- isPinned = isViewportAtEnd() || instance.isAtEnd(Math.max(0, bottomThreshold));
522
+ stickToEnd();
523
+ }
524
+
525
+ // Closes any gap between the viewport and the end while pinned. Deferred a frame so the spacer
526
+ // has taken the virtualizer's new total size, and coalesced because size changes arrive in bursts.
527
+ function stickToEnd(): void {
528
+ if (stickFrame !== undefined || !followOutput) return;
529
+ stickFrame = requestAnimationFrame(() => {
530
+ stickFrame = undefined;
531
+ if (!viewport || !isPinned || isInitializingEnd) return;
532
+ // A smooth follow or a smooth scroll-to-latest owns the viewport until it lands.
533
+ if (isFollowingAppendedItem || renderItems.length === 0) return;
534
+ if (distanceFromEnd() <= 1) return;
535
+ get(virtualizerStore).scrollToEnd({ behavior: 'instant' });
536
+ syncThreadPosition();
537
+ });
412
538
  }
413
539
 
414
540
  function isViewportAtStart(): boolean {
415
541
  return !viewport || viewport.scrollTop <= 1;
416
542
  }
417
543
 
418
- function isViewportAtEnd(): boolean {
419
- if (!viewport) return isPinned;
420
- const distanceFromEnd = viewport.scrollHeight - viewport.clientHeight - viewport.scrollTop;
421
- return Math.max(distanceFromEnd, 0) <= Math.max(0, bottomThreshold);
544
+ function distanceFromEnd(): number {
545
+ if (!viewport) return 0;
546
+ return Math.max(0, viewport.scrollHeight - viewport.clientHeight - viewport.scrollTop);
422
547
  }
423
548
 
424
- function handleScroll(event: UIEvent & { currentTarget: EventTarget & HTMLDivElement }): void {
425
- syncThreadPosition(get(virtualizerStore));
426
- onscroll?.(event);
549
+ function isViewportAtEnd(): boolean {
550
+ if (!viewport) return isPinned;
551
+ return distanceFromEnd() <= Math.max(0, bottomThreshold);
427
552
  }
428
553
 
429
- function handleWheel(): void {
554
+ function unpin(): void {
430
555
  cancelInitialEndSettlement();
431
556
  isInitializingEnd = false;
432
557
  isFollowingAppendedItem = false;
433
558
  isPinned = false;
559
+ // Now, not in the effect below: a row measured before that effect runs would otherwise still
560
+ // see the pinned end threshold and scroll a scroll that has only just started back down.
561
+ applyFollowOptions();
562
+ cancelProgrammaticScroll();
563
+ }
564
+
565
+ // The virtualizer keeps steering a scrollToEnd/scrollToIndex toward its target for up to 5s,
566
+ // until the offset holds for a frame, and re-scrolls whenever measurements move that target. It
567
+ // also remembers an end adjustment the browser clamped, and re-applies it once the list grows.
568
+ // On a busy page either can still be pending when the reader scrolls away, and would pull them
569
+ // back. The reader wins: drop both. Neither has a public cancel (and scrolling to the current
570
+ // offset would cut a smooth wheel or keyboard scroll short), so clear the fields they check.
571
+ function cancelProgrammaticScroll(): void {
572
+ const virtualizer = get(virtualizerStore) as unknown as {
573
+ scrollState?: unknown;
574
+ _clampedAdjustment?: unknown;
575
+ };
576
+ if (virtualizer.scrollState) virtualizer.scrollState = null;
577
+ if (virtualizer._clampedAdjustment) virtualizer._clampedAdjustment = null;
578
+ }
579
+
580
+ function applyFollowOptions(): void {
581
+ const virtualizer = get(virtualizerStore);
582
+ virtualizer.setOptions({
583
+ ...virtualizer.options,
584
+ followOnAppend: followOnAppendBehavior(),
585
+ scrollEndThreshold: endThreshold()
586
+ });
587
+ }
588
+
589
+ function handleScroll(event: UIEvent & { currentTarget: EventTarget & HTMLDivElement }): void {
590
+ const scrollTop = event.currentTarget.scrollTop;
591
+ if (scrollTop < lastScrollTop - 0.5) {
592
+ // Only the reader moving up away from the end stops following. A wheel or a key already
593
+ // unpinned on its own event; here that leaves a drag (the scrollbar, a touch pan). Every other
594
+ // upward move is layout: the virtualizer keeping the end anchored as the viewport grows (the
595
+ // suggestions bar going away), or the browser clamping the offset onto the end (the composer
596
+ // coming back after a docked question). Those change nothing, so a following thread keeps
597
+ // following and a reader who scrolled up is not re-pinned.
598
+ if (isDragging && !isInitializingEnd && distanceFromEnd() >= 1) unpin();
599
+ }
600
+ // Only a scroll that reaches the very end follows output again. A layout change that happens
601
+ // to leave the view at the end (rows above it measured smaller) must not re-pin it, or the next
602
+ // growth pulls a reader who scrolled up back to the bottom.
603
+ else if (distanceFromEnd() < 1) isPinned = true;
604
+ lastScrollTop = scrollTop;
605
+ syncThreadPosition();
606
+ onscroll?.(event);
434
607
  }
435
608
 
609
+ // A wheel up stops following before its scroll lands, so no output appended in between pulls the
610
+ // view back down.
611
+ function handleWheel(event: WheelEvent): void {
612
+ if (event.deltaY < 0) unpin();
613
+ }
614
+
615
+ // The keys that scroll the transcript up stop following on keydown, like a wheel: a smooth
616
+ // keyboard scroll lands over several frames, and output appended meanwhile must not undo it.
617
+ const scrollUpKeys = new Set(['PageUp', 'ArrowUp', 'Home']);
618
+ function handleViewportKeydown(event: KeyboardEvent): void {
619
+ if (event.target !== event.currentTarget || event.altKey || event.ctrlKey || event.metaKey)
620
+ return;
621
+ if (scrollUpKeys.has(event.key) || (event.key === ' ' && event.shiftKey)) unpin();
622
+ }
623
+
624
+ // When the viewport itself changes height while the thread follows the end (the suggestions bar
625
+ // appearing as a reply ends, a question docked in place of the composer), land on the end before
626
+ // the frame is painted. A resize observer runs after layout and before paint; the virtualizer's
627
+ // change callback would only stick a frame later, showing the end below the fold for a frame.
628
+ const keepEndOnResize: Attachment<HTMLDivElement> = (node) => {
629
+ if (typeof ResizeObserver === 'undefined') return;
630
+ let lastHeight = node.clientHeight;
631
+ const observer = new ResizeObserver(() => {
632
+ const height = node.clientHeight;
633
+ if (height === lastHeight) return;
634
+ lastHeight = height;
635
+ if (!isPinned || !followOutput || isInitializingEnd || isFollowingAppendedItem) return;
636
+ node.scrollTop = node.scrollHeight;
637
+ syncThreadPosition();
638
+ });
639
+ observer.observe(node);
640
+ return () => observer.disconnect();
641
+ };
642
+
643
+ // Tracks a drag on the transcript. Touch uses touch events: a touch pan cancels its pointer as
644
+ // soon as the browser takes it over, before the scroll events arrive.
645
+ const trackDrag: Attachment<HTMLDivElement> = (node) => {
646
+ const start = () => (isDragging = true);
647
+ const end = () => (isDragging = false);
648
+ const offs = [
649
+ on(node, 'pointerdown', (event) => {
650
+ if (event.pointerType !== 'touch') start();
651
+ }),
652
+ on(node, 'touchstart', start, { passive: true }),
653
+ on(window, 'pointerup', end),
654
+ on(window, 'pointercancel', (event) => {
655
+ if (event.pointerType !== 'touch') end();
656
+ }),
657
+ on(window, 'touchend', end),
658
+ on(window, 'touchcancel', end)
659
+ ];
660
+ return () => {
661
+ for (const off of offs) off();
662
+ isDragging = false;
663
+ };
664
+ };
665
+
436
666
  function handleRootWheel(
437
667
  event: WheelEvent & { currentTarget: EventTarget & HTMLDivElement }
438
668
  ): void {
439
- handleWheel();
669
+ handleWheel(event);
440
670
  onWheel?.(event);
441
671
  }
442
672
 
443
673
  function scrollToStart(): void {
444
674
  get(virtualizerStore).scrollToOffset(0, { behavior: 'instant' });
445
- syncThreadPosition(get(virtualizerStore));
675
+ syncThreadPosition();
446
676
  }
447
677
 
448
678
  function scrollToBottom(behavior: AIThreadScrollBehavior = scrollBehavior): void {
449
679
  if (renderItems.length === 0) return;
680
+ isPinned = true;
681
+ if (behavior === 'smooth') {
682
+ isFollowingAppendedItem = true;
683
+ scrollController.watchAppendFollowEnd(isViewportAtEnd, () => {
684
+ isFollowingAppendedItem = false;
685
+ syncThreadPosition();
686
+ stickToEnd();
687
+ });
688
+ }
450
689
  get(virtualizerStore).scrollToEnd({ behavior });
451
- syncThreadPosition(get(virtualizerStore));
690
+ syncThreadPosition();
452
691
  }
453
692
 
454
693
  function scheduleInitialEndSettlement(): void {
@@ -461,7 +700,7 @@
461
700
  get(virtualizerStore).scrollToEnd({ behavior: 'instant' });
462
701
  initialEndFrame = undefined;
463
702
  isInitializingEnd = false;
464
- syncThreadPosition(get(virtualizerStore));
703
+ syncThreadPosition();
465
704
  });
466
705
  });
467
706
  }
@@ -473,6 +712,16 @@
473
712
  initialEndFrame = undefined;
474
713
  }
475
714
 
715
+ function resolveErrorRetry(): (() => void | Promise<void>) | undefined {
716
+ if (onErrorRetry) return onErrorRetry;
717
+ const current = conversation;
718
+ if (!current) return undefined;
719
+ return () => {
720
+ const index = current.messages.length - 1;
721
+ current.retry(index >= 0 ? { index } : undefined);
722
+ };
723
+ }
724
+
476
725
  function handleSuggestionSelect(suggestion: string): void {
477
726
  if (onSelect) {
478
727
  onSelect(suggestion);
@@ -502,6 +751,7 @@
502
751
  }): Promise<void> {
503
752
  errorMessage = undefined;
504
753
  questionStates = { ...questionStates, [request.key]: state };
754
+ if (detail) questionValuesByKey = { ...questionValuesByKey, [request.key]: detail.values };
505
755
  const change = {
506
756
  request,
507
757
  state,
@@ -520,7 +770,7 @@
520
770
  await conversation.resolveAskUserQuestion(state, change.detail, request);
521
771
  } catch (error) {
522
772
  questionStates = { ...questionStates, [request.key]: 'pending' };
523
- errorMessage = getErrorMessage(error, 'Unable to resolve the question request.');
773
+ errorMessage = getErrorMessage(error, t.aiThreadQuestionFailed);
524
774
  }
525
775
  }
526
776
 
@@ -537,16 +787,17 @@
537
787
  aria-busy={resolvedStreaming}
538
788
  class={classes.root({ className })}
539
789
  {...rootAttributes}
790
+ style:--ai-thread-content-width={resolvedContentWidth}
540
791
  onwheel={handleRootWheel}
541
792
  >
542
- {#if resolvedLiveText}
793
+ {#if liveRegionText}
543
794
  <div data-slot="ai-thread-live-region" class="sr-only" aria-live="polite" aria-atomic="true">
544
- {resolvedLiveText}
795
+ {liveRegionText}
545
796
  </div>
546
797
  {/if}
547
798
  {#if header}<Slot render={header} class={classes.header()} />{/if}
548
799
  {#if errorMessage}<Alert color="danger" variant="soft" description={errorMessage} />{/if}
549
- <div class={classes.body()}>
800
+ <div class={classes.body()} style:--ai-thread-follow-ups-height={`${followUpsInset}px`}>
550
801
  <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
551
802
  <div
552
803
  bind:this={viewport}
@@ -557,17 +808,25 @@
557
808
  tabindex="0"
558
809
  aria-label={viewportLabel ?? t.aiThreadTranscript}
559
810
  onscroll={handleScroll}
811
+ {@attach (node) => on(node, 'keydown', handleViewportKeydown)}
812
+ {@attach trackDrag}
813
+ {@attach keepEndOnResize}
560
814
  >
561
815
  <AIThreadItems
562
816
  {renderItems}
563
817
  {virtualItems}
564
818
  {totalSize}
819
+ bind:listRef={listElement}
565
820
  {measureItem}
566
821
  density={resolvedDensity}
567
822
  messageSize={resolvedMessageSize}
568
823
  {messageVariant}
824
+ {messageColor}
569
825
  suggestions={resolvedSuggestions}
570
826
  onSelect={handleSuggestionSelect}
827
+ error={resolvedError}
828
+ {errorRetry}
829
+ liveText={resolvedLiveText}
571
830
  {empty}
572
831
  message={messageSlot}
573
832
  {messageActions}
@@ -598,7 +857,13 @@
598
857
  <Slot render={toc} payload={tocState} />
599
858
  {:else}
600
859
  <div class={classes.tocOverlay({ side: tocSide })}>
601
- <AIThreadToc state={tocState} maxPins={tocMaxPins} side={tocSide} theme={tocTheme} />
860
+ <AIThreadToc
861
+ state={tocState}
862
+ maxPins={tocMaxPins}
863
+ showRange={tocShowRange}
864
+ side={tocSide}
865
+ theme={tocTheme}
866
+ />
602
867
  </div>
603
868
  {/if}
604
869
  {/if}
@@ -606,15 +871,33 @@
606
871
  {#if shouldShowScrollButton}
607
872
  <Button
608
873
  squared
609
- size="small"
610
- variant="soft"
874
+ size="normal"
875
+ variant="outline"
611
876
  label={t.aiThreadScrollToLatest}
877
+ data-slot="ai-thread-scroll-button"
612
878
  class={classes.scrollButton({ position: scrollButtonPosition })}
613
879
  onclick={() => scrollToBottom()}
614
880
  >
615
881
  {@render arrowDownIcon({ size: 16 })}
616
882
  </Button>
617
883
  {/if}
884
+ {#if shouldShowFollowUps}
885
+ <!-- The scroll row's viewport is the labelled group. -->
886
+ <div
887
+ data-slot="ai-thread-follow-ups"
888
+ class={classes.followUps({ density: resolvedDensity })}
889
+ bind:clientHeight={followUpsHeight}
890
+ >
891
+ <!-- One row that scrolls sideways (with a fade) rather than wrapping on a phone. -->
892
+ <div class={classes.followUpList()}>
893
+ <AISuggestions
894
+ suggestions={resolvedSuggestions}
895
+ label={t.aiThreadFollowUps}
896
+ onSelect={handleSuggestionSelect}
897
+ />
898
+ </div>
899
+ </div>
900
+ {/if}
618
901
  </div>
619
902
  {#if renderAskUserQuestion && resolvedQuestion}
620
903
  {@const question = resolvedQuestion}