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.
- package/README.md +1 -1
- package/dist/attachments/disclosurePanel.svelte.d.ts +84 -0
- package/dist/attachments/disclosurePanel.svelte.js +277 -0
- package/dist/attachments/portal.d.ts +17 -1
- package/dist/attachments/portal.js +39 -2
- package/dist/attachments/spinnerOverlay.svelte.js +12 -0
- package/dist/attachments/transitionSize.d.ts +6 -0
- package/dist/attachments/transitionSize.js +30 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestion.svelte +131 -17
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte +26 -6
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte.d.ts +6 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte +27 -53
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte.d.ts +3 -4
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionHeader.svelte +19 -16
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte +180 -21
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte.d.ts +9 -1
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte +56 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte.d.ts +4 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.d.ts +1 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.js +26 -8
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.props.d.ts +62 -5
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.d.ts +42 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.js +53 -12
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.d.ts +17 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.js +56 -8
- package/dist/components/AIAskUserQuestion/index.d.ts +3 -1
- package/dist/components/AIAskUserQuestion/index.js +2 -0
- package/dist/components/AIAskUserQuestion/schemas.d.ts +44 -0
- package/dist/components/AIAskUserQuestion/schemas.js +10 -3
- package/dist/components/AIChat/AIChat.svelte +10 -0
- package/dist/components/AIChat/AIChat.svelte.d.ts +2 -2
- package/dist/components/AIChat/AIChatComposerSurface.svelte +23 -5
- package/dist/components/AIChat/AIChatComposerSurface.svelte.d.ts +5 -0
- package/dist/components/AIChat/AIChatSkeleton.svelte +29 -37
- package/dist/components/AIChat/AIChatSurface.svelte +30 -2
- package/dist/components/AIChat/AIChatSurface.svelte.d.ts +1 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte +11 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte.d.ts +3 -1
- package/dist/components/AIChat/aiChat.mcp.d.ts +1 -1
- package/dist/components/AIChat/aiChat.mcp.js +31 -15
- package/dist/components/AIChat/aiChat.props.d.ts +36 -10
- package/dist/components/AIChat/aiChat.theme.d.ts +9 -0
- package/dist/components/AIChat/aiChat.theme.js +21 -4
- package/dist/components/AIChat/aiChatSkeleton.props.d.ts +5 -0
- package/dist/components/AIChat/index.d.ts +1 -1
- package/dist/components/AIComposer/AIComposer.svelte +102 -5
- package/dist/components/AIComposer/AIComposer.svelte.d.ts +1 -0
- package/dist/components/AIComposer/AIComposerFooter.svelte +54 -12
- package/dist/components/AIComposer/AIComposerFooter.svelte.d.ts +2 -0
- package/dist/components/AIComposer/AIComposerQueue.svelte +8 -3
- package/dist/components/AIComposer/aiComposer.editor.theme.js +13 -2
- package/dist/components/AIComposer/aiComposer.mcp.d.ts +1 -1
- package/dist/components/AIComposer/aiComposer.mcp.js +15 -7
- package/dist/components/AIComposer/aiComposer.props.d.ts +27 -7
- package/dist/components/AIComposer/aiComposer.theme.d.ts +42 -3
- package/dist/components/AIComposer/aiComposer.theme.js +37 -5
- package/dist/components/AIComposer/aiComposerFileController.svelte.d.ts +20 -0
- package/dist/components/AIComposer/aiComposerFileController.svelte.js +75 -9
- package/dist/components/AIComposer/aiComposerSourceAdapter.js +22 -4
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.d.ts +12 -0
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.js +16 -6
- package/dist/components/AIContext/AIContext.svelte +7 -3
- package/dist/components/AIContext/aiContext.mcp.d.ts +1 -1
- package/dist/components/AIContext/aiContext.mcp.js +1 -1
- package/dist/components/AIContext/aiContext.props.d.ts +4 -1
- package/dist/components/AIContext/aiContext.theme.d.ts +3 -0
- package/dist/components/AIContext/aiContext.theme.js +7 -2
- package/dist/components/AIConversation/AIConversation.svelte.d.ts +2 -2
- package/dist/components/AIFilePreview/aiFilePreview.theme.js +1 -1
- package/dist/components/AIMarker/AIMarker.svelte +2 -0
- package/dist/components/AIMarker/aiMarker.mcp.d.ts +1 -1
- package/dist/components/AIMarker/aiMarker.mcp.js +2 -0
- package/dist/components/AIMarker/aiMarker.props.d.ts +3 -0
- package/dist/components/AIMarker/aiMarker.theme.js +2 -2
- package/dist/components/AIMessage/AIMessage.svelte +38 -16
- package/dist/components/AIMessage/aiMessage.mcp.d.ts +1 -1
- package/dist/components/AIMessage/aiMessage.mcp.js +20 -6
- package/dist/components/AIMessage/aiMessage.props.d.ts +18 -2
- package/dist/components/AIMessage/aiMessage.theme.d.ts +51 -6
- package/dist/components/AIMessage/aiMessage.theme.js +91 -32
- package/dist/components/AIMessageActions/AIMessageActions.svelte +19 -9
- package/dist/components/AIMessageActions/aiMessageActions.mcp.d.ts +1 -1
- package/dist/components/AIMessageActions/aiMessageActions.mcp.js +11 -3
- package/dist/components/AIMessageActions/aiMessageActions.theme.js +36 -9
- package/dist/components/AIModelSelector/AIModelSelector.svelte +25 -10
- package/dist/components/AIModelSelector/aiModelSelector.mcp.d.ts +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.mcp.js +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.theme.d.ts +3 -0
- package/dist/components/AIModelSelector/aiModelSelector.theme.js +7 -3
- package/dist/components/AIReasoning/AIReasoning.svelte +135 -38
- package/dist/components/AIReasoning/aiReasoning.mcp.d.ts +1 -1
- package/dist/components/AIReasoning/aiReasoning.mcp.js +11 -5
- package/dist/components/AIReasoning/aiReasoning.props.d.ts +15 -4
- package/dist/components/AIReasoning/aiReasoning.theme.d.ts +45 -0
- package/dist/components/AIReasoning/aiReasoning.theme.js +47 -7
- package/dist/components/AISuggestion/AISuggestion.svelte +2 -1
- package/dist/components/AISuggestion/AISuggestions.svelte +2 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.d.ts +1 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.js +8 -1
- package/dist/components/AISuggestion/aiSuggestion.props.d.ts +4 -1
- package/dist/components/AISuggestion/aiSuggestion.theme.js +1 -1
- package/dist/components/AISuggestion/aiSuggestions.props.d.ts +7 -0
- package/dist/components/AIThread/AIThread.svelte +378 -95
- package/dist/components/AIThread/AIThreadAskUserQuestion.svelte +1 -0
- package/dist/components/AIThread/AIThreadItems.svelte +266 -64
- package/dist/components/AIThread/AIThreadItems.svelte.d.ts +7 -3
- package/dist/components/AIThread/AIThreadMarker.svelte +8 -1
- package/dist/components/AIThread/AIThreadMarker.svelte.d.ts +1 -0
- package/dist/components/AIThread/aiThread.mcp.d.ts +1 -1
- package/dist/components/AIThread/aiThread.mcp.js +34 -20
- package/dist/components/AIThread/aiThread.props.d.ts +73 -8
- package/dist/components/AIThread/aiThread.theme.d.ts +78 -0
- package/dist/components/AIThread/aiThread.theme.js +108 -9
- package/dist/components/AIThread/index.d.ts +1 -1
- package/dist/components/AIThread/threadAskUserQuestion.d.ts +4 -1
- package/dist/components/AIThread/threadAskUserQuestion.js +8 -4
- package/dist/components/AIThread/threadRenderItems.d.ts +74 -3
- package/dist/components/AIThread/threadRenderItems.js +265 -77
- package/dist/components/AIThread/threadScrollController.d.ts +0 -8
- package/dist/components/AIThread/threadScrollController.js +2 -39
- package/dist/components/AIThread/threadTools.d.ts +11 -0
- package/dist/components/AIThread/threadTools.js +79 -0
- package/dist/components/AIThreadToc/AIThreadToc.svelte +188 -18
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte +25 -2
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.d.ts +4 -2
- package/dist/components/AIThreadToc/aiThreadToc.js +17 -5
- package/dist/components/AIThreadToc/aiThreadToc.mcp.d.ts +1 -1
- package/dist/components/AIThreadToc/aiThreadToc.mcp.js +13 -3
- package/dist/components/AIThreadToc/aiThreadToc.props.d.ts +11 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.js +15 -6
- package/dist/components/AITool/AITool.svelte +56 -21
- package/dist/components/AITool/AIToolCallList.svelte +79 -29
- package/dist/components/AITool/AIToolCallList.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolStatusMark.svelte +52 -0
- package/dist/components/AITool/AIToolStatusMark.svelte.d.ts +14 -0
- package/dist/components/AITool/AIToolValueSection.svelte +126 -28
- package/dist/components/AITool/AIToolValueSection.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolValueTree.svelte +11 -16
- package/dist/components/AITool/AIToolValueTree.svelte.d.ts +2 -3
- package/dist/components/AITool/aiTool.mcp.d.ts +1 -1
- package/dist/components/AITool/aiTool.mcp.js +36 -8
- package/dist/components/AITool/aiTool.props.d.ts +52 -6
- package/dist/components/AITool/aiTool.theme.d.ts +117 -39
- package/dist/components/AITool/aiTool.theme.js +144 -140
- package/dist/components/AITool/aiToolClock.svelte.d.ts +18 -0
- package/dist/components/AITool/aiToolClock.svelte.js +62 -0
- package/dist/components/AITool/aiToolPrimitiveThemes.d.ts +0 -2
- package/dist/components/AITool/aiToolPrimitiveThemes.js +0 -10
- package/dist/components/AITool/index.d.ts +2 -1
- package/dist/components/AITool/index.js +1 -0
- package/dist/components/AITool/toolRendering.d.ts +33 -1
- package/dist/components/AITool/toolRendering.js +179 -15
- package/dist/components/AITool/toolValueTree.d.ts +14 -1
- package/dist/components/AITool/toolValueTree.js +126 -27
- package/dist/components/Accordion/Accordion.svelte +109 -109
- package/dist/components/Accordion/Accordion.svelte.d.ts +0 -1
- package/dist/components/Accordion/AccordionPanel.svelte +64 -0
- package/dist/components/Accordion/AccordionPanel.svelte.d.ts +20 -0
- package/dist/components/Accordion/accordion.attributes.d.ts +24 -0
- package/dist/components/Accordion/accordion.attributes.js +20 -0
- package/dist/components/Accordion/accordion.mcp.d.ts +1 -1
- package/dist/components/Accordion/accordion.mcp.js +78 -22
- package/dist/components/Accordion/accordion.props.d.ts +54 -10
- package/dist/components/Accordion/accordion.theme.d.ts +3 -0
- package/dist/components/Accordion/accordion.theme.js +4 -0
- package/dist/components/Accordion/index.d.ts +1 -0
- package/dist/components/Accordion/index.js +1 -0
- package/dist/components/AudioPlayer/audioPlayerVolumeControl.slider.theme.d.ts +31 -1
- package/dist/components/Avatar/Avatar.svelte +60 -10
- package/dist/components/Avatar/AvatarGroup.svelte +9 -0
- package/dist/components/Avatar/avatar.mcp.d.ts +1 -1
- package/dist/components/Avatar/avatar.mcp.js +13 -5
- package/dist/components/Avatar/avatar.props.d.ts +28 -1
- package/dist/components/Avatar/avatar.theme.js +3 -3
- package/dist/components/Avatar/index.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.js +1 -1
- package/dist/components/Button/Button.svelte +35 -15
- package/dist/components/Button/button.mcp.d.ts +1 -1
- package/dist/components/Button/button.mcp.js +8 -4
- package/dist/components/Button/button.props.d.ts +23 -8
- package/dist/components/Button/button.theme.d.ts +12 -0
- package/dist/components/Button/button.theme.js +17 -4
- package/dist/components/ButtonGroup/buttonGroup.mcp.d.ts +1 -1
- package/dist/components/ButtonGroup/buttonGroup.mcp.js +1 -1
- package/dist/components/ButtonGroup/buttonGroup.props.d.ts +4 -1
- package/dist/components/Collapsible/Collapsible.svelte +125 -19
- package/dist/components/Collapsible/collapsible.attributes.d.ts +21 -0
- package/dist/components/Collapsible/collapsible.attributes.js +17 -0
- package/dist/components/Collapsible/collapsible.mcp.d.ts +1 -1
- package/dist/components/Collapsible/collapsible.mcp.js +62 -12
- package/dist/components/Collapsible/collapsible.props.d.ts +39 -8
- package/dist/components/Collapsible/collapsible.theme.js +3 -1
- package/dist/components/Collapsible/index.d.ts +1 -0
- package/dist/components/Collapsible/index.js +1 -0
- package/dist/components/Command/Command.svelte +56 -14
- package/dist/components/Command/command.mcp.d.ts +1 -1
- package/dist/components/Command/command.mcp.js +12 -6
- package/dist/components/Command/command.props.d.ts +39 -6
- package/dist/components/Command/command.state.svelte.d.ts +40 -11
- package/dist/components/Command/command.state.svelte.js +75 -28
- package/dist/components/Command/command.theme.js +4 -3
- package/dist/components/Confirmation/Confirmation.svelte +72 -31
- package/dist/components/Confirmation/confirmation.mcp.d.ts +1 -1
- package/dist/components/Confirmation/confirmation.mcp.js +5 -4
- package/dist/components/ContextMenu/ContextMenu.svelte +126 -16
- package/dist/components/ContextMenu/contextMenu.mcp.d.ts +1 -1
- package/dist/components/ContextMenu/contextMenu.mcp.js +10 -7
- package/dist/components/ContextMenu/contextMenu.props.d.ts +13 -4
- package/dist/components/ContextMenu/contextMenu.theme.d.ts +3 -3
- package/dist/components/ContextMenu/contextMenu.theme.js +3 -2
- package/dist/components/DataTable/DataTable.svelte +4 -9
- package/dist/components/DataTable/DataTableEditor.svelte +5 -0
- package/dist/components/DataTable/DataTableFilter.svelte +1 -0
- package/dist/components/DataTable/DataTableToolbar.svelte +1 -0
- package/dist/components/DataTable/dataTable.mcp.d.ts +1 -1
- package/dist/components/DataTable/dataTable.mcp.js +4 -2
- package/dist/components/DataTable/dataTable.theme.d.ts +0 -3
- package/dist/components/DataTable/dataTable.theme.js +9 -6
- package/dist/components/Dialog/Dialog.svelte +120 -35
- package/dist/components/Dialog/Dialog.svelte.d.ts +1 -1
- package/dist/components/Dialog/DialogBackdrop.svelte +21 -1
- package/dist/components/Dialog/dialog.api.d.ts +65 -0
- package/dist/components/Dialog/dialog.api.js +1 -0
- package/dist/components/Dialog/dialog.attributes.d.ts +23 -0
- package/dist/components/Dialog/dialog.attributes.js +19 -0
- package/dist/components/Dialog/dialog.indent.d.ts +6 -0
- package/dist/components/Dialog/dialog.indent.js +16 -0
- package/dist/components/Dialog/dialog.mcp.d.ts +1 -1
- package/dist/components/Dialog/dialog.mcp.js +195 -22
- package/dist/components/Dialog/dialog.props.d.ts +102 -19
- package/dist/components/Dialog/dialog.snap.d.ts +40 -0
- package/dist/components/Dialog/dialog.snap.js +78 -0
- package/dist/components/Dialog/dialog.state.svelte.d.ts +122 -10
- package/dist/components/Dialog/dialog.state.svelte.js +525 -66
- package/dist/components/Dialog/dialog.theme.d.ts +48 -0
- package/dist/components/Dialog/dialog.theme.js +32 -9
- package/dist/components/Dialog/index.d.ts +4 -1
- package/dist/components/Dialog/index.js +1 -0
- package/dist/components/DocumentViewer/DocumentSearchControl.svelte +5 -3
- package/dist/components/DocumentViewer/documentOutput.js +2 -1
- package/dist/components/FloatingWindow/FloatingWindow.svelte +20 -32
- package/dist/components/FloatingWindow/FloatingWindow.svelte.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.js +3 -3
- package/dist/components/FloatingWindow/floatingWindow.props.d.ts +9 -4
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.d.ts +8 -2
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.js +18 -7
- package/dist/components/Form/Ask/Ask.svelte +9 -13
- package/dist/components/Form/Ask/ask.mcp.d.ts +1 -1
- package/dist/components/Form/Ask/ask.mcp.js +1 -1
- package/dist/components/Form/Ask/ask.props.d.ts +1 -1
- package/dist/components/Form/Autocomplete/Autocomplete.svelte +418 -0
- package/dist/components/Form/Autocomplete/Autocomplete.svelte.d.ts +4 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.d.ts +30 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.js +64 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.d.ts +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.js +134 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.d.ts +146 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.js +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.d.ts +213 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.js +119 -0
- package/dist/components/Form/Autocomplete/index.d.ts +3 -0
- package/dist/components/Form/Autocomplete/index.js +2 -0
- package/dist/components/Form/Calendar/CalendarInput.svelte +9 -0
- package/dist/components/Form/Calendar/CalendarMonthYearPicker.svelte +3 -0
- package/dist/components/Form/Calendar/CalendarPrimitive.svelte +5 -0
- package/dist/components/Form/Calendar/calendar.mcp.d.ts +1 -1
- package/dist/components/Form/Calendar/calendar.mcp.js +2 -1
- package/dist/components/Form/Calendar/calendarInput.props.d.ts +2 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.d.ts +3 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.js +3 -0
- package/dist/components/Form/Checkbox/Checkbox.svelte +17 -2
- package/dist/components/Form/Checkbox/checkbox.mcp.d.ts +1 -1
- package/dist/components/Form/Checkbox/checkbox.mcp.js +11 -1
- package/dist/components/Form/Checkbox/checkbox.props.d.ts +12 -1
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte +69 -32
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte.d.ts +10 -2
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte +123 -74
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte.d.ts +12 -12
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.d.ts +1 -1
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.js +11 -7
- package/dist/components/Form/CheckboxesInput/checkboxesInput.props.d.ts +25 -9
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.d.ts +12 -0
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.js +9 -4
- package/dist/components/Form/CheckboxesInput/choiceEnter.d.ts +11 -0
- package/dist/components/Form/CheckboxesInput/choiceEnter.js +27 -0
- package/dist/components/Form/ColorInput/ColorInput.svelte +12 -3
- package/dist/components/Form/ColorInput/colorInput.mcp.d.ts +1 -1
- package/dist/components/Form/ColorInput/colorInput.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/ColorPicker.svelte +11 -2
- package/dist/components/Form/ColorPicker/ColorPickerInput.svelte +9 -0
- package/dist/components/Form/ColorPicker/colorPicker.mcp.d.ts +1 -1
- package/dist/components/Form/ColorPicker/colorPicker.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/colorPicker.props.d.ts +2 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.d.ts +4 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.js +12 -8
- package/dist/components/Form/Combobox/Combobox.svelte +145 -185
- package/dist/components/Form/Combobox/Combobox.svelte.d.ts +1 -1
- package/dist/components/Form/Combobox/ComboboxPopup.svelte +128 -0
- package/dist/components/Form/Combobox/ComboboxPopup.svelte.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.attributes.d.ts +34 -0
- package/dist/components/Form/Combobox/combobox.attributes.js +25 -0
- package/dist/components/Form/Combobox/combobox.items.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.items.js +68 -0
- package/dist/components/Form/Combobox/combobox.mcp.d.ts +1 -1
- package/dist/components/Form/Combobox/combobox.mcp.js +104 -13
- package/dist/components/Form/Combobox/combobox.props.d.ts +113 -19
- package/dist/components/Form/Combobox/combobox.state.svelte.d.ts +137 -0
- package/dist/components/Form/Combobox/combobox.state.svelte.js +375 -0
- package/dist/components/Form/Combobox/combobox.theme.d.ts +63 -0
- package/dist/components/Form/Combobox/combobox.theme.js +37 -1
- package/dist/components/Form/Combobox/index.d.ts +2 -1
- package/dist/components/Form/Combobox/index.js +1 -0
- package/dist/components/Form/DateInput/DateInput.svelte +11 -3
- package/dist/components/Form/DateInput/dateInput.mcp.d.ts +1 -1
- package/dist/components/Form/DateInput/dateInput.mcp.js +5 -0
- package/dist/components/Form/DateSelector/DateSelector.svelte +5 -2
- package/dist/components/Form/DateSelector/DateSelectorInput.svelte +9 -0
- package/dist/components/Form/DateSelector/dateSelector.mcp.d.ts +1 -1
- package/dist/components/Form/DateSelector/dateSelector.mcp.js +2 -2
- package/dist/components/Form/DateSelector/dateSelector.props.d.ts +2 -0
- package/dist/components/Form/Field/Field.svelte +256 -30
- package/dist/components/Form/Field/Field.svelte.d.ts +9 -0
- package/dist/components/Form/Field/FieldGroup.svelte +29 -0
- package/dist/components/Form/Field/FieldGroup.svelte.d.ts +11 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte +187 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte.d.ts +26 -0
- package/dist/components/Form/Field/field.d.ts +64 -8
- package/dist/components/Form/Field/field.mcp.d.ts +1 -1
- package/dist/components/Form/Field/field.mcp.js +158 -18
- package/dist/components/Form/Field/field.messages.d.ts +47 -0
- package/dist/components/Form/Field/field.messages.js +64 -0
- package/dist/components/Form/Field/field.state.svelte.d.ts +109 -3
- package/dist/components/Form/Field/field.state.svelte.js +508 -16
- package/dist/components/Form/Field/field.theme.d.ts +46 -0
- package/dist/components/Form/Field/field.theme.js +33 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.d.ts +61 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.js +1 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.d.ts +14 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.js +113 -0
- package/dist/components/Form/Field/index.d.ts +5 -2
- package/dist/components/Form/Field/index.js +1 -0
- package/dist/components/Form/Field/schemas.js +7 -2
- package/dist/components/Form/File/FileInput.svelte +24 -3
- package/dist/components/Form/File/fileInput.mcp.d.ts +1 -1
- package/dist/components/Form/File/fileInput.mcp.js +1 -0
- package/dist/components/Form/Form/Form.svelte +47 -14
- package/dist/components/Form/Form/FormActions.svelte +3 -1
- package/dist/components/Form/Form/FormActions.svelte.d.ts +42 -2
- package/dist/components/Form/Form/FormFieldRenderer.svelte +40 -2
- package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
- package/dist/components/Form/Form/form.d.ts +35 -6
- package/dist/components/Form/Form/form.mcp.d.ts +1 -1
- package/dist/components/Form/Form/form.mcp.js +113 -13
- package/dist/components/Form/Form/form.props.d.ts +32 -1
- package/dist/components/Form/Form/form.registry.d.ts +2 -2
- package/dist/components/Form/Form/form.registry.js +1 -4
- package/dist/components/Form/Form/form.state.svelte.d.ts +1138 -413
- package/dist/components/Form/Form/form.state.svelte.js +319 -26
- package/dist/components/Form/Form/index.d.ts +3 -1
- package/dist/components/Form/Form/visibility.d.ts +3096 -1831
- package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
- package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
- package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1022 -408
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
- package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
- package/dist/components/Form/NumberInput/index.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
- package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
- package/dist/components/Form/PasswordInput/Password.svelte +28 -1
- package/dist/components/Form/PasswordInput/index.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
- package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
- package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
- package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
- package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
- package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
- package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
- package/dist/components/Form/PinInput/PinInput.svelte +44 -9
- package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
- package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
- package/dist/components/Form/PinInput/index.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
- package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
- package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
- package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
- package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
- package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
- package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
- package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
- package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
- package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
- package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
- package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
- package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
- package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
- package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
- package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
- package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
- package/dist/components/Form/Select/Select.svelte +186 -48
- package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
- package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
- package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
- package/dist/components/Form/Select/index.d.ts +2 -1
- package/dist/components/Form/Select/index.js +1 -0
- package/dist/components/Form/Select/select.align.d.ts +5 -0
- package/dist/components/Form/Select/select.align.js +19 -5
- package/dist/components/Form/Select/select.attributes.d.ts +36 -0
- package/dist/components/Form/Select/select.attributes.js +27 -0
- package/dist/components/Form/Select/select.mcp.d.ts +1 -1
- package/dist/components/Form/Select/select.mcp.js +103 -18
- package/dist/components/Form/Select/select.props.d.ts +87 -10
- package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
- package/dist/components/Form/Select/select.state.svelte.js +354 -59
- package/dist/components/Form/Select/select.theme.d.ts +21 -0
- package/dist/components/Form/Select/select.theme.js +22 -0
- package/dist/components/Form/Slider/Slider.svelte +54 -14
- package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
- package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
- package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
- package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
- package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
- package/dist/components/Form/Slider/index.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.js +55 -11
- package/dist/components/Form/Slider/slider.props.d.ts +35 -2
- package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
- package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
- package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
- package/dist/components/Form/Slider/slider.theme.js +35 -17
- package/dist/components/Form/Switch/Switch.svelte +61 -38
- package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
- package/dist/components/Form/Switch/switch.mcp.js +25 -5
- package/dist/components/Form/Switch/switch.props.d.ts +14 -1
- package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
- package/dist/components/Form/Switch/switch.theme.js +8 -3
- package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
- package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
- package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
- package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
- package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
- package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
- package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
- package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
- package/dist/components/Form/TextArea/TextArea.svelte +8 -0
- package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
- package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
- package/dist/components/Form/TextInput/TextInput.svelte +8 -1
- package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
- package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
- package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
- package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
- package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
- package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
- package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
- package/dist/components/HoverCard/HoverCard.svelte +100 -10
- package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
- package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
- package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
- package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
- package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
- package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
- package/dist/components/HoverCard/hoverCard.theme.js +9 -2
- package/dist/components/HoverCard/index.d.ts +1 -0
- package/dist/components/HoverCard/index.js +1 -0
- package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
- package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
- package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
- package/dist/components/Kanban/kanban.theme.js +7 -3
- package/dist/components/Layout/layoutSpacing.d.ts +2 -2
- package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
- package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
- package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
- package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
- package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
- package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
- package/dist/components/Map/maplibre-cdn.js +3 -2
- package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
- package/dist/components/Markdown/markdown.mcp.js +2 -1
- package/dist/components/Markdown/markdown.theme.js +18 -9
- package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
- package/dist/components/Menu/Menu.svelte +3 -3
- package/dist/components/Menu/Menu.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
- package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
- package/dist/components/Menu/MenuFloating.svelte +421 -74
- package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
- package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
- package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
- package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
- package/dist/components/Menu/MenuSearchField.svelte +54 -0
- package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
- package/dist/components/Menu/MenuStacked.svelte +404 -158
- package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
- package/dist/components/Menu/index.d.ts +2 -1
- package/dist/components/Menu/index.js +1 -0
- package/dist/components/Menu/menu.attributes.d.ts +37 -0
- package/dist/components/Menu/menu.attributes.js +28 -0
- package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
- package/dist/components/Menu/menu.filter.svelte.js +143 -0
- package/dist/components/Menu/menu.mcp.d.ts +1 -1
- package/dist/components/Menu/menu.mcp.js +227 -17
- package/dist/components/Menu/menu.platform.d.ts +5 -0
- package/dist/components/Menu/menu.platform.js +11 -0
- package/dist/components/Menu/menu.props.d.ts +172 -9
- package/dist/components/Menu/menu.theme.d.ts +147 -0
- package/dist/components/Menu/menu.theme.js +101 -0
- package/dist/components/Menu/menuTree.d.ts +35 -1
- package/dist/components/Menu/menuTree.js +158 -1
- package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
- package/dist/components/MenuBar/menuBar.mcp.js +4 -2
- package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
- package/dist/components/MenuOption/MenuOption.svelte +5 -1
- package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
- package/dist/components/MenuOption/menuOption.mcp.js +8 -0
- package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
- package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
- package/dist/components/MenuOption/menuOption.theme.js +24 -4
- package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
- package/dist/components/Mermaid/mermaid.mcp.js +8 -8
- package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
- package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
- package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
- package/dist/components/Mermaid/mermaid.theme.js +26 -1
- package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
- package/dist/components/Meter/Meter.svelte +110 -24
- package/dist/components/Meter/Meter.svelte.d.ts +12 -12
- package/dist/components/Meter/meter.mcp.d.ts +1 -1
- package/dist/components/Meter/meter.mcp.js +23 -37
- package/dist/components/Meter/meter.props.d.ts +36 -44
- package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
- package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/index.d.ts +4 -0
- package/dist/components/NavigationMenu/index.js +3 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
- package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
- package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
- package/dist/components/Overlay/Overlay.svelte +19 -30
- package/dist/components/Overlay/index.d.ts +1 -0
- package/dist/components/Overlay/index.js +1 -0
- package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
- package/dist/components/Overlay/overlay.attributes.js +14 -0
- package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
- package/dist/components/Overlay/overlay.mcp.js +21 -3
- package/dist/components/Overlay/overlay.props.d.ts +8 -4
- package/dist/components/Popover/Popover.svelte +163 -52
- package/dist/components/Popover/Popover.svelte.d.ts +23 -2
- package/dist/components/Popover/PopoverSession.svelte +12 -0
- package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
- package/dist/components/Popover/index.d.ts +10 -2
- package/dist/components/Popover/index.js +4 -1
- package/dist/components/Popover/popover.api.d.ts +83 -0
- package/dist/components/Popover/popover.api.js +1 -0
- package/dist/components/Popover/popover.attributes.d.ts +32 -0
- package/dist/components/Popover/popover.attributes.js +28 -0
- package/dist/components/Popover/popover.claims.d.ts +19 -0
- package/dist/components/Popover/popover.claims.js +45 -0
- package/dist/components/Popover/popover.mcp.d.ts +1 -1
- package/dist/components/Popover/popover.mcp.js +163 -31
- package/dist/components/Popover/popover.position.d.ts +226 -0
- package/dist/components/Popover/popover.position.js +402 -0
- package/dist/components/Popover/popover.props.d.ts +179 -24
- package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
- package/dist/components/Popover/popover.state.svelte.js +1034 -194
- package/dist/components/Popover/popover.theme.d.ts +15 -0
- package/dist/components/Popover/popover.theme.js +27 -2
- package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
- package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
- package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
- package/dist/components/PopupMenu/popupMenu.context.js +52 -0
- package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
- package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
- package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
- package/dist/components/Progress/Progress.svelte +160 -0
- package/dist/components/Progress/Progress.svelte.d.ts +4 -0
- package/dist/components/Progress/index.d.ts +3 -0
- package/dist/components/Progress/index.js +2 -0
- package/dist/components/Progress/progress.mcp.d.ts +1 -0
- package/dist/components/Progress/progress.mcp.js +101 -0
- package/dist/components/Progress/progress.props.d.ts +79 -0
- package/dist/components/Progress/progress.props.js +1 -0
- package/dist/components/Progress/progress.theme.d.ts +129 -0
- package/dist/components/Progress/progress.theme.js +83 -0
- package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
- package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
- package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
- package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
- package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
- package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
- package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
- package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
- package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
- package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
- package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
- package/dist/components/RichTextInput/suggestions.js +2 -0
- package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
- package/dist/components/ScrollArea/index.d.ts +2 -1
- package/dist/components/ScrollArea/index.js +1 -0
- package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
- package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
- package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
- package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
- package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
- package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
- package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
- package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
- package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
- package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
- package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
- package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
- package/dist/components/Sidebar/SidebarAction.svelte +13 -3
- package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
- package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
- package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
- package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
- package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
- package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
- package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
- package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
- package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
- package/dist/components/Sidebar/index.d.ts +1 -0
- package/dist/components/Sidebar/index.js +1 -0
- package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
- package/dist/components/Sidebar/sidebar-position.js +31 -2
- package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
- package/dist/components/Sidebar/sidebar.attributes.js +29 -0
- package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
- package/dist/components/Sidebar/sidebar.mcp.js +45 -10
- package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
- package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
- package/dist/components/Sidebar/sidebar.theme.js +113 -62
- package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
- package/dist/components/Stepper/Stepper.svelte +2 -0
- package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
- package/dist/components/Stepper/stepper.mcp.js +1 -0
- package/dist/components/Stepper/stepper.props.d.ts +5 -0
- package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
- package/dist/components/Stepper/stepper.state.svelte.js +31 -12
- package/dist/components/Tabbar/Tabbar.svelte +55 -16
- package/dist/components/Tabbar/index.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.js +26 -9
- package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
- package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
- package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
- package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
- package/dist/components/Tabs/Tabs.svelte +73 -16
- package/dist/components/Tabs/index.d.ts +2 -1
- package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
- package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
- package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
- package/dist/components/Tabs/tabs.mcp.js +22 -4
- package/dist/components/Tabs/tabs.props.d.ts +39 -12
- package/dist/components/Tabs/tabs.theme.js +3 -1
- package/dist/components/Theme/Theme.svelte +44 -27
- package/dist/components/Theme/helper.d.ts +16 -2
- package/dist/components/Theme/helper.js +46 -4
- package/dist/components/Theme/theme.mcp.d.ts +1 -1
- package/dist/components/Theme/theme.mcp.js +103 -0
- package/dist/components/Theme/theme.props.d.ts +16 -0
- package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
- package/dist/components/Theme/theme.state.svelte.js +18 -1
- package/dist/components/Toast/Toast.svelte +184 -39
- package/dist/components/Toast/Toaster.svelte +14 -10
- package/dist/components/Toast/index.d.ts +1 -0
- package/dist/components/Toast/toast.mcp.d.ts +1 -1
- package/dist/components/Toast/toast.mcp.js +47 -6
- package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
- package/dist/components/Toast/toast.state.svelte.js +513 -68
- package/dist/components/Toast/toast.theme.js +1 -1
- package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
- package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
- package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
- package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
- package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
- package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
- package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
- package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
- package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
- package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
- package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
- package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
- package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
- package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
- package/dist/components/Tooltip/Tooltip.svelte +4 -12
- package/dist/components/Tooltip/TooltipHost.svelte +136 -15
- package/dist/components/Tooltip/index.d.ts +1 -0
- package/dist/components/Tooltip/index.js +1 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
- package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
- package/dist/components/Tooltip/tooltip.attributes.js +28 -0
- package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
- package/dist/components/Tooltip/tooltip.mcp.js +111 -10
- package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
- package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
- package/dist/components/Tooltip/tooltip.surface.js +42 -0
- package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
- package/dist/components/Utils/BeforeHydratation.svelte +14 -3
- package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
- package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
- package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
- package/dist/generated/componentAliases.d.ts +3 -0
- package/dist/generated/componentAliases.js +3 -0
- package/dist/generated/componentContract.d.ts +79 -34
- package/dist/generated/componentContract.js +225 -6
- package/dist/generated/componentMcpRegistry.js +6 -0
- package/dist/i18n/ar.js +107 -3
- package/dist/i18n/context.svelte.d.ts +6 -0
- package/dist/i18n/context.svelte.js +12 -0
- package/dist/i18n/de.js +101 -3
- package/dist/i18n/en.d.ts +91 -2
- package/dist/i18n/en.js +101 -3
- package/dist/i18n/es.js +101 -3
- package/dist/i18n/fr.js +101 -3
- package/dist/i18n/ja.js +101 -3
- package/dist/i18n/pt.js +101 -3
- package/dist/i18n/zh.js +101 -3
- package/dist/tailwind/geometry.js +7 -0
- package/dist/tailwind/global.js +31 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/types.mcp.d.ts +1 -1
- package/dist/types/types.mcp.js +23 -0
- package/dist/utils/cspNonce.d.ts +16 -0
- package/dist/utils/cspNonce.js +39 -0
- package/dist/utils/cva/merge.d.ts +5 -1
- package/dist/utils/cva/merge.js +6 -4
- package/dist/utils/focus.d.ts +34 -0
- package/dist/utils/focus.js +93 -0
- package/dist/utils/focusHistory.d.ts +21 -0
- package/dist/utils/focusHistory.js +99 -0
- package/dist/utils/handlers.d.ts +7 -0
- package/dist/utils/handlers.js +14 -0
- package/dist/utils/hoverIntent.d.ts +42 -0
- package/dist/utils/hoverIntent.js +57 -0
- package/dist/utils/id.d.ts +7 -0
- package/dist/utils/id.js +15 -0
- package/dist/utils/layers.svelte.d.ts +32 -4
- package/dist/utils/layers.svelte.js +214 -21
- package/dist/utils/listFilter.d.ts +44 -0
- package/dist/utils/listFilter.js +130 -0
- package/dist/utils/match.d.ts +35 -0
- package/dist/utils/match.js +36 -0
- package/dist/utils/number.d.ts +126 -0
- package/dist/utils/number.js +401 -0
- package/dist/utils/openChange.d.ts +88 -0
- package/dist/utils/openChange.js +71 -0
- package/dist/utils/openLifecycle.svelte.d.ts +41 -0
- package/dist/utils/openLifecycle.svelte.js +134 -0
- package/dist/utils/pointerDrag.d.ts +10 -0
- package/dist/utils/pointerDrag.js +37 -2
- package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
- package/dist/utils/pragmaticDragAndDrop.js +8 -3
- package/dist/utils/range.d.ts +62 -0
- package/dist/utils/range.js +70 -0
- package/dist/utils/requestNativeSubmit.d.ts +17 -0
- package/dist/utils/requestNativeSubmit.js +47 -0
- package/dist/utils/safeArea.svelte.d.ts +10 -1
- package/dist/utils/safeArea.svelte.js +19 -11
- package/dist/utils/stateAttributes.d.ts +108 -0
- package/dist/utils/stateAttributes.js +78 -0
- package/dist/utils/swipeVelocity.d.ts +32 -0
- package/dist/utils/swipeVelocity.js +59 -0
- package/dist/utils/timer.svelte.d.ts +65 -2
- package/dist/utils/timer.svelte.js +159 -25
- package/dist/utils/trigger.d.ts +41 -0
- package/dist/utils/trigger.js +103 -0
- package/dist/utils/typeahead.d.ts +9 -0
- package/dist/utils/typeahead.js +21 -9
- package/dist/utils/useDndList.svelte.d.ts +1 -1
- package/dist/utils/useDndList.svelte.js +6 -23
- package/dist/utils/useFocusScope.svelte.d.ts +29 -0
- package/dist/utils/useFocusScope.svelte.js +189 -27
- package/dist/utils/useHoverAction.svelte.d.ts +44 -4
- package/dist/utils/useHoverAction.svelte.js +161 -51
- package/dist/utils/useKeyDown.svelte.d.ts +19 -2
- package/dist/utils/useKeyDown.svelte.js +19 -12
- package/dist/utils/useListNavigation.svelte.d.ts +94 -13
- package/dist/utils/useListNavigation.svelte.js +261 -35
- package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
- package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
- package/dist/utils/useNavigation.svelte.d.ts +36 -3
- package/dist/utils/useNavigation.svelte.js +699 -332
- package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
- package/dist/utils/usePressAndHold.svelte.js +191 -0
- package/dist/utils/useScrollLock.svelte.d.ts +20 -1
- package/dist/utils/useScrollLock.svelte.js +54 -13
- package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
- package/dist/utils/useSlidingIndicator.svelte.js +27 -5
- package/dist/utils/useTabBridge.svelte.d.ts +20 -0
- package/dist/utils/useTabBridge.svelte.js +109 -0
- package/dist/utils/values.d.ts +15 -0
- package/dist/utils/values.js +49 -0
- package/package.json +31 -2
- package/dist/generated/componentMcpRegistry.d.ts +0 -142
- package/dist/utils/useDrag.svelte.d.ts +0 -11
- package/dist/utils/useDrag.svelte.js +0 -55
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
<script lang="ts" generics="TMessage extends AIThreadItem = AIThreadItem">
|
|
2
|
-
import {
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 = '
|
|
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 = '
|
|
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(
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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:
|
|
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 &&
|
|
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(
|
|
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:
|
|
342
|
+
paddingEnd: listPaddingEnd,
|
|
307
343
|
getItemKey: renderItemKey,
|
|
308
344
|
scrollToFn: scrollController.scrollToFn,
|
|
309
345
|
anchorTo: 'end',
|
|
310
346
|
followOnAppend: followOnAppendBehavior(),
|
|
311
|
-
scrollEndThreshold:
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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 +
|
|
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 ?
|
|
483
|
+
return followOutput && untrack(() => isPinned) ? 'instant' : false;
|
|
397
484
|
}
|
|
398
485
|
|
|
399
|
-
|
|
400
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
419
|
-
if (!viewport) return
|
|
420
|
-
|
|
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
|
|
425
|
-
|
|
426
|
-
|
|
549
|
+
function isViewportAtEnd(): boolean {
|
|
550
|
+
if (!viewport) return isPinned;
|
|
551
|
+
return distanceFromEnd() <= Math.max(0, bottomThreshold);
|
|
427
552
|
}
|
|
428
553
|
|
|
429
|
-
function
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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
|
|
793
|
+
{#if liveRegionText}
|
|
543
794
|
<div data-slot="ai-thread-live-region" class="sr-only" aria-live="polite" aria-atomic="true">
|
|
544
|
-
{
|
|
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
|
|
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="
|
|
610
|
-
variant="
|
|
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}
|