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
|
@@ -54,7 +54,12 @@ export declare const popoverTheme: {
|
|
|
54
54
|
inline: string;
|
|
55
55
|
mobileSheet: string;
|
|
56
56
|
};
|
|
57
|
+
arrow: {
|
|
58
|
+
true: string;
|
|
59
|
+
false: string;
|
|
60
|
+
};
|
|
57
61
|
}> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
|
|
62
|
+
arrow: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
|
|
58
63
|
};
|
|
59
64
|
export type PopoverTheme = typeof popoverTheme;
|
|
60
65
|
export type PopoverThemeProps = InferComponentTheme<PopoverTheme>;
|
|
@@ -95,7 +100,12 @@ export declare const setPopoverTheme: (theme: InferComponentTheme<{
|
|
|
95
100
|
inline: string;
|
|
96
101
|
mobileSheet: string;
|
|
97
102
|
};
|
|
103
|
+
arrow: {
|
|
104
|
+
true: string;
|
|
105
|
+
false: string;
|
|
106
|
+
};
|
|
98
107
|
}> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
|
|
108
|
+
arrow: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
|
|
99
109
|
}>) => void;
|
|
100
110
|
export declare const usePopoverTheme: import("../../utils/cva/theme.js").UseComponentTheme<{
|
|
101
111
|
motion: import("../../utils/motion/index.js").MotionResolver<{
|
|
@@ -134,7 +144,12 @@ export declare const usePopoverTheme: import("../../utils/cva/theme.js").UseComp
|
|
|
134
144
|
inline: string;
|
|
135
145
|
mobileSheet: string;
|
|
136
146
|
};
|
|
147
|
+
arrow: {
|
|
148
|
+
true: string;
|
|
149
|
+
false: string;
|
|
150
|
+
};
|
|
137
151
|
}> & import("../../utils/cva/types.js").CVAClassProp) | undefined) => string;
|
|
152
|
+
arrow: (props?: import("../../utils/cva/types.js").CVAClassProp | undefined) => string;
|
|
138
153
|
}>;
|
|
139
154
|
export declare const usePopoverMotion: () => import("../../utils/motion/index.js").ComponentMotion<{
|
|
140
155
|
readonly mode: {
|
|
@@ -37,12 +37,36 @@ const defaultPopover = cva({
|
|
|
37
37
|
// Same visuals as `floating` — only the positioning of the wrapper differs.
|
|
38
38
|
inline: '',
|
|
39
39
|
mobileSheet: 'max-h-[85dvh] w-full max-w-none overflow-auto rounded-b-none rounded-t-xl pb-[calc(env(safe-area-inset-bottom)+1rem)]'
|
|
40
|
+
},
|
|
41
|
+
// The arrow is placed against the panel's box.
|
|
42
|
+
arrow: {
|
|
43
|
+
true: 'relative',
|
|
44
|
+
false: ''
|
|
40
45
|
}
|
|
41
46
|
},
|
|
42
47
|
defaultVariants: {
|
|
43
|
-
mode: 'floating'
|
|
48
|
+
mode: 'floating',
|
|
49
|
+
arrow: false
|
|
44
50
|
}
|
|
45
51
|
});
|
|
52
|
+
// The arrow is a rotated square the panel's colour, half of it poking out of the edge that faces
|
|
53
|
+
// the trigger. It sits behind the panel's content (`-z-10` inside the panel's own stacking
|
|
54
|
+
// context) but above the panel's own border, so the half inside the panel hides the border
|
|
55
|
+
// beneath it and the half outside carries the edge on its two outer sides: the corner that
|
|
56
|
+
// points at the trigger is the top-left one before the 45° turn when the panel is below it, the
|
|
57
|
+
// bottom-right one when above, and so on. Its position along the edge and its edge offset are
|
|
58
|
+
// written by the placement, with the side as `data-side`.
|
|
59
|
+
const defaultPopoverArrow = cva({
|
|
60
|
+
base: [
|
|
61
|
+
// The panel's elevation lightens its surface in dark mode with an inset tint (`raised-3`); the
|
|
62
|
+
// arrow paints the same tint, without the drop shadow, or it reads darker than the panel.
|
|
63
|
+
'bg-surface-floating pointer-events-none absolute -z-10 size-2.5 rotate-45 rounded-xs border border-transparent bg-clip-padding shadow-[inset_0_0_0_9999px_var(--elevation-tint-3)]',
|
|
64
|
+
'data-[side=bottom]:border-t-neutral-muted data-[side=bottom]:border-l-neutral-muted',
|
|
65
|
+
'data-[side=top]:border-r-neutral-muted data-[side=top]:border-b-neutral-muted',
|
|
66
|
+
'data-[side=right]:border-b-neutral-muted data-[side=right]:border-l-neutral-muted',
|
|
67
|
+
'data-[side=left]:border-t-neutral-muted data-[side=left]:border-r-neutral-muted'
|
|
68
|
+
].join(' ')
|
|
69
|
+
});
|
|
46
70
|
// A floating panel scales in place; the mobile sheet slides up from the bottom edge.
|
|
47
71
|
// `duration` / `easing` stay tokens, so `<Theme motion>` and reduced motion reach both.
|
|
48
72
|
export const defaultPopoverMotion = motion({
|
|
@@ -68,7 +92,8 @@ export const defaultPopoverMotion = motion({
|
|
|
68
92
|
export const popoverTheme = {
|
|
69
93
|
motion: defaultPopoverMotion,
|
|
70
94
|
root: defaultPopoverContainer,
|
|
71
|
-
popover: defaultPopover
|
|
95
|
+
popover: defaultPopover,
|
|
96
|
+
arrow: defaultPopoverArrow
|
|
72
97
|
};
|
|
73
98
|
export const setPopoverTheme = setComponentTheme('popover');
|
|
74
99
|
export const usePopoverTheme = useComponentTheme('popover', popoverTheme);
|
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
closeMenuTree,
|
|
4
|
+
providePopupMenuLevel,
|
|
5
|
+
providePopupMenuPanelSize,
|
|
6
|
+
providePopupMenuRoot,
|
|
7
|
+
type PopupMenuRoot
|
|
8
|
+
} from './popupMenu.context.js';
|
|
3
9
|
import { createBindableValue } from '../../utils/state.svelte.js';
|
|
4
10
|
import Popover from '../Popover/Popover.svelte';
|
|
5
11
|
import Menu from '../Menu/Menu.svelte';
|
|
6
|
-
import type {
|
|
12
|
+
import type { PopupMenuInternalProps } from './popupMenu.props.js';
|
|
7
13
|
import { usePopupMenuTheme } from './popupMenu.theme.js';
|
|
14
|
+
import { untrack, type Snippet } from 'svelte';
|
|
15
|
+
import { createAttachmentKey } from 'svelte/attachments';
|
|
8
16
|
import { on } from 'svelte/events';
|
|
9
|
-
import type
|
|
17
|
+
import { popoverInternals, type PopoverState } from '../Popover/popover.state.svelte.js';
|
|
18
|
+
import type { PopoverApi } from '../Popover/popover.api.js';
|
|
10
19
|
import { hasSubmenuItems } from '../Menu/menuTree.js';
|
|
20
|
+
import { createOpenChangeDetails, type OpenChangeDetails } from '../../utils/openChange.js';
|
|
21
|
+
import { getTabbableElements } from '../../utils/focus.js';
|
|
22
|
+
import { hasShortcutModifier } from '../../utils/useKeyDown.svelte.js';
|
|
23
|
+
import { triggerFocusTarget } from '../../utils/trigger.js';
|
|
11
24
|
|
|
12
25
|
let {
|
|
13
26
|
menu,
|
|
@@ -21,8 +34,12 @@
|
|
|
21
34
|
class: className,
|
|
22
35
|
theme,
|
|
23
36
|
size = 'small',
|
|
37
|
+
submenuOf,
|
|
38
|
+
isSubmenu = false,
|
|
39
|
+
nativeMenu = true,
|
|
40
|
+
trigger,
|
|
24
41
|
...popoverProps
|
|
25
|
-
}:
|
|
42
|
+
}: PopupMenuInternalProps = $props();
|
|
26
43
|
const classes = $derived(usePopupMenuTheme(theme));
|
|
27
44
|
// Submenus rendered by the Menu below open in a panel of this same size.
|
|
28
45
|
providePopupMenuPanelSize(() => size);
|
|
@@ -47,32 +64,183 @@
|
|
|
47
64
|
usesStackedSubmenus ? false : mobileSheetSizeTransition
|
|
48
65
|
);
|
|
49
66
|
|
|
50
|
-
|
|
67
|
+
// The Popover's `onOpenChange`: the details (reason, event, `cancel()`) pass through, so a
|
|
68
|
+
// consumer that cancels keeps the menu as it is.
|
|
69
|
+
const setOpen = (nextOpen: boolean, details: OpenChangeDetails) => {
|
|
51
70
|
if (openState.value === nextOpen) return;
|
|
71
|
+
onOpenChange?.(nextOpen, details);
|
|
72
|
+
if (details.isCanceled) return;
|
|
73
|
+
if (!nextOpen) arrowOpen = null;
|
|
52
74
|
openState.value = nextOpen;
|
|
53
|
-
onOpenChange?.(nextOpen);
|
|
54
75
|
};
|
|
55
76
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
// The popover this PopupMenu renders and its Menu element, known once the menu mounts.
|
|
78
|
+
let popoverState: PopoverState | null = null;
|
|
79
|
+
let menuElement: HTMLElement | null = null;
|
|
80
|
+
// Where focus goes when the tree closes, chosen as the root panel's focus scope chooses: the
|
|
81
|
+
// trigger, else the element that had focus when the menu opened (a context menu's target).
|
|
82
|
+
let opener: HTMLElement | null = null;
|
|
83
|
+
// A submenu MenuFloating renders joins the tree it opens from: that root's `closeOnItemClick`
|
|
84
|
+
// decides for every level, and an item press anywhere closes the whole tree once. Every other
|
|
85
|
+
// PopupMenu, one nested in a menu's header, footer or trigger included, roots its own tree.
|
|
86
|
+
// Membership is settled when the menu mounts.
|
|
87
|
+
const tree = untrack(() => submenuOf);
|
|
88
|
+
providePopupMenuLevel(untrack(() => !!submenuOf || isSubmenu));
|
|
67
89
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
90
|
+
/** Where focus goes when the tree is left by keyboard: the root trigger, else the opener. */
|
|
91
|
+
const leaveTarget = (): HTMLElement | null => {
|
|
92
|
+
const anchor = popoverState?.triggerReference;
|
|
93
|
+
const trigger = anchor?.isConnected ? triggerFocusTarget(anchor) : null;
|
|
94
|
+
return trigger ?? (opener?.isConnected ? opener : null);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const root: PopupMenuRoot = tree ?? {
|
|
98
|
+
closeOnItemClick: () => closeOnItemClick,
|
|
99
|
+
nativeMenu: () => nativeMenu,
|
|
100
|
+
close: (event) => {
|
|
101
|
+
const details = { reason: 'item-press', event } as const;
|
|
102
|
+
if (popoverState) {
|
|
103
|
+
closeMenuTree(popoverState, popoverState.triggerReference ?? opener, menuElement, details);
|
|
104
|
+
} else setOpen(false, createOpenChangeDetails(details));
|
|
105
|
+
},
|
|
106
|
+
leave: (event) => {
|
|
107
|
+
const details = { reason: 'focus-out', event, interaction: 'keyboard' } as const;
|
|
108
|
+
if (!popoverState) return;
|
|
109
|
+
// Focus lands on the trigger before the keydown's default action runs: Tab then carries
|
|
110
|
+
// on from the trigger, to the control after it. Shift+Tab stays on the trigger.
|
|
111
|
+
const closed = closeMenuTree(popoverState, leaveTarget(), menuElement, details);
|
|
112
|
+
if (!closed || event.shiftKey) event.preventDefault();
|
|
72
113
|
}
|
|
73
114
|
};
|
|
115
|
+
if (!tree) providePopupMenuRoot(root);
|
|
116
|
+
|
|
117
|
+
// Tab or Shift+Tab in a panel leaves the whole tree, unless another tabbable control of the same
|
|
118
|
+
// panel (a field or a link in its header or footer) comes next in that direction. Focus on
|
|
119
|
+
// the menu itself has no row to move on from, so it always leaves.
|
|
120
|
+
const leavesOnTab = (node: HTMLElement, event: KeyboardEvent) => {
|
|
121
|
+
const target = event.target;
|
|
122
|
+
if (!(target instanceof HTMLElement) || target.matches('[role="menu"]')) return true;
|
|
123
|
+
const tabbable = getTabbableElements(node);
|
|
124
|
+
const index = tabbable.indexOf(target);
|
|
125
|
+
if (index === -1) return true;
|
|
126
|
+
return event.shiftKey ? index === 0 : index === tabbable.length - 1;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const attachTree = (popover: PopoverState) => (node: HTMLElement) => {
|
|
130
|
+
popoverState = popover;
|
|
131
|
+
menuElement = node;
|
|
132
|
+
const active = document.activeElement;
|
|
133
|
+
opener =
|
|
134
|
+
active instanceof HTMLElement && active !== document.body && !node.contains(active)
|
|
135
|
+
? active
|
|
136
|
+
: null;
|
|
137
|
+
const off = on(node, 'click', (e) => {
|
|
138
|
+
if (!root.closeOnItemClick()) return;
|
|
139
|
+
const path = e.composedPath();
|
|
140
|
+
const buttonOrLink = path.find(
|
|
141
|
+
(node) => node instanceof HTMLButtonElement || node instanceof HTMLAnchorElement
|
|
142
|
+
);
|
|
143
|
+
const shouldKeepOpen = path.some(
|
|
144
|
+
(node) => node instanceof HTMLElement && node.getAttribute('data-menu-keep-open') === 'true'
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
if (buttonOrLink && !shouldKeepOpen) root.close(e);
|
|
148
|
+
});
|
|
149
|
+
// The browser's own menu over a panel hides the one the user is looking at, padding included.
|
|
150
|
+
const offNativeMenu = on(popover.dialogElement ?? node, 'contextmenu', (event) => {
|
|
151
|
+
if (root.nativeMenu?.() === false) event.preventDefault();
|
|
152
|
+
});
|
|
153
|
+
const offKeys = on(node, 'keydown', (event) => {
|
|
154
|
+
// Ctrl+Tab and Cmd+Tab switch the browser's tabs; Alt+Tab is how Safari reaches every control.
|
|
155
|
+
if (event.key !== 'Tab' || event.defaultPrevented || event.ctrlKey || event.metaKey) return;
|
|
156
|
+
if (!leavesOnTab(node, event)) return;
|
|
157
|
+
root.leave?.(event);
|
|
158
|
+
});
|
|
159
|
+
return () => {
|
|
160
|
+
off();
|
|
161
|
+
offKeys();
|
|
162
|
+
offNativeMenu();
|
|
163
|
+
if (popoverState === popover) popoverState = null;
|
|
164
|
+
if (menuElement === node) menuElement = null;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// A keyboard open (Enter, Space, ArrowDown, ArrowUp, Shift+F10) puts focus on the first row,
|
|
169
|
+
// ArrowUp on the last; a pointer open focuses the menu itself; a hover open leaves focus alone.
|
|
170
|
+
// A menu opened from code keeps `'container'`.
|
|
171
|
+
const initialFocus = (popover: PopoverState) => {
|
|
172
|
+
if (menu.focusOnMount !== undefined) return menu.focusOnMount;
|
|
173
|
+
const reason = popover.openReason;
|
|
174
|
+
if (reason === 'keyboard') {
|
|
175
|
+
const event = popover.lastOpenChange?.event ?? arrowOpen?.event;
|
|
176
|
+
return event instanceof KeyboardEvent && event.key === 'ArrowUp' ? 'last' : true;
|
|
177
|
+
}
|
|
178
|
+
if (reason === 'hover') return false;
|
|
179
|
+
return arrowOpen ? (arrowOpen.event.key === 'ArrowUp' ? 'last' : true) : 'container';
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// The ArrowDown or ArrowUp that opened the menu from its button: the Popover sees that open as
|
|
183
|
+
// one made from code, so the key is kept here until the menu has taken focus. A menu closed any
|
|
184
|
+
// other way (code setting `open`, a cancelled change) must not leave it for the next open.
|
|
185
|
+
let arrowOpen: { event: KeyboardEvent } | null = null;
|
|
186
|
+
$effect(() => {
|
|
187
|
+
if (!openState.value) arrowOpen = null;
|
|
188
|
+
});
|
|
189
|
+
const openFromArrow = (node: HTMLElement, event: KeyboardEvent) => {
|
|
190
|
+
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
|
|
191
|
+
if (event.defaultPrevented || hasShortcutModifier(event)) return;
|
|
192
|
+
if (node.matches(':disabled') || node.getAttribute('aria-disabled') === 'true') return;
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
if (openState.value) {
|
|
195
|
+
// Already open: ArrowDown or ArrowUp moves into it, like Tab does.
|
|
196
|
+
menuElement?.querySelector<HTMLElement>('[role="menu"]')?.focus();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const details = createOpenChangeDetails({
|
|
200
|
+
reason: 'list-navigation',
|
|
201
|
+
event,
|
|
202
|
+
trigger: node,
|
|
203
|
+
interaction: 'keyboard'
|
|
204
|
+
});
|
|
205
|
+
arrowOpen = { event };
|
|
206
|
+
setOpen(true, details);
|
|
207
|
+
if (details.isCanceled) arrowOpen = null;
|
|
208
|
+
};
|
|
209
|
+
const arrowKey = createAttachmentKey();
|
|
210
|
+
const openFromArrowKey = (node: HTMLElement) =>
|
|
211
|
+
on(node, 'keydown', (e) => openFromArrow(node, e));
|
|
212
|
+
|
|
213
|
+
// A trigger made with a snippet is the consumer's own element, so there is no attachment to
|
|
214
|
+
// put the key handler on: the snippet's Popover is remembered as it renders, and a keydown
|
|
215
|
+
// that bubbles up from the element it anchors to is handled the same way.
|
|
216
|
+
let snippetPopover: PopoverState | null = null;
|
|
217
|
+
const rememberSnippetPopover = (popover: PopoverApi) => {
|
|
218
|
+
snippetPopover = popoverInternals(popover);
|
|
219
|
+
return popover;
|
|
220
|
+
};
|
|
221
|
+
const usesSnippetTrigger = $derived(typeof trigger === 'function');
|
|
222
|
+
$effect(() => {
|
|
223
|
+
if (!usesSnippetTrigger) return;
|
|
224
|
+
return on(document, 'keydown', (event) => {
|
|
225
|
+
const target = event.target;
|
|
226
|
+
const anchor = snippetPopover?.triggerReference ?? snippetPopover?.referenceElement;
|
|
227
|
+
if (!(target instanceof HTMLElement) || !anchor || target !== anchor) return;
|
|
228
|
+
openFromArrow(target, event);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const resolvedTrigger = $derived(
|
|
233
|
+
trigger !== undefined && trigger !== false && typeof trigger === 'object'
|
|
234
|
+
? { ...trigger, [arrowKey]: openFromArrowKey }
|
|
235
|
+
: trigger
|
|
236
|
+
);
|
|
74
237
|
</script>
|
|
75
238
|
|
|
239
|
+
{#snippet snippetTrigger(popover: PopoverApi)}
|
|
240
|
+
{@const remembered = rememberSnippetPopover(popover)}
|
|
241
|
+
{@render (trigger as Snippet<[PopoverApi]>)(remembered)}
|
|
242
|
+
{/snippet}
|
|
243
|
+
|
|
76
244
|
<Popover
|
|
77
245
|
open={openState.value}
|
|
78
246
|
onOpenChange={setOpen}
|
|
@@ -83,9 +251,12 @@
|
|
|
83
251
|
mobileSheetSizeTransition={resolvedMobileSheetSizeTransition}
|
|
84
252
|
class={panelClass}
|
|
85
253
|
{theme}
|
|
254
|
+
trigger={typeof resolvedTrigger === 'function' ? snippetTrigger : resolvedTrigger}
|
|
86
255
|
{...popoverProps}
|
|
87
256
|
>
|
|
88
257
|
{#snippet children(popover)}
|
|
89
|
-
|
|
258
|
+
{@const internals = popoverInternals(popover)}
|
|
259
|
+
{@const focusOnMount = untrack(() => initialFocus(internals))}
|
|
260
|
+
<Menu {...menu} {focusOnMount} {@attach attachTree(internals)} />
|
|
90
261
|
{/snippet}
|
|
91
262
|
</Popover>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
declare const PopupMenu: import("svelte").Component<
|
|
1
|
+
import type { PopupMenuInternalProps } from './popupMenu.props.js';
|
|
2
|
+
declare const PopupMenu: import("svelte").Component<PopupMenuInternalProps, {}, "open">;
|
|
3
3
|
type PopupMenu = ReturnType<typeof PopupMenu>;
|
|
4
4
|
export default PopupMenu;
|
|
@@ -1,4 +1,46 @@
|
|
|
1
1
|
import type { PopoverProps } from '../Popover/popover.props.js';
|
|
2
|
+
import type { PopoverState } from '../Popover/popover.state.svelte.js';
|
|
3
|
+
import type { OpenChangeInit } from '../../utils/openChange.js';
|
|
2
4
|
export type PopupMenuPanelSize = NonNullable<PopoverProps['size']>;
|
|
3
5
|
export declare const providePopupMenuPanelSize: (read: () => PopupMenuPanelSize) => () => PopupMenuPanelSize;
|
|
4
6
|
export declare const usePopupMenuPanelSize: () => (() => PopupMenuPanelSize) | undefined;
|
|
7
|
+
export interface PopupMenuRoot {
|
|
8
|
+
/** The root's `closeOnItemClick`: whether an item press anywhere in the tree closes it. */
|
|
9
|
+
closeOnItemClick: () => boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Closes every open level of the tree once, focus going back to where the root returns it.
|
|
12
|
+
* `event` is the item press, reported to each level's `onOpenChange` as `reason: 'item-press'`.
|
|
13
|
+
*/
|
|
14
|
+
close: (event?: Event) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Tab or Shift+Tab pressed in a panel of the tree: closes every level and hands focus to the
|
|
17
|
+
* root trigger (Shift+Tab stays there; Tab lets the browser carry on from it, so focus lands on
|
|
18
|
+
* the control after the trigger). Optional: a host that does not provide it leaves Tab alone.
|
|
19
|
+
*/
|
|
20
|
+
leave?: (event: KeyboardEvent) => void;
|
|
21
|
+
/** Whether the browser's own context menu may open over a panel of the tree. Default `true`. */
|
|
22
|
+
nativeMenu?: () => boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare const providePopupMenuLevel: (submenu: boolean) => boolean;
|
|
25
|
+
/** Whether the Menu being rendered is a submenu level; `false` for a root or a standalone Menu. */
|
|
26
|
+
export declare const usePopupMenuSubmenu: () => boolean;
|
|
27
|
+
/** Makes `root` the tree that the submenus of every Menu rendered below it join. */
|
|
28
|
+
export declare const providePopupMenuRoot: (root: PopupMenuRoot) => PopupMenuRoot;
|
|
29
|
+
/** The tree a Menu's submenus join, read by MenuFloating; `undefined` outside any tree. */
|
|
30
|
+
export declare const usePopupMenuRoot: () => PopupMenuRoot | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Closes a menu tree: the root first, through its own `close(details)`, then every open submenu
|
|
33
|
+
* below it, deepest first. Each level reports its open change exactly once, with the reason in
|
|
34
|
+
* `details` (`item-press` for a chosen item).
|
|
35
|
+
*
|
|
36
|
+
* The root asks first because it is the level the consumer's `onOpenChange` can cancel: when it
|
|
37
|
+
* does, the whole tree stays as it was, submenus and focus included. Submenus are still mounted
|
|
38
|
+
* while the root panel's outro runs, so they close right after it in the same task.
|
|
39
|
+
*
|
|
40
|
+
* Focus left inside the tree goes straight to `returnTo`, the element the root hands focus back
|
|
41
|
+
* to. No row of a closing panel keeps focus through the close transition, and every panel's focus
|
|
42
|
+
* scope then finds focus already outside and leaves it alone. `rootMenu`, the root's Menu element,
|
|
43
|
+
* covers a root panel the popover does not own, such as a mobile sheet. Returns `false` when the
|
|
44
|
+
* consumer's `onOpenChange` cancelled the close and the tree stayed as it was.
|
|
45
|
+
*/
|
|
46
|
+
export declare const closeMenuTree: (root: PopoverState, returnTo: HTMLElement | null, rootMenu?: HTMLElement | null, details?: OpenChangeInit) => boolean;
|
|
@@ -6,3 +6,55 @@ import { getContext, setContext } from 'svelte';
|
|
|
6
6
|
const POPUP_MENU_PANEL_SIZE = Symbol('entasis:popup-menu-panel-size');
|
|
7
7
|
export const providePopupMenuPanelSize = (read) => setContext(POPUP_MENU_PANEL_SIZE, read);
|
|
8
8
|
export const usePopupMenuPanelSize = () => getContext(POPUP_MENU_PANEL_SIZE);
|
|
9
|
+
// A menu and the submenus it opens are one tree, owned by its root: the PopupMenu the consumer
|
|
10
|
+
// rendered, or another host that renders a Menu inline (Tree's context-menu surface). Submenu
|
|
11
|
+
// panels are portaled out of the root panel, so a press inside one never reaches the root's own
|
|
12
|
+
// click listener; each submenu reports item presses to the root instead, and the root closes every
|
|
13
|
+
// level at once. MenuFloating hands the root to the submenus it renders through `submenuOf`, so a
|
|
14
|
+
// PopupMenu the consumer nests in a header, a footer or a trigger stays a root of its own.
|
|
15
|
+
const POPUP_MENU_ROOT = Symbol('entasis:popup-menu-root');
|
|
16
|
+
// Whether the Menu rendering below is a submenu level (a PopupMenu that joined its parent's tree)
|
|
17
|
+
// rather than a root menu. Set by every PopupMenu for the Menu it renders, read by MenuFloating
|
|
18
|
+
// to decide whether ArrowLeft leaves a level and whether the row set has a back control.
|
|
19
|
+
const POPUP_MENU_LEVEL = Symbol('entasis:popup-menu-level');
|
|
20
|
+
export const providePopupMenuLevel = (submenu) => setContext(POPUP_MENU_LEVEL, submenu);
|
|
21
|
+
/** Whether the Menu being rendered is a submenu level; `false` for a root or a standalone Menu. */
|
|
22
|
+
export const usePopupMenuSubmenu = () => getContext(POPUP_MENU_LEVEL) ?? false;
|
|
23
|
+
/** Makes `root` the tree that the submenus of every Menu rendered below it join. */
|
|
24
|
+
export const providePopupMenuRoot = (root) => setContext(POPUP_MENU_ROOT, root);
|
|
25
|
+
/** The tree a Menu's submenus join, read by MenuFloating; `undefined` outside any tree. */
|
|
26
|
+
export const usePopupMenuRoot = () => getContext(POPUP_MENU_ROOT);
|
|
27
|
+
const containsInTree = (popover, node) => !!popover.dialogElement?.contains(node) ||
|
|
28
|
+
popover.children.some((child) => containsInTree(child, node));
|
|
29
|
+
/**
|
|
30
|
+
* Closes a menu tree: the root first, through its own `close(details)`, then every open submenu
|
|
31
|
+
* below it, deepest first. Each level reports its open change exactly once, with the reason in
|
|
32
|
+
* `details` (`item-press` for a chosen item).
|
|
33
|
+
*
|
|
34
|
+
* The root asks first because it is the level the consumer's `onOpenChange` can cancel: when it
|
|
35
|
+
* does, the whole tree stays as it was, submenus and focus included. Submenus are still mounted
|
|
36
|
+
* while the root panel's outro runs, so they close right after it in the same task.
|
|
37
|
+
*
|
|
38
|
+
* Focus left inside the tree goes straight to `returnTo`, the element the root hands focus back
|
|
39
|
+
* to. No row of a closing panel keeps focus through the close transition, and every panel's focus
|
|
40
|
+
* scope then finds focus already outside and leaves it alone. `rootMenu`, the root's Menu element,
|
|
41
|
+
* covers a root panel the popover does not own, such as a mobile sheet. Returns `false` when the
|
|
42
|
+
* consumer's `onOpenChange` cancelled the close and the tree stayed as it was.
|
|
43
|
+
*/
|
|
44
|
+
export const closeMenuTree = (root, returnTo, rootMenu, details) => {
|
|
45
|
+
const active = document.activeElement;
|
|
46
|
+
const focusInTree = !!active && (!!rootMenu?.contains(active) || containsInTree(root, active));
|
|
47
|
+
if (root.isOpen && root.close(details) === false)
|
|
48
|
+
return false;
|
|
49
|
+
const closeBelow = (popover) => {
|
|
50
|
+
for (const child of popover.children) {
|
|
51
|
+
closeBelow(child);
|
|
52
|
+
if (child.isOpen)
|
|
53
|
+
child.close(details);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
closeBelow(root);
|
|
57
|
+
if (focusInTree && returnTo?.isConnected)
|
|
58
|
+
returnTo.focus({ preventScroll: true });
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const popupMenuDescription = "\n# PopupMenu Component\n\nThe PopupMenu component is a wrapper around Popover that renders a Menu inside. It provides all Popover functionality (positioning, transitions, triggers) with integrated Menu rendering for quick menu implementations.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { PopupMenu } from 'entasis/popup-menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\timport { signOutIcon } from 'entasis/icons/signOut';\n\t\n\tconst menuItems = [\n\t\t{ type: 'option', prefix: userIcon, title: 'Profile' },\n\t\t{ type: 'option', prefix: gearIcon, title: 'Settings' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: signOutIcon, title: 'Logout', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Open Menu' }}\n\tposition=\"bottom-start\"\n\tmenu={{ items: menuItems }}\n/>\n```\n\n## Props\n\n### Menu Props\n- **menu**: MenuProps (required)\n - items: MenuItem[] - Array of menu items (buttons, options, separators)\n - class: string - Custom class for the menu container\n - theme: MenuThemeProps - Theme overrides for menu and its items\n - submenuMode: 'auto' | 'popover' | 'stack' - defaults to auto; mobileSheet menus stack submenus automatically\n\n- **closeOnItemClick**: boolean (default: true)\n - Whether to close the menu when a menu item (button or link) is clicked\n - Set to false for menus that should stay open for multiple selections\n\n### Popover Props (All Available)\n\n#### Positioning & Layout\n- **position**: ResponsiveProps<Placement> - Popover position relative to trigger\n - Values: 'top', 'bottom', 'left', 'right', 'top-start', 'bottom-start', etc.\n \n- **offset**: number - Distance from trigger in pixels\n\n- **size**: ResponsiveProps<'small' | 'normal' | 'large'> - Popover size\n\n- **fitTrigger**: boolean - Make popover width match trigger width\n\n#### Trigger Configuration\n- **trigger**: Snippet | ButtonProps | false\n - Snippet: Custom trigger rendering with popover state\n - ButtonProps: Render a button with these props\n - false: No trigger (control externally via open)\n\n#### Interaction Behavior\n- **open**: boolean (bindable) - Control open state externally\n\n- **openOnClick**: boolean (default: true) - Open on trigger click\n\n- **openOnHover**: boolean (default: false) - Open on trigger hover\n\n- **delay**: number (default: 100) - Delay before opening on hover (ms)\n\n- **closeOnClickOutside**: boolean (default: true) - Close when clicking outside\n\n- **closeOnEscape**: boolean (default: true) - Close on Escape key\n\n- **closeOnMouseLeave**: boolean (default: false) - Close when the pointer leaves the hover safe area. The safe area is the trigger, the panel, and a prediction cone toward the submenu, so a diagonal move into the submenu keeps it open while sibling rows stay hoverable.\n\n- **debugSafeArea**: boolean (default: false) - Show hover safe-area overlays. Trigger/panel rectangles render in blue; the prediction cone toward the submenu renders in orange.\n\n#### Visual & Animation\n- **transition**: ResponsiveProps<FSOProps> - Custom transition configuration\n\n- **directedTransition**: boolean (default: true) - Transition direction based on position\n\n- **lockScroll**: boolean (default: true) - Lock body scroll when open\n\n- **class**: string - Custom class for popover dialog\n\n- **mobileSheet**: boolean (default: false) - Render as a bottom sheet on mobile viewports. With menu.submenuMode='auto', nested submenus become stacked views.\n\n#### Advanced\n- **id**: string - Custom ID for popover element\n\n- **ref**: HTMLElement | null - External reference element (instead of trigger)\n\n- **onOpenChange**: (open: boolean) => void - Called for component-owned state changes\n\n- **onAfterOpen**: (popover: PopoverState) => void - Called after the popover opens\n\n- **onAfterClose**: (popover: PopoverState) => void - Called after the popover closes\n\n- **theme**: PopoverThemeProps - Theme overrides for popover\n\n## Structure\n\nPopupMenu renders as:\n```\n<Popover {...popoverProps}>\n <Menu {...menuProps} />\n</Popover>\n```\n\nThe Menu inherits the Popover's dialog styling (background, border, shadow, etc.)\n\n## Examples\n\n### Basic Dropdown Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'New File' },\n\t\t{ type: 'option', title: 'Open...' },\n\t\t{ type: 'option', title: 'Save' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Exit' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'File', variant: 'ghost' }}\n\tposition=\"bottom-start\"\n\tmenu={{ items }}\n/>\n```\n\n### User Profile Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\timport { questionIcon } from 'entasis/icons/question';\n\timport { signOutIcon } from 'entasis/icons/signOut';\n\t\n\tconst items = [\n\t\t{ type: 'option', prefix: userIcon, title: 'Profile', href: '/profile' },\n\t\t{ type: 'option', prefix: gearIcon, title: 'Settings', href: '/settings' },\n\t\t{ type: 'option', prefix: questionIcon, title: 'Help' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: signOutIcon, title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'John Doe', variant: 'outline' }}\n\tposition=\"bottom-end\"\n\tmenu={{ items }}\n/>\n```\n\n### Context Menu (Right Click)\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { trashIcon } from 'entasis/icons/trash';\n\timport { copyIcon } from 'entasis/icons/copy';\n\timport { shareIcon } from 'entasis/icons/share';\n\t\n\tlet open = $state(false);\n\tlet contextMenuRef = $state<HTMLElement | null>(null);\n\t\n\tfunction handleContextMenu(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tcontextMenuRef = e.currentTarget as HTMLElement;\n\t\topen = true;\n\t}\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Open' },\n\t\t{ type: 'option', prefix: copyIcon, title: 'Copy' },\n\t\t{ type: 'option', prefix: shareIcon, title: 'Share' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: trashIcon, title: 'Delete', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<div oncontextmenu={handleContextMenu}>\n\tRight-click me\n</div>\n\n<PopupMenu\n\ttrigger={false}\n\tbind:open\n\tref={contextMenuRef}\n\tposition=\"bottom-start\"\n\tmenu={{ items }}\n/>\n```\n\n### With Custom Trigger Snippet\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet open = $state(false);\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Option 1' },\n\t\t{ type: 'option', title: 'Option 2' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu bind:open position=\"bottom\" menu={{ items }}>\n\t{#snippet trigger(popover)}\n\t\t<button onclick={() => popover.toggle()}>\n\t\t\tCustom Trigger {open ? '\u25B2' : '\u25BC'}\n\t\t</button>\n\t{/snippet}\n</PopupMenu>\n```\n\n### Hover Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Quick Action 1' },\n\t\t{ type: 'option', title: 'Quick Action 2' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Hover Me', variant: 'ghost' }}\n\topenOnHover={true}\n\topenOnClick={false}\n\tdelay={200}\n\tcloseOnMouseLeave={true}\n\tmenu={{ items }}\n/>\n```\n\n### Actions Menu with Buttons\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'button', children: 'Save Draft', variant: 'ghost', fullWidth: true },\n\t\t{ type: 'button', children: 'Publish', variant: 'solid', color: 'primary', fullWidth: true },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Delete', variant: 'soft', color: 'danger', fullWidth: true }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Actions' }}\n\tposition=\"bottom-end\"\n\tmenu={{ items }}\n/>\n```\n\n### External Control with Bindable State\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet menuOpen = $state(false);\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Item 1' },\n\t\t{ type: 'option', title: 'Item 2' }\n\t] satisfies MenuItem[];\n\t\n\tfunction openMenu() {\n\t\tmenuOpen = true;\n\t}\n</script>\n\n<button onclick={openMenu}>Open Menu Externally</button>\n\n<PopupMenu\n\ttrigger={{ content: 'Menu' }}\n\tbind:open={menuOpen}\n\tmenu={{ items }}\n/>\n```\n\n### Positioned Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Top Start' },\n\t\t{ type: 'option', title: 'Example' }\n\t] satisfies MenuItem[];\n</script>\n\n<div class=\"flex gap-2\">\n\t<PopupMenu trigger={{ content: 'Top Start' }} position=\"top-start\" menu={{ items }} />\n\t<PopupMenu trigger={{ content: 'Bottom' }} position=\"bottom\" menu={{ items }} />\n\t<PopupMenu trigger={{ content: 'Right' }} position=\"right\" menu={{ items }} />\n</div>\n```\n\n### With Custom Theme\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Themed Option 1' },\n\t\t{ type: 'option', title: 'Themed Option 2' }\n\t] satisfies MenuItem[];\n\t\n\tconst menuTheme = {\n\t\troot: { base: 'gap-3' },\n\t\toption: {\n\t\t\troot: { base: 'px-4 py-3' }\n\t\t}\n\t};\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Themed Menu' }}\n\tmenu={{ items, theme: menuTheme }}\n/>\n```\n\n### Keep Menu Open for Multiple Interactions\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet selections = $state<string[]>([]);\n\t\n\tconst items = [\n\t\t{ \n\t\t\ttype: 'option', \n\t\t\ttitle: 'Option 1',\n\t\t\tonclick: () => selections.push('Option 1')\n\t\t},\n\t\t{ \n\t\t\ttype: 'option', \n\t\t\ttitle: 'Option 2',\n\t\t\tonclick: () => selections.push('Option 2')\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ \n\t\t\ttype: 'button', \n\t\t\tchildren: 'Done',\n\t\t\tvariant: 'solid',\n\t\t\tfullWidth: true\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Select Multiple' }}\n\tcloseOnItemClick={false}\n\tmenu={{ items }}\n/>\n```\n\n### Nested Submenus\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'New File' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'More Options',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'Sub Option 1' },\n\t\t\t\t{ type: 'option', title: 'Sub Option 2' }\n\t\t\t]\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu trigger={{ content: 'Main Menu' }} position=\"bottom-start\" menu={{ items }} />\n```\n\n## Accessibility\n\n- Inherits all Popover accessibility features: the trigger carries `aria-haspopup=\"menu\"`, `aria-expanded`, and `aria-controls`, and focus returns to it on close\n- Menu items have appropriate roles (`menuitem`, or `menuitemradio` with `aria-checked` for options that set `selected`) and keyboard navigation\n- Type-ahead: typing letters moves the highlight to the next matching item\n- Escape closes only the topmost open layer, so a submenu closes before its parent (configurable)\n- An outside press closes every layer above the one pressed (configurable)\n\n## Notes\n\n- PopupMenu is a lightweight wrapper - all Popover props work as expected\n- Menu styling inherits from Popover's dialog theme\n- Use `closeOnClickOutside={true}` (default) for typical dropdown menus\n- Use `closeOnMouseLeave={true}` for hover-triggered quick menus; a prediction cone toward the submenu keeps it open during the diagonal move while sibling rows stay hoverable.\n- The `menu` prop accepts full MenuProps including theme forwarding to child components\n";
|
|
1
|
+
export declare const popupMenuDescription = "\n# PopupMenu Component\n\nThe PopupMenu component is a wrapper around Popover that renders a Menu inside. It provides all Popover functionality (positioning, transitions, triggers) with integrated Menu rendering for quick menu implementations.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { PopupMenu } from 'entasis/popup-menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\timport { signOutIcon } from 'entasis/icons/signOut';\n\t\n\tconst menuItems = [\n\t\t{ type: 'option', prefix: userIcon, title: 'Profile' },\n\t\t{ type: 'option', prefix: gearIcon, title: 'Settings' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: signOutIcon, title: 'Logout', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Open Menu' }}\n\tposition=\"bottom-start\"\n\tmenu={{ items: menuItems }}\n/>\n```\n\n## Props\n\n### Menu Props\n- **menu**: MenuProps (required)\n - items: MenuItem[] - Array of menu items (buttons, options, separators, submenus, checkbox items, radio groups, groups)\n - filter / search / defaultSearch / onSearchChange / onHighlightChange / empty: a search field above the rows (see the Menu docs)\n - focusOnMount: boolean | 'container' | 'last' - leave it out and the menu decides from how it opened (see Accessibility)\n - class: string - Custom class for the menu container\n - theme: MenuThemeProps - Theme overrides for menu and its items\n - submenuMode: 'auto' | 'popover' | 'stack' - defaults to auto; mobileSheet menus stack submenus automatically\n\n- **closeOnItemClick**: boolean (default: true)\n - Whether to close the menu when a menu item (button or link) is clicked\n - Choosing an item inside a submenu closes every open submenu and the menu together, once each; a floating menu then returns focus to its trigger (a mobile sheet hands focus back through its Dialog)\n - Submenus follow this setting; an item (or an ancestor) with data-menu-keep-open=\"true\" never closes the menu\n - A PopupMenu placed in another menu's header, footer or trigger is a menu of its own: it keeps its own closeOnItemClick and closes only itself\n - Set to false for menus that should stay open for multiple selections\n\n### Popover Props (All Available)\n\n#### Positioning & Layout\n- **position**: ResponsiveProps<Placement> - Popover position relative to trigger\n - Values: 'top', 'bottom', 'left', 'right', 'top-start', 'bottom-start', etc.\n \n- **offset**: number - Distance from trigger in pixels\n\n- **size**: ResponsiveProps<'small' | 'normal' | 'large'> - Popover size\n\n- **fitTrigger**: boolean - Make popover width match trigger width\n\n#### Trigger Configuration\n- **trigger**: Snippet | ButtonProps | false\n - Snippet: Custom trigger rendering with popover state\n - ButtonProps: Render a button with these props\n - false: No trigger (control externally via open)\n\n#### Interaction Behavior\n- **open**: boolean (bindable) - Control open state externally\n\n- **openOnClick**: boolean (default: true) - Open on trigger click\n\n- **openOnHover**: boolean (default: false) - Open on trigger hover. Touch taps and disabled triggers never hover-open it, and a submenu row that lands under a resting pointer (a menu reopened from the keyboard) opens only once the pointer moves\n\n- **delay**: number (default: 100) - Delay before opening on hover (ms)\n\n- **closeOnClickOutside**: boolean (default: true) - Close when clicking outside\n\n- **closeOnEscape**: boolean (default: true) - Close on Escape key\n\n- **closeOnMouseLeave**: boolean (default: false) - Close when the pointer leaves the hover safe area. The safe area is the trigger, the panel, and a prediction cone toward the submenu, so a diagonal move into the submenu keeps it open while sibling rows stay hoverable.\n- **closeDelay**: number (default: 120) - Milliseconds the pointer may spend outside the hover safe area before `closeOnMouseLeave` closes the menu\n\n- **debugSafeArea**: boolean (default: false) - Show hover safe-area overlays. Trigger/panel rectangles render in blue; the prediction cone toward the submenu renders in orange.\n\n#### Visual & Animation\n- **transition**: ResponsiveProps<FSOProps> - Custom transition configuration\n\n- **directedTransition**: boolean (default: true) - Transition direction based on position\n\n- **lockScroll**: boolean (default: true) - Lock body scroll when open\n\n- **class**: string - Custom class for popover dialog\n\n- **mobileSheet**: boolean (default: false) - Render as a bottom sheet on mobile viewports. With menu.submenuMode='auto', nested submenus become stacked views.\n\n#### Advanced\n- **id**: string - Custom ID for popover element\n\n- **ref**: HTMLElement | null - External reference element (instead of trigger)\n\n- **onOpenChange**: (open: boolean, details: OpenChangeDetails) => void - Called before component-owned state changes, with `details.reason` (`'trigger-press'`, `'trigger-hover'`, `'item-press'` when a chosen item closes the menu, `'escape-key'`, `'outside-press'`\u2026), `details.event` and `details.cancel()`, which keeps the menu as it is (cancelling an `'item-press'` close also keeps its open submenus and focus where they were)\n\n- **onAfterOpen**: (popover: PopoverApi) => void - Called after the popover opens\n\n- **onAfterClose**: (popover: PopoverApi) => void - Called after the popover closes\n\n- **theme**: PopoverThemeProps - Theme overrides for popover\n\n## Structure\n\nPopupMenu renders as:\n```\n<Popover {...popoverProps}>\n <Menu {...menuProps} />\n</Popover>\n```\n\nThe Menu inherits the Popover's dialog styling (background, border, shadow, etc.)\n\n## Examples\n\n### Basic Dropdown Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'New File' },\n\t\t{ type: 'option', title: 'Open...' },\n\t\t{ type: 'option', title: 'Save' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Exit' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'File', variant: 'ghost' }}\n\tposition=\"bottom-start\"\n\tmenu={{ items }}\n/>\n```\n\n### User Profile Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\timport { questionIcon } from 'entasis/icons/question';\n\timport { signOutIcon } from 'entasis/icons/signOut';\n\t\n\tconst items = [\n\t\t{ type: 'option', prefix: userIcon, title: 'Profile', href: '/profile' },\n\t\t{ type: 'option', prefix: gearIcon, title: 'Settings', href: '/settings' },\n\t\t{ type: 'option', prefix: questionIcon, title: 'Help' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: signOutIcon, title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'John Doe', variant: 'outline' }}\n\tposition=\"bottom-end\"\n\tmenu={{ items }}\n/>\n```\n\n### Context Menu (Right Click)\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { trashIcon } from 'entasis/icons/trash';\n\timport { copyIcon } from 'entasis/icons/copy';\n\timport { shareIcon } from 'entasis/icons/share';\n\t\n\tlet open = $state(false);\n\tlet contextMenuRef = $state<HTMLElement | null>(null);\n\t\n\tfunction handleContextMenu(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tcontextMenuRef = e.currentTarget as HTMLElement;\n\t\topen = true;\n\t}\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Open' },\n\t\t{ type: 'option', prefix: copyIcon, title: 'Copy' },\n\t\t{ type: 'option', prefix: shareIcon, title: 'Share' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', prefix: trashIcon, title: 'Delete', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<div oncontextmenu={handleContextMenu}>\n\tRight-click me\n</div>\n\n<PopupMenu\n\ttrigger={false}\n\tbind:open\n\tref={contextMenuRef}\n\tposition=\"bottom-start\"\n\tmenu={{ items }}\n/>\n```\n\n### With Custom Trigger Snippet\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet open = $state(false);\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Option 1' },\n\t\t{ type: 'option', title: 'Option 2' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu bind:open position=\"bottom\" menu={{ items }}>\n\t{#snippet trigger(popover)}\n\t\t<button onclick={() => popover.toggle()}>\n\t\t\tCustom Trigger {open ? '\u25B2' : '\u25BC'}\n\t\t</button>\n\t{/snippet}\n</PopupMenu>\n```\n\n### Hover Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Quick Action 1' },\n\t\t{ type: 'option', title: 'Quick Action 2' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Hover Me', variant: 'ghost' }}\n\topenOnHover={true}\n\topenOnClick={false}\n\tdelay={200}\n\tcloseOnMouseLeave={true}\n\tmenu={{ items }}\n/>\n```\n\n### Actions Menu with Buttons\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'button', children: 'Save Draft', variant: 'ghost', fullWidth: true },\n\t\t{ type: 'button', children: 'Publish', variant: 'solid', color: 'primary', fullWidth: true },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Delete', variant: 'soft', color: 'danger', fullWidth: true }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Actions' }}\n\tposition=\"bottom-end\"\n\tmenu={{ items }}\n/>\n```\n\n### External Control with Bindable State\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet menuOpen = $state(false);\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Item 1' },\n\t\t{ type: 'option', title: 'Item 2' }\n\t] satisfies MenuItem[];\n\t\n\tfunction openMenu() {\n\t\tmenuOpen = true;\n\t}\n</script>\n\n<button onclick={openMenu}>Open Menu Externally</button>\n\n<PopupMenu\n\ttrigger={{ content: 'Menu' }}\n\tbind:open={menuOpen}\n\tmenu={{ items }}\n/>\n```\n\n### Positioned Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Top Start' },\n\t\t{ type: 'option', title: 'Example' }\n\t] satisfies MenuItem[];\n</script>\n\n<div class=\"flex gap-2\">\n\t<PopupMenu trigger={{ content: 'Top Start' }} position=\"top-start\" menu={{ items }} />\n\t<PopupMenu trigger={{ content: 'Bottom' }} position=\"bottom\" menu={{ items }} />\n\t<PopupMenu trigger={{ content: 'Right' }} position=\"right\" menu={{ items }} />\n</div>\n```\n\n### With Custom Theme\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tconst items = [\n\t\t{ type: 'option', title: 'Themed Option 1' },\n\t\t{ type: 'option', title: 'Themed Option 2' }\n\t] satisfies MenuItem[];\n\t\n\tconst menuTheme = {\n\t\troot: { base: 'gap-3' },\n\t\toption: {\n\t\t\troot: { base: 'px-4 py-3' }\n\t\t}\n\t};\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Themed Menu' }}\n\tmenu={{ items, theme: menuTheme }}\n/>\n```\n\n### Keep Menu Open for Multiple Interactions\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\tlet selections = $state<string[]>([]);\n\t\n\tconst items = [\n\t\t{ \n\t\t\ttype: 'option', \n\t\t\ttitle: 'Option 1',\n\t\t\tonclick: () => selections.push('Option 1')\n\t\t},\n\t\t{ \n\t\t\ttype: 'option', \n\t\t\ttitle: 'Option 2',\n\t\t\tonclick: () => selections.push('Option 2')\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ \n\t\t\ttype: 'button', \n\t\t\tchildren: 'Done',\n\t\t\tvariant: 'solid',\n\t\t\tfullWidth: true\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Select Multiple' }}\n\tcloseOnItemClick={false}\n\tmenu={{ items }}\n/>\n```\n\n### Checkbox Items and Radio Groups\nCheckbox and radio rows keep the menu open on their own, so a menu of settings needs no `closeOnItemClick={false}`:\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'checkbox', title: 'Show hidden files', defaultValue: false },\n\t\t{\n\t\t\ttype: 'radio-group',\n\t\t\tlabel: 'Sort by',\n\t\t\tdefaultValue: 'name',\n\t\t\titems: [\n\t\t\t\t{ value: 'name', title: 'Name' },\n\t\t\t\t{ value: 'date', title: 'Date modified' }\n\t\t\t]\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Done' }\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu trigger={{ content: 'View' }} menu={{ items }} />\n```\n\n### Nested Submenus\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'New File' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'More Options',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'Sub Option 1' },\n\t\t\t\t{ type: 'option', title: 'Sub Option 2' }\n\t\t\t]\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<PopupMenu trigger={{ content: 'Main Menu' }} position=\"bottom-start\" menu={{ items }} />\n```\n\n## Styling hooks\n\nThe popup is a Popover panel: it carries `data-open`, `data-closed`, `data-entering`, `data-exiting`, `data-side` and `data-align`, and the `--available-height`, `--anchor-width` and `--transform-origin` variables (`popoverDataAttributes` and `popoverCssVariables` from `entasis/popover`). The trigger carries `data-popup-open` while the menu is open. Rows and submenu rows carry `data-highlighted`, `data-disabled`, `data-selected` and `data-popup-open` (`menuDataAttributes` from `entasis/menu`).\n\n## Accessibility\n\n- Inherits all Popover accessibility features: the trigger carries `aria-haspopup=\"menu\"`, `aria-expanded`, and `aria-controls`, and focus returns to it on close\n- Menu items have appropriate roles (`menuitem`, `menuitemcheckbox` and `menuitemradio` with `aria-checked`, or `menuitemradio` for options that set `selected`) and keyboard navigation\n- Where focus goes when the menu opens depends on how it opened. Enter, Space or a screen reader's press on the button, and ArrowDown, put focus on the first row; ArrowUp on the last; a mouse or touch press focuses the menu itself with no row highlighted; hovering it open leaves focus where it was. ArrowDown and ArrowUp on the button open the menu (Alt, Ctrl and Meta with them are left to the browser); on an already open menu they move into it\n- Tab closes the whole menu tree and moves on to the control after the trigger, Shift+Tab closes it and stays on the trigger; `onOpenChange` reports `reason: 'focus-out'`. Focus left where Tab put it is not taken back when the close finishes. A field or link in the menu's header or footer keeps Tab until the last one\n- A submenu closes when focus returns to a row of the menu that opened it\n- The panel carries the reading direction of its trigger: in right-to-left text submenus open to the left, carets and back arrows mirror, and ArrowLeft opens a submenu while ArrowRight leaves it\n- Type-ahead: typing letters moves the highlight to the next matching item\n- Escape closes only the topmost open layer, so a submenu closes before its parent (configurable)\n- An outside press closes every layer above the one pressed (configurable)\n- Choosing an item at any depth closes the whole menu tree at once; a floating menu returns focus straight to the trigger, without stopping on a submenu row\n\n## Notes\n\n- PopupMenu is a lightweight wrapper - all Popover props work as expected\n- Menu styling inherits from Popover's dialog theme\n- Use `closeOnClickOutside={true}` (default) for typical dropdown menus\n- Use `closeOnMouseLeave={true}` for hover-triggered quick menus; a prediction cone toward the submenu keeps it open during the diagonal move while sibling rows stay hoverable.\n- The `menu` prop accepts full MenuProps including theme forwarding to child components\n";
|
|
@@ -32,13 +32,18 @@ The PopupMenu component is a wrapper around Popover that renders a Menu inside.
|
|
|
32
32
|
|
|
33
33
|
### Menu Props
|
|
34
34
|
- **menu**: MenuProps (required)
|
|
35
|
-
- items: MenuItem[] - Array of menu items (buttons, options, separators)
|
|
35
|
+
- items: MenuItem[] - Array of menu items (buttons, options, separators, submenus, checkbox items, radio groups, groups)
|
|
36
|
+
- filter / search / defaultSearch / onSearchChange / onHighlightChange / empty: a search field above the rows (see the Menu docs)
|
|
37
|
+
- focusOnMount: boolean | 'container' | 'last' - leave it out and the menu decides from how it opened (see Accessibility)
|
|
36
38
|
- class: string - Custom class for the menu container
|
|
37
39
|
- theme: MenuThemeProps - Theme overrides for menu and its items
|
|
38
40
|
- submenuMode: 'auto' | 'popover' | 'stack' - defaults to auto; mobileSheet menus stack submenus automatically
|
|
39
41
|
|
|
40
42
|
- **closeOnItemClick**: boolean (default: true)
|
|
41
43
|
- Whether to close the menu when a menu item (button or link) is clicked
|
|
44
|
+
- Choosing an item inside a submenu closes every open submenu and the menu together, once each; a floating menu then returns focus to its trigger (a mobile sheet hands focus back through its Dialog)
|
|
45
|
+
- Submenus follow this setting; an item (or an ancestor) with data-menu-keep-open="true" never closes the menu
|
|
46
|
+
- A PopupMenu placed in another menu's header, footer or trigger is a menu of its own: it keeps its own closeOnItemClick and closes only itself
|
|
42
47
|
- Set to false for menus that should stay open for multiple selections
|
|
43
48
|
|
|
44
49
|
### Popover Props (All Available)
|
|
@@ -64,7 +69,7 @@ The PopupMenu component is a wrapper around Popover that renders a Menu inside.
|
|
|
64
69
|
|
|
65
70
|
- **openOnClick**: boolean (default: true) - Open on trigger click
|
|
66
71
|
|
|
67
|
-
- **openOnHover**: boolean (default: false) - Open on trigger hover
|
|
72
|
+
- **openOnHover**: boolean (default: false) - Open on trigger hover. Touch taps and disabled triggers never hover-open it, and a submenu row that lands under a resting pointer (a menu reopened from the keyboard) opens only once the pointer moves
|
|
68
73
|
|
|
69
74
|
- **delay**: number (default: 100) - Delay before opening on hover (ms)
|
|
70
75
|
|
|
@@ -73,6 +78,7 @@ The PopupMenu component is a wrapper around Popover that renders a Menu inside.
|
|
|
73
78
|
- **closeOnEscape**: boolean (default: true) - Close on Escape key
|
|
74
79
|
|
|
75
80
|
- **closeOnMouseLeave**: boolean (default: false) - Close when the pointer leaves the hover safe area. The safe area is the trigger, the panel, and a prediction cone toward the submenu, so a diagonal move into the submenu keeps it open while sibling rows stay hoverable.
|
|
81
|
+
- **closeDelay**: number (default: 120) - Milliseconds the pointer may spend outside the hover safe area before \`closeOnMouseLeave\` closes the menu
|
|
76
82
|
|
|
77
83
|
- **debugSafeArea**: boolean (default: false) - Show hover safe-area overlays. Trigger/panel rectangles render in blue; the prediction cone toward the submenu renders in orange.
|
|
78
84
|
|
|
@@ -92,11 +98,11 @@ The PopupMenu component is a wrapper around Popover that renders a Menu inside.
|
|
|
92
98
|
|
|
93
99
|
- **ref**: HTMLElement | null - External reference element (instead of trigger)
|
|
94
100
|
|
|
95
|
-
- **onOpenChange**: (open: boolean) => void - Called
|
|
101
|
+
- **onOpenChange**: (open: boolean, details: OpenChangeDetails) => void - Called before component-owned state changes, with \`details.reason\` (\`'trigger-press'\`, \`'trigger-hover'\`, \`'item-press'\` when a chosen item closes the menu, \`'escape-key'\`, \`'outside-press'\`…), \`details.event\` and \`details.cancel()\`, which keeps the menu as it is (cancelling an \`'item-press'\` close also keeps its open submenus and focus where they were)
|
|
96
102
|
|
|
97
|
-
- **onAfterOpen**: (popover:
|
|
103
|
+
- **onAfterOpen**: (popover: PopoverApi) => void - Called after the popover opens
|
|
98
104
|
|
|
99
|
-
- **onAfterClose**: (popover:
|
|
105
|
+
- **onAfterClose**: (popover: PopoverApi) => void - Called after the popover closes
|
|
100
106
|
|
|
101
107
|
- **theme**: PopoverThemeProps - Theme overrides for popover
|
|
102
108
|
|
|
@@ -356,6 +362,31 @@ The Menu inherits the Popover's dialog styling (background, border, shadow, etc.
|
|
|
356
362
|
/>
|
|
357
363
|
\`\`\`
|
|
358
364
|
|
|
365
|
+
### Checkbox Items and Radio Groups
|
|
366
|
+
Checkbox and radio rows keep the menu open on their own, so a menu of settings needs no \`closeOnItemClick={false}\`:
|
|
367
|
+
\`\`\`svelte
|
|
368
|
+
<script lang="ts">
|
|
369
|
+
import type { MenuItem } from '../Menu/index.ts';
|
|
370
|
+
|
|
371
|
+
const items = [
|
|
372
|
+
{ type: 'checkbox', title: 'Show hidden files', defaultValue: false },
|
|
373
|
+
{
|
|
374
|
+
type: 'radio-group',
|
|
375
|
+
label: 'Sort by',
|
|
376
|
+
defaultValue: 'name',
|
|
377
|
+
items: [
|
|
378
|
+
{ value: 'name', title: 'Name' },
|
|
379
|
+
{ value: 'date', title: 'Date modified' }
|
|
380
|
+
]
|
|
381
|
+
},
|
|
382
|
+
{ type: 'separator' },
|
|
383
|
+
{ type: 'option', title: 'Done' }
|
|
384
|
+
] satisfies MenuItem[];
|
|
385
|
+
</script>
|
|
386
|
+
|
|
387
|
+
<PopupMenu trigger={{ content: 'View' }} menu={{ items }} />
|
|
388
|
+
\`\`\`
|
|
389
|
+
|
|
359
390
|
### Nested Submenus
|
|
360
391
|
\`\`\`svelte
|
|
361
392
|
<script lang="ts">
|
|
@@ -377,13 +408,22 @@ The Menu inherits the Popover's dialog styling (background, border, shadow, etc.
|
|
|
377
408
|
<PopupMenu trigger={{ content: 'Main Menu' }} position="bottom-start" menu={{ items }} />
|
|
378
409
|
\`\`\`
|
|
379
410
|
|
|
411
|
+
## Styling hooks
|
|
412
|
+
|
|
413
|
+
The popup is a Popover panel: it carries \`data-open\`, \`data-closed\`, \`data-entering\`, \`data-exiting\`, \`data-side\` and \`data-align\`, and the \`--available-height\`, \`--anchor-width\` and \`--transform-origin\` variables (\`popoverDataAttributes\` and \`popoverCssVariables\` from \`entasis/popover\`). The trigger carries \`data-popup-open\` while the menu is open. Rows and submenu rows carry \`data-highlighted\`, \`data-disabled\`, \`data-selected\` and \`data-popup-open\` (\`menuDataAttributes\` from \`entasis/menu\`).
|
|
414
|
+
|
|
380
415
|
## Accessibility
|
|
381
416
|
|
|
382
417
|
- Inherits all Popover accessibility features: the trigger carries \`aria-haspopup="menu"\`, \`aria-expanded\`, and \`aria-controls\`, and focus returns to it on close
|
|
383
|
-
- Menu items have appropriate roles (\`menuitem\`,
|
|
418
|
+
- Menu items have appropriate roles (\`menuitem\`, \`menuitemcheckbox\` and \`menuitemradio\` with \`aria-checked\`, or \`menuitemradio\` for options that set \`selected\`) and keyboard navigation
|
|
419
|
+
- Where focus goes when the menu opens depends on how it opened. Enter, Space or a screen reader's press on the button, and ArrowDown, put focus on the first row; ArrowUp on the last; a mouse or touch press focuses the menu itself with no row highlighted; hovering it open leaves focus where it was. ArrowDown and ArrowUp on the button open the menu (Alt, Ctrl and Meta with them are left to the browser); on an already open menu they move into it
|
|
420
|
+
- Tab closes the whole menu tree and moves on to the control after the trigger, Shift+Tab closes it and stays on the trigger; \`onOpenChange\` reports \`reason: 'focus-out'\`. Focus left where Tab put it is not taken back when the close finishes. A field or link in the menu's header or footer keeps Tab until the last one
|
|
421
|
+
- A submenu closes when focus returns to a row of the menu that opened it
|
|
422
|
+
- The panel carries the reading direction of its trigger: in right-to-left text submenus open to the left, carets and back arrows mirror, and ArrowLeft opens a submenu while ArrowRight leaves it
|
|
384
423
|
- Type-ahead: typing letters moves the highlight to the next matching item
|
|
385
424
|
- Escape closes only the topmost open layer, so a submenu closes before its parent (configurable)
|
|
386
425
|
- An outside press closes every layer above the one pressed (configurable)
|
|
426
|
+
- Choosing an item at any depth closes the whole menu tree at once; a floating menu returns focus straight to the trigger, without stopping on a submenu row
|
|
387
427
|
|
|
388
428
|
## Notes
|
|
389
429
|
|