entasis 0.10.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +258 -32
- package/dist/components/Form/Field/Field.svelte.d.ts +15 -6
- 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 +75 -10
- 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 +117 -40
- package/dist/components/Form/Field/field.state.svelte.js +525 -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 +49 -15
- 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 +96 -12
- package/dist/components/Form/Form/FormFieldRenderer.svelte.d.ts +3 -2
- package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
- package/dist/components/Form/Form/form.d.ts +84 -11
- package/dist/components/Form/Form/form.mcp.d.ts +1 -1
- package/dist/components/Form/Form/form.mcp.js +178 -12
- package/dist/components/Form/Form/form.props.d.ts +32 -1
- package/dist/components/Form/Form/form.registry.d.ts +28 -0
- package/dist/components/Form/Form/form.registry.js +59 -0
- package/dist/components/Form/Form/form.state.svelte.d.ts +1186 -420
- package/dist/components/Form/Form/form.state.svelte.js +322 -28
- package/dist/components/Form/Form/index.d.ts +4 -1
- package/dist/components/Form/Form/index.js +1 -0
- package/dist/components/Form/Form/visibility.d.ts +3130 -1863
- 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 +1050 -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 +231 -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
|
@@ -0,0 +1,721 @@
|
|
|
1
|
+
// Behaviour of a NavigationMenu: which panel is open and why, hover switching, the layer that
|
|
2
|
+
// dismisses it, Tab order between the triggers and the inline panel area, the arrow keys along
|
|
3
|
+
// the bar and inside the open panel, placement of that area under the active trigger, and the
|
|
4
|
+
// enter, exit and switch animations.
|
|
5
|
+
//
|
|
6
|
+
// Keyboard follows the WAI-ARIA APG disclosure navigation pattern, with Base UI's choices where
|
|
7
|
+
// the pattern leaves room (ArrowDown opens a trigger without moving focus, arrows inside a panel
|
|
8
|
+
// wrap) and menubar-style inline arrows: with a panel open, moving along the bar, from the bar or
|
|
9
|
+
// from inside the panel, switches the open panel to the focused trigger (no wrap).
|
|
10
|
+
//
|
|
11
|
+
// The panel area is one viewport rendered inline inside the `<nav>`, after the trigger list. It
|
|
12
|
+
// is never portaled, so the document order stays the reading order; `useTabBridge` carries Tab
|
|
13
|
+
// from the open trigger into the panel and on to whatever follows the trigger.
|
|
14
|
+
import { getContext, setContext, tick, untrack } from 'svelte';
|
|
15
|
+
import { on } from 'svelte/events';
|
|
16
|
+
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
17
|
+
import { useTheme } from '../Theme/theme.state.svelte.js';
|
|
18
|
+
import { easingBezierStrings, easingFunctions } from '../../transitions/easingFunctions.js';
|
|
19
|
+
import { createOpenChangeDetails } from '../../utils/openChange.js';
|
|
20
|
+
import { useOpenLifecycle } from '../../utils/openLifecycle.svelte.js';
|
|
21
|
+
import { useSafeArea } from '../../utils/safeArea.svelte.js';
|
|
22
|
+
import { useTabBridge } from '../../utils/useTabBridge.svelte.js';
|
|
23
|
+
import { useDirection } from '../../utils/useDirection.svelte.js';
|
|
24
|
+
import { hasShortcutModifier } from '../../utils/useKeyDown.svelte.js';
|
|
25
|
+
import { composedContains, getDeepActiveElement, getTabbableAfter, getTabbableElements, isTextField } from '../../utils/focus.js';
|
|
26
|
+
import { useNavigationMenuMotion } from './navigationMenu.theme.js';
|
|
27
|
+
/** Space in px kept between the panel area and the edges of the layout viewport. */
|
|
28
|
+
const COLLISION_PADDING = 8;
|
|
29
|
+
/** Distance in px a panel travels when it replaces another (in) or is replaced (out). */
|
|
30
|
+
const SWITCH_DISTANCE = 24;
|
|
31
|
+
/** How long a panel switch counts as under way: the window in which size and slide animations run. */
|
|
32
|
+
const SWITCH_WINDOW = 300;
|
|
33
|
+
const FOCUS_VISIBLE = { preventScroll: true, focusVisible: true };
|
|
34
|
+
const ITEM_SELECTOR = '[data-slot="navigation-menu-trigger"], [data-slot="navigation-menu-link"]';
|
|
35
|
+
const isPanel = (item) => item.type === 'panel';
|
|
36
|
+
/** Reasons after which focus that sat inside the panel area goes back to the trigger. */
|
|
37
|
+
const RESTORING_REASONS = new Set(['escape-key', 'item-press', 'close-press']);
|
|
38
|
+
export function useNavigationMenuState(options) {
|
|
39
|
+
const theme = useTheme();
|
|
40
|
+
const resolveMotion = useNavigationMenuMotion();
|
|
41
|
+
const panels = $derived(options.items().filter(isPanel));
|
|
42
|
+
const panelIndex = (value) => value === null ? -1 : panels.findIndex((panel) => panel.value === value);
|
|
43
|
+
// The open panel: the one the value names, as long as it exists and is enabled.
|
|
44
|
+
const activeItem = $derived(panels.find((panel) => panel.value === options.value() && !panel.disabled) ?? null);
|
|
45
|
+
// The open panel's value, compared by value: a parent that rebuilds `items` on every render
|
|
46
|
+
// hands out new objects for the same panel, and that is not a change.
|
|
47
|
+
const activeValue = $derived(activeItem?.value ?? null);
|
|
48
|
+
const isOpen = $derived(activeValue !== null);
|
|
49
|
+
// The panel the area shows. It keeps the last open one through the exit animation, so the
|
|
50
|
+
// popup does not empty itself while it fades out.
|
|
51
|
+
let displayValue = $state(untrack(() => activeValue));
|
|
52
|
+
$effect.pre(() => {
|
|
53
|
+
if (activeValue !== null)
|
|
54
|
+
displayValue = activeValue;
|
|
55
|
+
});
|
|
56
|
+
const triggers = new SvelteMap();
|
|
57
|
+
const panelElements = new SvelteMap();
|
|
58
|
+
const activeTrigger = $derived(displayValue === null ? null : (triggers.get(displayValue) ?? null));
|
|
59
|
+
const activePanel = $derived(displayValue === null ? null : (panelElements.get(displayValue) ?? null));
|
|
60
|
+
/** The nested inline panels that are expanded, keyed by their value. */
|
|
61
|
+
const nestedOpen = new SvelteSet();
|
|
62
|
+
let navElement = $state.raw(null);
|
|
63
|
+
let viewportElement = $state.raw(null);
|
|
64
|
+
let popupElement = $state.raw(null);
|
|
65
|
+
const getDirection = useDirection(() => navElement, () => options.dir());
|
|
66
|
+
// The panel that hovering opened (or switched to) and that nothing has pinned since: it closes
|
|
67
|
+
// when the pointer leaves. A press, the keyboard or code leaves `null`, and the panel then
|
|
68
|
+
// stays until dismissed. Plain fields: read by handlers.
|
|
69
|
+
let hoverValue = null;
|
|
70
|
+
// Set by a request just before it writes the value and consumed by the effect that sees the
|
|
71
|
+
// panel change, so a value the parent assigns by itself never counts as a hover.
|
|
72
|
+
let pendingHover = null;
|
|
73
|
+
let switchedAt = -Infinity;
|
|
74
|
+
let activationDirection = $state(null);
|
|
75
|
+
const now = () => (typeof performance === 'undefined' ? Date.now() : performance.now());
|
|
76
|
+
const isSwitching = () => now() - switchedAt < SWITCH_WINDOW;
|
|
77
|
+
// Notices a panel replacing another (a switch) as opposed to opening from closed. Runs before
|
|
78
|
+
// the DOM update so the panel and size animations that start with it see the flag.
|
|
79
|
+
let previousValue = untrack(() => activeValue);
|
|
80
|
+
$effect.pre(() => {
|
|
81
|
+
const next = activeValue;
|
|
82
|
+
untrack(() => {
|
|
83
|
+
const from = previousValue;
|
|
84
|
+
previousValue = next;
|
|
85
|
+
hoverValue = next !== null && pendingHover === next ? next : null;
|
|
86
|
+
pendingHover = null;
|
|
87
|
+
if (next === null) {
|
|
88
|
+
switchedAt = -Infinity;
|
|
89
|
+
activationDirection = null;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (from === null) {
|
|
93
|
+
switchedAt = -Infinity;
|
|
94
|
+
activationDirection = null;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (from === next)
|
|
98
|
+
return;
|
|
99
|
+
switchedAt = now();
|
|
100
|
+
const later = panelIndex(next) > panelIndex(from);
|
|
101
|
+
const physical = (later ? 'right' : 'left');
|
|
102
|
+
activationDirection =
|
|
103
|
+
getDirection() === 'rtl' ? (physical === 'right' ? 'left' : 'right') : physical;
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
// ---- requesting a change ------------------------------------------------------------
|
|
107
|
+
const insideChildLayer = (node) => !!node &&
|
|
108
|
+
theme.layers.open.some((open) => open !== layer && open.parent === layer && [...open.nodes].some((n) => n.contains(node)));
|
|
109
|
+
/**
|
|
110
|
+
* The one path to a change of the open panel: `onValueChange` runs first and may cancel.
|
|
111
|
+
* Returns whether the change was applied.
|
|
112
|
+
*/
|
|
113
|
+
function requestChange(next, init) {
|
|
114
|
+
const current = options.value();
|
|
115
|
+
if (next === current)
|
|
116
|
+
return false;
|
|
117
|
+
// A panel that is missing or disabled cannot be opened.
|
|
118
|
+
if (next !== null && !panels.some((panel) => panel.value === next && !panel.disabled)) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const details = createOpenChangeDetails(init);
|
|
122
|
+
options.onValueChange()?.({ value: next, details });
|
|
123
|
+
if (details.isCanceled)
|
|
124
|
+
return false;
|
|
125
|
+
const previous = displayValue;
|
|
126
|
+
const doc = navElement?.ownerDocument ?? document;
|
|
127
|
+
const active = getDeepActiveElement(doc);
|
|
128
|
+
// Safari does not focus a link or button on click, so the press target counts as well.
|
|
129
|
+
const target = init.event?.target;
|
|
130
|
+
const focusInside = !!popupElement &&
|
|
131
|
+
((!!active && composedContains(popupElement, active)) ||
|
|
132
|
+
(target instanceof Node && composedContains(popupElement, target)));
|
|
133
|
+
// Safari does not focus a button on click either, so a panel opened by the pointer has
|
|
134
|
+
// focus on the page body: Escape still hands it back to the trigger, since nothing else holds it.
|
|
135
|
+
const focusAdrift = init.reason === 'escape-key' &&
|
|
136
|
+
(!active || active === doc.body || active === doc.documentElement);
|
|
137
|
+
if (next !== null && init.reason === 'trigger-hover') {
|
|
138
|
+
pendingHover = next;
|
|
139
|
+
// A parent that refuses the value leaves the flag unconsumed; it must not outlive this task.
|
|
140
|
+
setTimeout(() => (pendingHover = null));
|
|
141
|
+
}
|
|
142
|
+
options.setValue(next);
|
|
143
|
+
if (next === null) {
|
|
144
|
+
nestedOpen.clear();
|
|
145
|
+
if ((focusInside || focusAdrift) && RESTORING_REASONS.has(init.reason) && previous !== null) {
|
|
146
|
+
const trigger = triggers.get(previous);
|
|
147
|
+
trigger?.focus(details.interaction === 'keyboard' ? FOCUS_VISIBLE : { preventScroll: true });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/** Closes every level of the menu. */
|
|
153
|
+
const close = (init = {}) => requestChange(null, { reason: 'close-press', ...init });
|
|
154
|
+
/** A link press anywhere in the tree closes every level, once. */
|
|
155
|
+
const pressLink = (event) => {
|
|
156
|
+
if (options.value() === null)
|
|
157
|
+
return;
|
|
158
|
+
requestChange(null, { reason: 'item-press', event });
|
|
159
|
+
};
|
|
160
|
+
function pressTrigger(value, event) {
|
|
161
|
+
const trigger = triggers.get(value);
|
|
162
|
+
// Safari does not focus a button on click. Focus it, so Tab, ArrowDown and Escape carry on
|
|
163
|
+
// from the trigger as they do after a click in every other engine.
|
|
164
|
+
if (trigger && event.detail > 0) {
|
|
165
|
+
const active = getDeepActiveElement(trigger.ownerDocument);
|
|
166
|
+
if (active !== trigger) {
|
|
167
|
+
trigger.focus({ preventScroll: true, focusVisible: false });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const current = options.value();
|
|
171
|
+
if (current === value) {
|
|
172
|
+
// A pointer press on a panel that hovering opened turns it into a pressed one; the next
|
|
173
|
+
// press closes it. Enter and Space (a click with no pointer, `detail` 0) toggle as usual.
|
|
174
|
+
if (hoverValue === value && event.detail > 0) {
|
|
175
|
+
hoverValue = null;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
requestChange(null, { reason: 'trigger-press', event, trigger });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
requestChange(value, { reason: 'trigger-press', event, trigger });
|
|
182
|
+
}
|
|
183
|
+
function hoverTrigger(value, event) {
|
|
184
|
+
if (!options.openOnHover())
|
|
185
|
+
return;
|
|
186
|
+
requestChange(value, {
|
|
187
|
+
reason: 'trigger-hover',
|
|
188
|
+
event,
|
|
189
|
+
trigger: triggers.get(value),
|
|
190
|
+
interaction: 'mouse'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// ---- layer: Escape and outside presses -------------------------------------------------
|
|
194
|
+
const layer = theme.layers.register({
|
|
195
|
+
kind: 'popover',
|
|
196
|
+
isOpen: () => isOpen,
|
|
197
|
+
isModal: () => false,
|
|
198
|
+
dismissOnEscape: () => true,
|
|
199
|
+
dismissOnOutside: () => true,
|
|
200
|
+
onDismiss: (request) => requestChange(null, request)
|
|
201
|
+
});
|
|
202
|
+
function handleFocusOut(event) {
|
|
203
|
+
if (!isOpen || !navElement)
|
|
204
|
+
return;
|
|
205
|
+
const next = event.relatedTarget;
|
|
206
|
+
// `null` is focus leaving the window or going to the page body: nothing to follow.
|
|
207
|
+
if (!(next instanceof Node) || navElement.contains(next) || insideChildLayer(next))
|
|
208
|
+
return;
|
|
209
|
+
requestChange(null, { reason: 'focus-out', event, interaction: 'keyboard' });
|
|
210
|
+
}
|
|
211
|
+
// ---- hover: closing --------------------------------------------------------------------
|
|
212
|
+
const isPointerOver = () => !!(activeTrigger?.matches(':hover') || popupElement?.matches(':hover'));
|
|
213
|
+
const safeArea = useSafeArea({
|
|
214
|
+
isActive: () => isOpen && options.openOnHover(),
|
|
215
|
+
callback: (event) => {
|
|
216
|
+
// Only a panel the pointer opened closes when the pointer leaves it.
|
|
217
|
+
if (hoverValue === null || !isOpen)
|
|
218
|
+
return;
|
|
219
|
+
// A trigger the pointer has just entered re-anchors the area; a pause there is no exit.
|
|
220
|
+
if (isPointerOver())
|
|
221
|
+
return;
|
|
222
|
+
// Focus inside the panel means the keyboard took over from the pointer.
|
|
223
|
+
const active = getDeepActiveElement(navElement?.ownerDocument ?? document);
|
|
224
|
+
if (active && popupElement && composedContains(popupElement, active))
|
|
225
|
+
return;
|
|
226
|
+
requestChange(null, { reason: 'trigger-hover', event, interaction: 'mouse' });
|
|
227
|
+
},
|
|
228
|
+
offset: COLLISION_PADDING,
|
|
229
|
+
closeDelay: () => options.closeDelay()
|
|
230
|
+
});
|
|
231
|
+
// ---- Tab order -------------------------------------------------------------------------
|
|
232
|
+
useTabBridge({
|
|
233
|
+
isActive: () => isOpen,
|
|
234
|
+
anchor: () => activeTrigger,
|
|
235
|
+
panel: () => activePanel,
|
|
236
|
+
onLeave: (event) => {
|
|
237
|
+
requestChange(null, { reason: 'focus-out', event, interaction: 'keyboard' });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
// ---- lifecycle and animation -----------------------------------------------------------
|
|
241
|
+
const lifecycle = useOpenLifecycle({
|
|
242
|
+
isOpen: () => isOpen,
|
|
243
|
+
animated: () => popupElement,
|
|
244
|
+
onAfterOpen: () => options.onAfterOpen()?.(),
|
|
245
|
+
onAfterClose: () => options.onAfterClose()?.()
|
|
246
|
+
});
|
|
247
|
+
/** Whether the popup is in the DOM at all. */
|
|
248
|
+
const rendered = $derived(options.keepMounted() || isOpen || lifecycle.status !== 'closed');
|
|
249
|
+
/** Whether the popup shows. A kept-mounted one stays in the DOM under `hidden` when closed. */
|
|
250
|
+
const visible = $derived(isOpen || lifecycle.status === 'exiting');
|
|
251
|
+
let handledOpen = untrack(() => isOpen);
|
|
252
|
+
let exitAnimation = null;
|
|
253
|
+
const playPopup = (element, direction) => {
|
|
254
|
+
const spec = resolveMotion(undefined, {
|
|
255
|
+
motion: options.motion(),
|
|
256
|
+
transition: options.transition()
|
|
257
|
+
})[direction];
|
|
258
|
+
const duration = spec.duration ?? 0;
|
|
259
|
+
if (!duration || typeof element.animate !== 'function')
|
|
260
|
+
return null;
|
|
261
|
+
const hiddenFrame = {
|
|
262
|
+
opacity: spec.opacity ?? 0,
|
|
263
|
+
transform: `translate(${typeof spec.x === 'number' ? spec.x : 0}px, ${typeof spec.y === 'number' ? spec.y : 0}px) scale(${spec.scale ?? 1})`
|
|
264
|
+
};
|
|
265
|
+
const shownFrame = { opacity: 1, transform: 'translate(0px, 0px) scale(1)' };
|
|
266
|
+
return element.animate(direction === 'in' ? [hiddenFrame, shownFrame] : [shownFrame, hiddenFrame], {
|
|
267
|
+
duration,
|
|
268
|
+
easing: easingBezierStrings[spec.easing ?? 'cubicOut'],
|
|
269
|
+
fill: direction === 'out' ? 'forwards' : 'none'
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
$effect(() => {
|
|
273
|
+
const open = isOpen;
|
|
274
|
+
const element = popupElement;
|
|
275
|
+
untrack(() => {
|
|
276
|
+
// No popup to animate yet: a mounting popup runs this again once it exists.
|
|
277
|
+
if (!element || open === handledOpen)
|
|
278
|
+
return;
|
|
279
|
+
handledOpen = open;
|
|
280
|
+
exitAnimation?.cancel();
|
|
281
|
+
exitAnimation = playPopup(element, open ? 'in' : 'out');
|
|
282
|
+
if (open)
|
|
283
|
+
exitAnimation = null;
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
/** Slides a panel in from the side of the trigger that was open before it. */
|
|
287
|
+
// A switch is staged like a cross-slide: the old panel leaves first (`panelOut`, the motion's
|
|
288
|
+
// out duration), then the new one slides in over twice the in duration while the popup is still
|
|
289
|
+
// resizing, so each step can be seen. It waits invisible (`fill: backwards`) until its turn.
|
|
290
|
+
const animatePanel = (element) => {
|
|
291
|
+
if (!isSwitching() || activationDirection === null)
|
|
292
|
+
return;
|
|
293
|
+
const resolved = resolveMotion(undefined, {
|
|
294
|
+
motion: options.motion(),
|
|
295
|
+
transition: options.transition()
|
|
296
|
+
});
|
|
297
|
+
const duration = (resolved.in.duration ?? 0) * 2;
|
|
298
|
+
if (!duration || typeof element.animate !== 'function')
|
|
299
|
+
return;
|
|
300
|
+
const from = activationDirection === 'right' ? SWITCH_DISTANCE : -SWITCH_DISTANCE;
|
|
301
|
+
return element.animate([
|
|
302
|
+
{ opacity: 0, transform: `translateX(${from}px)` },
|
|
303
|
+
{ opacity: 1, transform: 'translateX(0px)' }
|
|
304
|
+
], {
|
|
305
|
+
duration,
|
|
306
|
+
delay: resolved.out.duration ?? 0,
|
|
307
|
+
fill: 'backwards',
|
|
308
|
+
easing: easingBezierStrings[resolved.in.easing ?? 'cubicOut']
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
/**
|
|
312
|
+
* The outgoing panel of a switch: it leaves toward the side away from the new trigger while the
|
|
313
|
+
* new one slides in from the other side. It is taken out of the layout first, at the place and
|
|
314
|
+
* width it occupied, so only the incoming panel sizes the popup. Closing the menu does not run
|
|
315
|
+
* it (the panel stays until the popup is gone), and neither does a panel kept mounted.
|
|
316
|
+
*/
|
|
317
|
+
const panelOut = (element) => {
|
|
318
|
+
// Runs as the old panel leaves the DOM, before the effect that records the switch, so the
|
|
319
|
+
// direction comes from the panels themselves: where the leaving one sits relative to the new.
|
|
320
|
+
const next = activeValue;
|
|
321
|
+
const leaving = [...panelElements].find(([, panel]) => panel === element)?.[0];
|
|
322
|
+
if (next === null || leaving === undefined || leaving === next)
|
|
323
|
+
return { duration: 0 };
|
|
324
|
+
const later = panelIndex(next) > panelIndex(leaving);
|
|
325
|
+
const physical = later ? 'right' : 'left';
|
|
326
|
+
const toward = getDirection() === 'rtl' ? (physical === 'right' ? 'left' : 'right') : physical;
|
|
327
|
+
const spec = resolveMotion(undefined, {
|
|
328
|
+
motion: options.motion(),
|
|
329
|
+
transition: options.transition()
|
|
330
|
+
}).out;
|
|
331
|
+
const duration = spec.duration ?? 0;
|
|
332
|
+
if (!duration)
|
|
333
|
+
return { duration: 0 };
|
|
334
|
+
const to = toward === 'right' ? -SWITCH_DISTANCE : SWITCH_DISTANCE;
|
|
335
|
+
const { offsetTop, offsetLeft, offsetWidth } = element;
|
|
336
|
+
element.style.position = 'absolute';
|
|
337
|
+
element.style.top = `${offsetTop}px`;
|
|
338
|
+
element.style.left = `${offsetLeft}px`;
|
|
339
|
+
element.style.width = `${offsetWidth}px`;
|
|
340
|
+
element.style.pointerEvents = 'none';
|
|
341
|
+
const easing = easingFunctions[spec.easing ?? 'cubicOut'] ?? easingFunctions.cubicOut;
|
|
342
|
+
return {
|
|
343
|
+
duration,
|
|
344
|
+
easing,
|
|
345
|
+
css: (t) => `opacity: ${t}; transform: translateX(${(1 - t) * to}px);`
|
|
346
|
+
};
|
|
347
|
+
};
|
|
348
|
+
// ---- placement -------------------------------------------------------------------------
|
|
349
|
+
// The popup lines up with the active trigger's inline edge and is clamped to the layout
|
|
350
|
+
// viewport (pinch-zoom does not move it). The clamp is done in CSS from these px values, so
|
|
351
|
+
// it holds while the popup animates its size.
|
|
352
|
+
$effect(() => {
|
|
353
|
+
const nav = navElement;
|
|
354
|
+
const trigger = activeTrigger;
|
|
355
|
+
const viewport = viewportElement;
|
|
356
|
+
if (!nav || !trigger || !viewport || !visible)
|
|
357
|
+
return;
|
|
358
|
+
const place = () => {
|
|
359
|
+
const navRect = nav.getBoundingClientRect();
|
|
360
|
+
const rect = trigger.getBoundingClientRect();
|
|
361
|
+
const left = navRect.left + nav.clientLeft;
|
|
362
|
+
const top = navRect.top + nav.clientTop;
|
|
363
|
+
const width = nav.ownerDocument.documentElement.clientWidth;
|
|
364
|
+
const style = viewport.style;
|
|
365
|
+
style.setProperty('--navigation-menu-anchor-start', `${rect.left - left}px`);
|
|
366
|
+
style.setProperty('--navigation-menu-anchor-end', `${rect.right - left}px`);
|
|
367
|
+
style.setProperty('--navigation-menu-anchor-bottom', `${rect.bottom - top}px`);
|
|
368
|
+
style.setProperty('--navigation-menu-min-x', `${COLLISION_PADDING - left}px`);
|
|
369
|
+
style.setProperty('--navigation-menu-max-x', `${width - COLLISION_PADDING - left}px`);
|
|
370
|
+
style.setProperty('--anchor-width', `${rect.width}px`);
|
|
371
|
+
style.setProperty('--anchor-height', `${rect.height}px`);
|
|
372
|
+
};
|
|
373
|
+
place();
|
|
374
|
+
const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(place);
|
|
375
|
+
observer?.observe(nav);
|
|
376
|
+
observer?.observe(trigger);
|
|
377
|
+
const offResize = on(nav.ownerDocument.defaultView ?? window, 'resize', place);
|
|
378
|
+
return () => {
|
|
379
|
+
observer?.disconnect();
|
|
380
|
+
offResize();
|
|
381
|
+
};
|
|
382
|
+
});
|
|
383
|
+
// ---- value that disappears --------------------------------------------------------------
|
|
384
|
+
// The open panel was removed or disabled: the menu cannot stay open on nothing.
|
|
385
|
+
$effect(() => {
|
|
386
|
+
const current = options.value();
|
|
387
|
+
const enabled = panels.some((panel) => panel.value === current && !panel.disabled);
|
|
388
|
+
if (current === null || enabled)
|
|
389
|
+
return;
|
|
390
|
+
untrack(() => {
|
|
391
|
+
// Not cancelable: there is nothing left to keep.
|
|
392
|
+
requestChange(null, { reason: 'trigger-unmount', cancelable: false });
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
// ---- keyboard --------------------------------------------------------------------------
|
|
396
|
+
function enabledItems(list) {
|
|
397
|
+
return Array.from(list.querySelectorAll(ITEM_SELECTOR)).filter((element) => !element.matches(':disabled') && element.getAttribute('aria-disabled') !== 'true');
|
|
398
|
+
}
|
|
399
|
+
/** The step an arrow key takes along a line of items, mirrored in right-to-left. */
|
|
400
|
+
function arrowStep(key, vertical) {
|
|
401
|
+
const rtl = getDirection() === 'rtl';
|
|
402
|
+
if (key === 'ArrowRight')
|
|
403
|
+
return rtl ? -1 : 1;
|
|
404
|
+
if (key === 'ArrowLeft')
|
|
405
|
+
return rtl ? 1 : -1;
|
|
406
|
+
if (vertical && key === 'ArrowDown')
|
|
407
|
+
return 1;
|
|
408
|
+
if (vertical && key === 'ArrowUp')
|
|
409
|
+
return -1;
|
|
410
|
+
return 0;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Tab from an entry of the bar that is not the open trigger, where the next stop in the page is
|
|
414
|
+
* the panel area (it follows the list in the document): the panel belongs to its trigger, so
|
|
415
|
+
* focus skips it and goes on after the menu. Without this, focus would wander through a panel
|
|
416
|
+
* that is not this entry's and then jump back to the entry after the open trigger.
|
|
417
|
+
*/
|
|
418
|
+
function skipForeignPanel(event, current) {
|
|
419
|
+
const viewport = viewportElement;
|
|
420
|
+
if (!isOpen || event.shiftKey || !viewport || current === activeTrigger)
|
|
421
|
+
return;
|
|
422
|
+
const next = getTabbableAfter(current);
|
|
423
|
+
if (!next || !composedContains(viewport, next))
|
|
424
|
+
return;
|
|
425
|
+
const after = getTabbableAfter(current, { exclude: viewport });
|
|
426
|
+
if (!after)
|
|
427
|
+
return;
|
|
428
|
+
event.preventDefault();
|
|
429
|
+
after.focus(FOCUS_VISIBLE);
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Arrow keys, Home and End move between the bar's triggers and links; Tab still visits each.
|
|
433
|
+
* While a panel is open the open panel follows focus: a trigger switches to its panel (focus
|
|
434
|
+
* stays on the trigger) and a link closes it. With no panel open they only move focus.
|
|
435
|
+
*/
|
|
436
|
+
let listElement = null;
|
|
437
|
+
const list = (node) => {
|
|
438
|
+
listElement = node;
|
|
439
|
+
const off = on(node, 'keydown', (event) => {
|
|
440
|
+
if (event.defaultPrevented)
|
|
441
|
+
return;
|
|
442
|
+
const current = event.target.closest(ITEM_SELECTOR);
|
|
443
|
+
if (!current || !node.contains(current))
|
|
444
|
+
return;
|
|
445
|
+
if (event.key === 'Tab') {
|
|
446
|
+
if (!event.ctrlKey && !event.metaKey)
|
|
447
|
+
skipForeignPanel(event, current);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
if (hasShortcutModifier(event))
|
|
451
|
+
return;
|
|
452
|
+
const step = arrowStep(event.key, false);
|
|
453
|
+
const edge = event.key === 'Home' ? 'first' : event.key === 'End' ? 'last' : null;
|
|
454
|
+
if (!step && !edge)
|
|
455
|
+
return;
|
|
456
|
+
const items = enabledItems(node);
|
|
457
|
+
const index = items.indexOf(current);
|
|
458
|
+
if (index === -1)
|
|
459
|
+
return;
|
|
460
|
+
const target = edge === 'first' ? items[0] : edge === 'last' ? items.at(-1) : items[index + step];
|
|
461
|
+
event.preventDefault();
|
|
462
|
+
if (!target || target === current)
|
|
463
|
+
return;
|
|
464
|
+
if (isOpen)
|
|
465
|
+
followFocusWithPanel(event, target);
|
|
466
|
+
target.focus(FOCUS_VISIBLE);
|
|
467
|
+
});
|
|
468
|
+
return () => {
|
|
469
|
+
off();
|
|
470
|
+
if (listElement === node)
|
|
471
|
+
listElement = null;
|
|
472
|
+
};
|
|
473
|
+
};
|
|
474
|
+
function followFocusWithPanel(event, target) {
|
|
475
|
+
const value = [...triggers].find(([, element]) => element === target)?.[0];
|
|
476
|
+
if (value === undefined) {
|
|
477
|
+
requestChange(null, { reason: 'list-navigation', event, interaction: 'keyboard' });
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
requestChange(value, {
|
|
481
|
+
reason: 'list-navigation',
|
|
482
|
+
event,
|
|
483
|
+
trigger: target,
|
|
484
|
+
interaction: 'keyboard'
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
/** Whether the arrow keys belong to the control itself: it edits text or picks an option. */
|
|
488
|
+
const ownsArrowKeys = (element) => isTextField(element) || element.matches('select');
|
|
489
|
+
/**
|
|
490
|
+
* From inside the open panel, the inline arrows go to the neighbouring entry of the bar, as in
|
|
491
|
+
* a menubar: a trigger opens its panel and focus lands on that panel's first control (so the
|
|
492
|
+
* arrows keep walking across menus); a link closes the panel and takes focus. The bar's ends do
|
|
493
|
+
* not wrap.
|
|
494
|
+
*/
|
|
495
|
+
function moveToAdjacentEntry(event, step) {
|
|
496
|
+
const bar = listElement;
|
|
497
|
+
const current = activeTrigger;
|
|
498
|
+
if (!bar || !current)
|
|
499
|
+
return;
|
|
500
|
+
event.preventDefault();
|
|
501
|
+
const items = enabledItems(bar);
|
|
502
|
+
const target = items[items.indexOf(current) + step];
|
|
503
|
+
if (!target)
|
|
504
|
+
return;
|
|
505
|
+
const value = [...triggers].find(([, element]) => element === target)?.[0];
|
|
506
|
+
if (value === undefined) {
|
|
507
|
+
if (requestChange(null, { reason: 'list-navigation', event, interaction: 'keyboard' }))
|
|
508
|
+
target.focus(FOCUS_VISIBLE);
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
const opened = requestChange(value, {
|
|
512
|
+
reason: 'list-navigation',
|
|
513
|
+
event,
|
|
514
|
+
trigger: target,
|
|
515
|
+
interaction: 'keyboard'
|
|
516
|
+
});
|
|
517
|
+
if (!opened)
|
|
518
|
+
return;
|
|
519
|
+
void tick().then(() => {
|
|
520
|
+
const first = activePanel ? getTabbableElements(activePanel)[0] : undefined;
|
|
521
|
+
(first ?? target).focus(FOCUS_VISIBLE);
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Inside the open panel, ArrowDown and ArrowUp move between its links and buttons (wrapping at
|
|
526
|
+
* either end), the inline arrows move to the neighbouring menu of the bar (see
|
|
527
|
+
* `moveToAdjacentEntry`), and Home and End jump to the first and last. Disabled links and collapsed nested
|
|
528
|
+
* levels are not tab stops, so they are skipped. A text field keeps its arrow keys, and a
|
|
529
|
+
* control that handles them itself (it calls `preventDefault()`) wins.
|
|
530
|
+
*/
|
|
531
|
+
function panelKeydown(event) {
|
|
532
|
+
if (event.defaultPrevented)
|
|
533
|
+
return;
|
|
534
|
+
const panel = activePanel;
|
|
535
|
+
const target = event.target;
|
|
536
|
+
if (!isOpen || !panel || !(target instanceof HTMLElement))
|
|
537
|
+
return;
|
|
538
|
+
if (!composedContains(panel, target))
|
|
539
|
+
return;
|
|
540
|
+
if (event.key === 'Tab') {
|
|
541
|
+
leaveAtPageEnd(event, panel, target);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
if (hasShortcutModifier(event) || ownsArrowKeys(target))
|
|
545
|
+
return;
|
|
546
|
+
if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
|
|
547
|
+
moveToAdjacentEntry(event, arrowStep(event.key, false));
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
const step = arrowStep(event.key, true);
|
|
551
|
+
const edge = event.key === 'Home' ? 'first' : event.key === 'End' ? 'last' : null;
|
|
552
|
+
if (!step && !edge)
|
|
553
|
+
return;
|
|
554
|
+
const items = getTabbableElements(panel).filter((element) => !ownsArrowKeys(element));
|
|
555
|
+
const index = items.indexOf(target);
|
|
556
|
+
if (index === -1 || items.length === 0)
|
|
557
|
+
return;
|
|
558
|
+
const next = edge === 'first'
|
|
559
|
+
? items[0]
|
|
560
|
+
: edge === 'last'
|
|
561
|
+
? items[items.length - 1]
|
|
562
|
+
: items[(index + step + items.length) % items.length];
|
|
563
|
+
event.preventDefault();
|
|
564
|
+
if (next !== target)
|
|
565
|
+
next.focus(FOCUS_VISIBLE);
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Tab past the panel's last control when nothing in the page follows the trigger: the Tab
|
|
569
|
+
* bridge leaves the key to the engine, which moves focus out of the page, and the panel closes
|
|
570
|
+
* as it does when Tab moves on to anything else.
|
|
571
|
+
*/
|
|
572
|
+
function leaveAtPageEnd(event, panel, target) {
|
|
573
|
+
const anchor = activeTrigger;
|
|
574
|
+
if (event.shiftKey || event.ctrlKey || event.metaKey || !anchor)
|
|
575
|
+
return;
|
|
576
|
+
if (getTabbableElements(panel).at(-1) !== target)
|
|
577
|
+
return;
|
|
578
|
+
if (getTabbableAfter(anchor, { exclude: viewportElement }))
|
|
579
|
+
return;
|
|
580
|
+
requestChange(null, { reason: 'focus-out', event, interaction: 'keyboard' });
|
|
581
|
+
}
|
|
582
|
+
function triggerKeydown(value, event) {
|
|
583
|
+
if (event.defaultPrevented || event.key !== 'ArrowDown' || hasShortcutModifier(event))
|
|
584
|
+
return;
|
|
585
|
+
event.preventDefault();
|
|
586
|
+
if (options.value() === value) {
|
|
587
|
+
// Already open: move into it.
|
|
588
|
+
const first = activePanel ? getTabbableElements(activePanel)[0] : undefined;
|
|
589
|
+
first?.focus(FOCUS_VISIBLE);
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
// Opening keeps focus on the trigger; Tab or ArrowDown again enters the panel.
|
|
593
|
+
requestChange(value, {
|
|
594
|
+
reason: 'list-navigation',
|
|
595
|
+
event,
|
|
596
|
+
trigger: triggers.get(value),
|
|
597
|
+
interaction: 'keyboard'
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
// ---- attachments -----------------------------------------------------------------------
|
|
601
|
+
const root = (node) => {
|
|
602
|
+
navElement = node;
|
|
603
|
+
const offLayer = layer.node(node);
|
|
604
|
+
return () => {
|
|
605
|
+
offLayer();
|
|
606
|
+
if (navElement === node)
|
|
607
|
+
navElement = null;
|
|
608
|
+
};
|
|
609
|
+
};
|
|
610
|
+
const trigger = (value) => (node) => untrack(() => {
|
|
611
|
+
triggers.set(value, node);
|
|
612
|
+
const offKeydown = on(node, 'keydown', (event) => triggerKeydown(value, event));
|
|
613
|
+
return () => {
|
|
614
|
+
offKeydown();
|
|
615
|
+
if (triggers.get(value) === node)
|
|
616
|
+
triggers.delete(value);
|
|
617
|
+
};
|
|
618
|
+
});
|
|
619
|
+
const viewport = (node) => untrack(() => {
|
|
620
|
+
viewportElement = node;
|
|
621
|
+
const offSafeArea = safeArea.floatingReference(node);
|
|
622
|
+
return () => {
|
|
623
|
+
offSafeArea();
|
|
624
|
+
if (viewportElement === node)
|
|
625
|
+
viewportElement = null;
|
|
626
|
+
};
|
|
627
|
+
});
|
|
628
|
+
const popup = (node) => untrack(() => {
|
|
629
|
+
popupElement = node;
|
|
630
|
+
const offKeydown = on(node, 'keydown', panelKeydown);
|
|
631
|
+
return () => {
|
|
632
|
+
offKeydown();
|
|
633
|
+
if (popupElement === node)
|
|
634
|
+
popupElement = null;
|
|
635
|
+
};
|
|
636
|
+
});
|
|
637
|
+
const panel = (value) => (node) => {
|
|
638
|
+
untrack(() => panelElements.set(value, node));
|
|
639
|
+
// Reads the state it animates for: a kept-mounted panel runs again when it becomes active.
|
|
640
|
+
const active = displayValue === value && isOpen;
|
|
641
|
+
const animation = active ? untrack(() => animatePanel(node)) : undefined;
|
|
642
|
+
return () => {
|
|
643
|
+
animation?.cancel();
|
|
644
|
+
untrack(() => {
|
|
645
|
+
if (panelElements.get(value) === node)
|
|
646
|
+
panelElements.delete(value);
|
|
647
|
+
});
|
|
648
|
+
};
|
|
649
|
+
};
|
|
650
|
+
return {
|
|
651
|
+
get panels() {
|
|
652
|
+
return panels;
|
|
653
|
+
},
|
|
654
|
+
get isOpen() {
|
|
655
|
+
return isOpen;
|
|
656
|
+
},
|
|
657
|
+
get value() {
|
|
658
|
+
return activeValue;
|
|
659
|
+
},
|
|
660
|
+
get displayValue() {
|
|
661
|
+
return displayValue;
|
|
662
|
+
},
|
|
663
|
+
get displayItem() {
|
|
664
|
+
return panels.find((panel) => panel.value === displayValue) ?? null;
|
|
665
|
+
},
|
|
666
|
+
get rendered() {
|
|
667
|
+
return rendered;
|
|
668
|
+
},
|
|
669
|
+
get visible() {
|
|
670
|
+
return visible;
|
|
671
|
+
},
|
|
672
|
+
get status() {
|
|
673
|
+
return lifecycle.status;
|
|
674
|
+
},
|
|
675
|
+
get activationDirection() {
|
|
676
|
+
return activationDirection;
|
|
677
|
+
},
|
|
678
|
+
get direction() {
|
|
679
|
+
return getDirection();
|
|
680
|
+
},
|
|
681
|
+
get openOnHover() {
|
|
682
|
+
return options.openOnHover();
|
|
683
|
+
},
|
|
684
|
+
get keepMounted() {
|
|
685
|
+
return options.keepMounted();
|
|
686
|
+
},
|
|
687
|
+
get delay() {
|
|
688
|
+
return options.delay();
|
|
689
|
+
},
|
|
690
|
+
isSwitching,
|
|
691
|
+
panelOut,
|
|
692
|
+
panelIndex,
|
|
693
|
+
triggerId: (value) => `${options.id}-trigger-${panelIndex(value)}`,
|
|
694
|
+
panelId: (value) => `${options.id}-panel-${panelIndex(value)}`,
|
|
695
|
+
/** Whether the panel for `value` has its element in the DOM now. */
|
|
696
|
+
hasPanel: (value) => panelElements.has(value),
|
|
697
|
+
isOpenFor: (value) => activeValue === value,
|
|
698
|
+
safeArea,
|
|
699
|
+
nestedOpen,
|
|
700
|
+
close,
|
|
701
|
+
pressLink,
|
|
702
|
+
pressTrigger,
|
|
703
|
+
hoverTrigger,
|
|
704
|
+
handleFocusOut,
|
|
705
|
+
layer,
|
|
706
|
+
root,
|
|
707
|
+
list,
|
|
708
|
+
trigger,
|
|
709
|
+
viewport,
|
|
710
|
+
popup,
|
|
711
|
+
panel
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
const CONTEXT = Symbol('entasis:navigation-menu');
|
|
715
|
+
export function setNavigationMenuState(state) {
|
|
716
|
+
setContext(CONTEXT, state);
|
|
717
|
+
return state;
|
|
718
|
+
}
|
|
719
|
+
export function getNavigationMenuState() {
|
|
720
|
+
return getContext(CONTEXT);
|
|
721
|
+
}
|