entasis 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/attachments/disclosurePanel.svelte.d.ts +84 -0
- package/dist/attachments/disclosurePanel.svelte.js +277 -0
- package/dist/attachments/portal.d.ts +17 -1
- package/dist/attachments/portal.js +39 -2
- package/dist/attachments/spinnerOverlay.svelte.js +12 -0
- package/dist/attachments/transitionSize.d.ts +6 -0
- package/dist/attachments/transitionSize.js +30 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestion.svelte +131 -17
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte +26 -6
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte.d.ts +6 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte +27 -53
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte.d.ts +3 -4
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionHeader.svelte +19 -16
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte +180 -21
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte.d.ts +9 -1
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte +56 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte.d.ts +4 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.d.ts +1 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.js +26 -8
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.props.d.ts +62 -5
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.d.ts +42 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.js +53 -12
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.d.ts +17 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.js +56 -8
- package/dist/components/AIAskUserQuestion/index.d.ts +3 -1
- package/dist/components/AIAskUserQuestion/index.js +2 -0
- package/dist/components/AIAskUserQuestion/schemas.d.ts +44 -0
- package/dist/components/AIAskUserQuestion/schemas.js +10 -3
- package/dist/components/AIChat/AIChat.svelte +10 -0
- package/dist/components/AIChat/AIChat.svelte.d.ts +2 -2
- package/dist/components/AIChat/AIChatComposerSurface.svelte +23 -5
- package/dist/components/AIChat/AIChatComposerSurface.svelte.d.ts +5 -0
- package/dist/components/AIChat/AIChatSkeleton.svelte +29 -37
- package/dist/components/AIChat/AIChatSurface.svelte +30 -2
- package/dist/components/AIChat/AIChatSurface.svelte.d.ts +1 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte +11 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte.d.ts +3 -1
- package/dist/components/AIChat/aiChat.mcp.d.ts +1 -1
- package/dist/components/AIChat/aiChat.mcp.js +31 -15
- package/dist/components/AIChat/aiChat.props.d.ts +36 -10
- package/dist/components/AIChat/aiChat.theme.d.ts +9 -0
- package/dist/components/AIChat/aiChat.theme.js +21 -4
- package/dist/components/AIChat/aiChatSkeleton.props.d.ts +5 -0
- package/dist/components/AIChat/index.d.ts +1 -1
- package/dist/components/AIComposer/AIComposer.svelte +102 -5
- package/dist/components/AIComposer/AIComposer.svelte.d.ts +1 -0
- package/dist/components/AIComposer/AIComposerFooter.svelte +54 -12
- package/dist/components/AIComposer/AIComposerFooter.svelte.d.ts +2 -0
- package/dist/components/AIComposer/AIComposerQueue.svelte +8 -3
- package/dist/components/AIComposer/aiComposer.editor.theme.js +13 -2
- package/dist/components/AIComposer/aiComposer.mcp.d.ts +1 -1
- package/dist/components/AIComposer/aiComposer.mcp.js +15 -7
- package/dist/components/AIComposer/aiComposer.props.d.ts +27 -7
- package/dist/components/AIComposer/aiComposer.theme.d.ts +42 -3
- package/dist/components/AIComposer/aiComposer.theme.js +37 -5
- package/dist/components/AIComposer/aiComposerFileController.svelte.d.ts +20 -0
- package/dist/components/AIComposer/aiComposerFileController.svelte.js +75 -9
- package/dist/components/AIComposer/aiComposerSourceAdapter.js +22 -4
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.d.ts +12 -0
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.js +16 -6
- package/dist/components/AIContext/AIContext.svelte +7 -3
- package/dist/components/AIContext/aiContext.mcp.d.ts +1 -1
- package/dist/components/AIContext/aiContext.mcp.js +1 -1
- package/dist/components/AIContext/aiContext.props.d.ts +4 -1
- package/dist/components/AIContext/aiContext.theme.d.ts +3 -0
- package/dist/components/AIContext/aiContext.theme.js +7 -2
- package/dist/components/AIConversation/AIConversation.svelte.d.ts +2 -2
- package/dist/components/AIFilePreview/aiFilePreview.theme.js +1 -1
- package/dist/components/AIMarker/AIMarker.svelte +2 -0
- package/dist/components/AIMarker/aiMarker.mcp.d.ts +1 -1
- package/dist/components/AIMarker/aiMarker.mcp.js +2 -0
- package/dist/components/AIMarker/aiMarker.props.d.ts +3 -0
- package/dist/components/AIMarker/aiMarker.theme.js +2 -2
- package/dist/components/AIMessage/AIMessage.svelte +38 -16
- package/dist/components/AIMessage/aiMessage.mcp.d.ts +1 -1
- package/dist/components/AIMessage/aiMessage.mcp.js +20 -6
- package/dist/components/AIMessage/aiMessage.props.d.ts +18 -2
- package/dist/components/AIMessage/aiMessage.theme.d.ts +51 -6
- package/dist/components/AIMessage/aiMessage.theme.js +91 -32
- package/dist/components/AIMessageActions/AIMessageActions.svelte +19 -9
- package/dist/components/AIMessageActions/aiMessageActions.mcp.d.ts +1 -1
- package/dist/components/AIMessageActions/aiMessageActions.mcp.js +11 -3
- package/dist/components/AIMessageActions/aiMessageActions.theme.js +36 -9
- package/dist/components/AIModelSelector/AIModelSelector.svelte +25 -10
- package/dist/components/AIModelSelector/aiModelSelector.mcp.d.ts +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.mcp.js +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.theme.d.ts +3 -0
- package/dist/components/AIModelSelector/aiModelSelector.theme.js +7 -3
- package/dist/components/AIReasoning/AIReasoning.svelte +135 -38
- package/dist/components/AIReasoning/aiReasoning.mcp.d.ts +1 -1
- package/dist/components/AIReasoning/aiReasoning.mcp.js +11 -5
- package/dist/components/AIReasoning/aiReasoning.props.d.ts +15 -4
- package/dist/components/AIReasoning/aiReasoning.theme.d.ts +45 -0
- package/dist/components/AIReasoning/aiReasoning.theme.js +47 -7
- package/dist/components/AISuggestion/AISuggestion.svelte +2 -1
- package/dist/components/AISuggestion/AISuggestions.svelte +2 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.d.ts +1 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.js +8 -1
- package/dist/components/AISuggestion/aiSuggestion.props.d.ts +4 -1
- package/dist/components/AISuggestion/aiSuggestion.theme.js +1 -1
- package/dist/components/AISuggestion/aiSuggestions.props.d.ts +7 -0
- package/dist/components/AIThread/AIThread.svelte +378 -95
- package/dist/components/AIThread/AIThreadAskUserQuestion.svelte +1 -0
- package/dist/components/AIThread/AIThreadItems.svelte +266 -64
- package/dist/components/AIThread/AIThreadItems.svelte.d.ts +7 -3
- package/dist/components/AIThread/AIThreadMarker.svelte +8 -1
- package/dist/components/AIThread/AIThreadMarker.svelte.d.ts +1 -0
- package/dist/components/AIThread/aiThread.mcp.d.ts +1 -1
- package/dist/components/AIThread/aiThread.mcp.js +34 -20
- package/dist/components/AIThread/aiThread.props.d.ts +73 -8
- package/dist/components/AIThread/aiThread.theme.d.ts +78 -0
- package/dist/components/AIThread/aiThread.theme.js +108 -9
- package/dist/components/AIThread/index.d.ts +1 -1
- package/dist/components/AIThread/threadAskUserQuestion.d.ts +4 -1
- package/dist/components/AIThread/threadAskUserQuestion.js +8 -4
- package/dist/components/AIThread/threadRenderItems.d.ts +74 -3
- package/dist/components/AIThread/threadRenderItems.js +265 -77
- package/dist/components/AIThread/threadScrollController.d.ts +0 -8
- package/dist/components/AIThread/threadScrollController.js +2 -39
- package/dist/components/AIThread/threadTools.d.ts +11 -0
- package/dist/components/AIThread/threadTools.js +79 -0
- package/dist/components/AIThreadToc/AIThreadToc.svelte +188 -18
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte +25 -2
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.d.ts +4 -2
- package/dist/components/AIThreadToc/aiThreadToc.js +17 -5
- package/dist/components/AIThreadToc/aiThreadToc.mcp.d.ts +1 -1
- package/dist/components/AIThreadToc/aiThreadToc.mcp.js +13 -3
- package/dist/components/AIThreadToc/aiThreadToc.props.d.ts +11 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.js +15 -6
- package/dist/components/AITool/AITool.svelte +56 -21
- package/dist/components/AITool/AIToolCallList.svelte +79 -29
- package/dist/components/AITool/AIToolCallList.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolStatusMark.svelte +52 -0
- package/dist/components/AITool/AIToolStatusMark.svelte.d.ts +14 -0
- package/dist/components/AITool/AIToolValueSection.svelte +126 -28
- package/dist/components/AITool/AIToolValueSection.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolValueTree.svelte +11 -16
- package/dist/components/AITool/AIToolValueTree.svelte.d.ts +2 -3
- package/dist/components/AITool/aiTool.mcp.d.ts +1 -1
- package/dist/components/AITool/aiTool.mcp.js +36 -8
- package/dist/components/AITool/aiTool.props.d.ts +52 -6
- package/dist/components/AITool/aiTool.theme.d.ts +117 -39
- package/dist/components/AITool/aiTool.theme.js +144 -140
- package/dist/components/AITool/aiToolClock.svelte.d.ts +18 -0
- package/dist/components/AITool/aiToolClock.svelte.js +62 -0
- package/dist/components/AITool/aiToolPrimitiveThemes.d.ts +0 -2
- package/dist/components/AITool/aiToolPrimitiveThemes.js +0 -10
- package/dist/components/AITool/index.d.ts +2 -1
- package/dist/components/AITool/index.js +1 -0
- package/dist/components/AITool/toolRendering.d.ts +33 -1
- package/dist/components/AITool/toolRendering.js +179 -15
- package/dist/components/AITool/toolValueTree.d.ts +14 -1
- package/dist/components/AITool/toolValueTree.js +126 -27
- package/dist/components/Accordion/Accordion.svelte +109 -109
- package/dist/components/Accordion/Accordion.svelte.d.ts +0 -1
- package/dist/components/Accordion/AccordionPanel.svelte +64 -0
- package/dist/components/Accordion/AccordionPanel.svelte.d.ts +20 -0
- package/dist/components/Accordion/accordion.attributes.d.ts +24 -0
- package/dist/components/Accordion/accordion.attributes.js +20 -0
- package/dist/components/Accordion/accordion.mcp.d.ts +1 -1
- package/dist/components/Accordion/accordion.mcp.js +78 -22
- package/dist/components/Accordion/accordion.props.d.ts +54 -10
- package/dist/components/Accordion/accordion.theme.d.ts +3 -0
- package/dist/components/Accordion/accordion.theme.js +4 -0
- package/dist/components/Accordion/index.d.ts +1 -0
- package/dist/components/Accordion/index.js +1 -0
- package/dist/components/AudioPlayer/audioPlayerVolumeControl.slider.theme.d.ts +31 -1
- package/dist/components/Avatar/Avatar.svelte +60 -10
- package/dist/components/Avatar/AvatarGroup.svelte +9 -0
- package/dist/components/Avatar/avatar.mcp.d.ts +1 -1
- package/dist/components/Avatar/avatar.mcp.js +13 -5
- package/dist/components/Avatar/avatar.props.d.ts +28 -1
- package/dist/components/Avatar/avatar.theme.js +3 -3
- package/dist/components/Avatar/index.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.js +1 -1
- package/dist/components/Button/Button.svelte +35 -15
- package/dist/components/Button/button.mcp.d.ts +1 -1
- package/dist/components/Button/button.mcp.js +8 -4
- package/dist/components/Button/button.props.d.ts +23 -8
- package/dist/components/Button/button.theme.d.ts +12 -0
- package/dist/components/Button/button.theme.js +17 -4
- package/dist/components/ButtonGroup/buttonGroup.mcp.d.ts +1 -1
- package/dist/components/ButtonGroup/buttonGroup.mcp.js +1 -1
- package/dist/components/ButtonGroup/buttonGroup.props.d.ts +4 -1
- package/dist/components/Collapsible/Collapsible.svelte +125 -19
- package/dist/components/Collapsible/collapsible.attributes.d.ts +21 -0
- package/dist/components/Collapsible/collapsible.attributes.js +17 -0
- package/dist/components/Collapsible/collapsible.mcp.d.ts +1 -1
- package/dist/components/Collapsible/collapsible.mcp.js +62 -12
- package/dist/components/Collapsible/collapsible.props.d.ts +39 -8
- package/dist/components/Collapsible/collapsible.theme.js +3 -1
- package/dist/components/Collapsible/index.d.ts +1 -0
- package/dist/components/Collapsible/index.js +1 -0
- package/dist/components/Command/Command.svelte +56 -14
- package/dist/components/Command/command.mcp.d.ts +1 -1
- package/dist/components/Command/command.mcp.js +12 -6
- package/dist/components/Command/command.props.d.ts +39 -6
- package/dist/components/Command/command.state.svelte.d.ts +40 -11
- package/dist/components/Command/command.state.svelte.js +75 -28
- package/dist/components/Command/command.theme.js +4 -3
- package/dist/components/Confirmation/Confirmation.svelte +72 -31
- package/dist/components/Confirmation/confirmation.mcp.d.ts +1 -1
- package/dist/components/Confirmation/confirmation.mcp.js +5 -4
- package/dist/components/ContextMenu/ContextMenu.svelte +126 -16
- package/dist/components/ContextMenu/contextMenu.mcp.d.ts +1 -1
- package/dist/components/ContextMenu/contextMenu.mcp.js +10 -7
- package/dist/components/ContextMenu/contextMenu.props.d.ts +13 -4
- package/dist/components/ContextMenu/contextMenu.theme.d.ts +3 -3
- package/dist/components/ContextMenu/contextMenu.theme.js +3 -2
- package/dist/components/DataTable/DataTable.svelte +4 -9
- package/dist/components/DataTable/DataTableEditor.svelte +5 -0
- package/dist/components/DataTable/DataTableFilter.svelte +1 -0
- package/dist/components/DataTable/DataTableToolbar.svelte +1 -0
- package/dist/components/DataTable/dataTable.mcp.d.ts +1 -1
- package/dist/components/DataTable/dataTable.mcp.js +4 -2
- package/dist/components/DataTable/dataTable.theme.d.ts +0 -3
- package/dist/components/DataTable/dataTable.theme.js +9 -6
- package/dist/components/Dialog/Dialog.svelte +120 -35
- package/dist/components/Dialog/Dialog.svelte.d.ts +1 -1
- package/dist/components/Dialog/DialogBackdrop.svelte +21 -1
- package/dist/components/Dialog/dialog.api.d.ts +65 -0
- package/dist/components/Dialog/dialog.api.js +1 -0
- package/dist/components/Dialog/dialog.attributes.d.ts +23 -0
- package/dist/components/Dialog/dialog.attributes.js +19 -0
- package/dist/components/Dialog/dialog.indent.d.ts +6 -0
- package/dist/components/Dialog/dialog.indent.js +16 -0
- package/dist/components/Dialog/dialog.mcp.d.ts +1 -1
- package/dist/components/Dialog/dialog.mcp.js +195 -22
- package/dist/components/Dialog/dialog.props.d.ts +102 -19
- package/dist/components/Dialog/dialog.snap.d.ts +40 -0
- package/dist/components/Dialog/dialog.snap.js +78 -0
- package/dist/components/Dialog/dialog.state.svelte.d.ts +122 -10
- package/dist/components/Dialog/dialog.state.svelte.js +525 -66
- package/dist/components/Dialog/dialog.theme.d.ts +48 -0
- package/dist/components/Dialog/dialog.theme.js +32 -9
- package/dist/components/Dialog/index.d.ts +4 -1
- package/dist/components/Dialog/index.js +1 -0
- package/dist/components/DocumentViewer/DocumentSearchControl.svelte +5 -3
- package/dist/components/DocumentViewer/documentOutput.js +2 -1
- package/dist/components/FloatingWindow/FloatingWindow.svelte +20 -32
- package/dist/components/FloatingWindow/FloatingWindow.svelte.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.js +3 -3
- package/dist/components/FloatingWindow/floatingWindow.props.d.ts +9 -4
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.d.ts +8 -2
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.js +18 -7
- package/dist/components/Form/Ask/Ask.svelte +9 -13
- package/dist/components/Form/Ask/ask.mcp.d.ts +1 -1
- package/dist/components/Form/Ask/ask.mcp.js +1 -1
- package/dist/components/Form/Ask/ask.props.d.ts +1 -1
- package/dist/components/Form/Autocomplete/Autocomplete.svelte +418 -0
- package/dist/components/Form/Autocomplete/Autocomplete.svelte.d.ts +4 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.d.ts +30 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.js +64 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.d.ts +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.js +134 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.d.ts +146 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.js +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.d.ts +213 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.js +119 -0
- package/dist/components/Form/Autocomplete/index.d.ts +3 -0
- package/dist/components/Form/Autocomplete/index.js +2 -0
- package/dist/components/Form/Calendar/CalendarInput.svelte +9 -0
- package/dist/components/Form/Calendar/CalendarMonthYearPicker.svelte +3 -0
- package/dist/components/Form/Calendar/CalendarPrimitive.svelte +5 -0
- package/dist/components/Form/Calendar/calendar.mcp.d.ts +1 -1
- package/dist/components/Form/Calendar/calendar.mcp.js +2 -1
- package/dist/components/Form/Calendar/calendarInput.props.d.ts +2 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.d.ts +3 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.js +3 -0
- package/dist/components/Form/Checkbox/Checkbox.svelte +17 -2
- package/dist/components/Form/Checkbox/checkbox.mcp.d.ts +1 -1
- package/dist/components/Form/Checkbox/checkbox.mcp.js +11 -1
- package/dist/components/Form/Checkbox/checkbox.props.d.ts +12 -1
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte +69 -32
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte.d.ts +10 -2
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte +123 -74
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte.d.ts +12 -12
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.d.ts +1 -1
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.js +11 -7
- package/dist/components/Form/CheckboxesInput/checkboxesInput.props.d.ts +25 -9
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.d.ts +12 -0
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.js +9 -4
- package/dist/components/Form/CheckboxesInput/choiceEnter.d.ts +11 -0
- package/dist/components/Form/CheckboxesInput/choiceEnter.js +27 -0
- package/dist/components/Form/ColorInput/ColorInput.svelte +12 -3
- package/dist/components/Form/ColorInput/colorInput.mcp.d.ts +1 -1
- package/dist/components/Form/ColorInput/colorInput.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/ColorPicker.svelte +11 -2
- package/dist/components/Form/ColorPicker/ColorPickerInput.svelte +9 -0
- package/dist/components/Form/ColorPicker/colorPicker.mcp.d.ts +1 -1
- package/dist/components/Form/ColorPicker/colorPicker.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/colorPicker.props.d.ts +2 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.d.ts +4 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.js +12 -8
- package/dist/components/Form/Combobox/Combobox.svelte +145 -185
- package/dist/components/Form/Combobox/Combobox.svelte.d.ts +1 -1
- package/dist/components/Form/Combobox/ComboboxPopup.svelte +128 -0
- package/dist/components/Form/Combobox/ComboboxPopup.svelte.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.attributes.d.ts +34 -0
- package/dist/components/Form/Combobox/combobox.attributes.js +25 -0
- package/dist/components/Form/Combobox/combobox.items.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.items.js +68 -0
- package/dist/components/Form/Combobox/combobox.mcp.d.ts +1 -1
- package/dist/components/Form/Combobox/combobox.mcp.js +104 -13
- package/dist/components/Form/Combobox/combobox.props.d.ts +113 -19
- package/dist/components/Form/Combobox/combobox.state.svelte.d.ts +137 -0
- package/dist/components/Form/Combobox/combobox.state.svelte.js +375 -0
- package/dist/components/Form/Combobox/combobox.theme.d.ts +63 -0
- package/dist/components/Form/Combobox/combobox.theme.js +37 -1
- package/dist/components/Form/Combobox/index.d.ts +2 -1
- package/dist/components/Form/Combobox/index.js +1 -0
- package/dist/components/Form/DateInput/DateInput.svelte +11 -3
- package/dist/components/Form/DateInput/dateInput.mcp.d.ts +1 -1
- package/dist/components/Form/DateInput/dateInput.mcp.js +5 -0
- package/dist/components/Form/DateSelector/DateSelector.svelte +5 -2
- package/dist/components/Form/DateSelector/DateSelectorInput.svelte +9 -0
- package/dist/components/Form/DateSelector/dateSelector.mcp.d.ts +1 -1
- package/dist/components/Form/DateSelector/dateSelector.mcp.js +2 -2
- package/dist/components/Form/DateSelector/dateSelector.props.d.ts +2 -0
- package/dist/components/Form/Field/Field.svelte +256 -30
- package/dist/components/Form/Field/Field.svelte.d.ts +9 -0
- package/dist/components/Form/Field/FieldGroup.svelte +29 -0
- package/dist/components/Form/Field/FieldGroup.svelte.d.ts +11 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte +187 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte.d.ts +26 -0
- package/dist/components/Form/Field/field.d.ts +64 -8
- package/dist/components/Form/Field/field.mcp.d.ts +1 -1
- package/dist/components/Form/Field/field.mcp.js +158 -18
- package/dist/components/Form/Field/field.messages.d.ts +47 -0
- package/dist/components/Form/Field/field.messages.js +64 -0
- package/dist/components/Form/Field/field.state.svelte.d.ts +109 -3
- package/dist/components/Form/Field/field.state.svelte.js +508 -16
- package/dist/components/Form/Field/field.theme.d.ts +46 -0
- package/dist/components/Form/Field/field.theme.js +33 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.d.ts +61 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.js +1 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.d.ts +14 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.js +113 -0
- package/dist/components/Form/Field/index.d.ts +5 -2
- package/dist/components/Form/Field/index.js +1 -0
- package/dist/components/Form/Field/schemas.js +7 -2
- package/dist/components/Form/File/FileInput.svelte +24 -3
- package/dist/components/Form/File/fileInput.mcp.d.ts +1 -1
- package/dist/components/Form/File/fileInput.mcp.js +1 -0
- package/dist/components/Form/Form/Form.svelte +47 -14
- package/dist/components/Form/Form/FormActions.svelte +3 -1
- package/dist/components/Form/Form/FormActions.svelte.d.ts +42 -2
- package/dist/components/Form/Form/FormFieldRenderer.svelte +40 -2
- package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
- package/dist/components/Form/Form/form.d.ts +35 -6
- package/dist/components/Form/Form/form.mcp.d.ts +1 -1
- package/dist/components/Form/Form/form.mcp.js +113 -13
- package/dist/components/Form/Form/form.props.d.ts +32 -1
- package/dist/components/Form/Form/form.registry.d.ts +2 -2
- package/dist/components/Form/Form/form.registry.js +1 -4
- package/dist/components/Form/Form/form.state.svelte.d.ts +1138 -413
- package/dist/components/Form/Form/form.state.svelte.js +319 -26
- package/dist/components/Form/Form/index.d.ts +3 -1
- package/dist/components/Form/Form/visibility.d.ts +3096 -1831
- package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
- package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
- package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1022 -408
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
- package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
- package/dist/components/Form/NumberInput/index.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
- package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
- package/dist/components/Form/PasswordInput/Password.svelte +28 -1
- package/dist/components/Form/PasswordInput/index.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
- package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
- package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
- package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
- package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
- package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
- package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
- package/dist/components/Form/PinInput/PinInput.svelte +44 -9
- package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
- package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
- package/dist/components/Form/PinInput/index.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
- package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
- package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
- package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
- package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
- package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
- package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
- package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
- package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
- package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
- package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
- package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
- package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
- package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
- package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
- package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
- package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
- package/dist/components/Form/Select/Select.svelte +186 -48
- package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
- package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
- package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
- package/dist/components/Form/Select/index.d.ts +2 -1
- package/dist/components/Form/Select/index.js +1 -0
- package/dist/components/Form/Select/select.align.d.ts +5 -0
- package/dist/components/Form/Select/select.align.js +19 -5
- package/dist/components/Form/Select/select.attributes.d.ts +36 -0
- package/dist/components/Form/Select/select.attributes.js +27 -0
- package/dist/components/Form/Select/select.mcp.d.ts +1 -1
- package/dist/components/Form/Select/select.mcp.js +103 -18
- package/dist/components/Form/Select/select.props.d.ts +87 -10
- package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
- package/dist/components/Form/Select/select.state.svelte.js +354 -59
- package/dist/components/Form/Select/select.theme.d.ts +21 -0
- package/dist/components/Form/Select/select.theme.js +22 -0
- package/dist/components/Form/Slider/Slider.svelte +54 -14
- package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
- package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
- package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
- package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
- package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
- package/dist/components/Form/Slider/index.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.js +55 -11
- package/dist/components/Form/Slider/slider.props.d.ts +35 -2
- package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
- package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
- package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
- package/dist/components/Form/Slider/slider.theme.js +35 -17
- package/dist/components/Form/Switch/Switch.svelte +61 -38
- package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
- package/dist/components/Form/Switch/switch.mcp.js +25 -5
- package/dist/components/Form/Switch/switch.props.d.ts +14 -1
- package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
- package/dist/components/Form/Switch/switch.theme.js +8 -3
- package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
- package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
- package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
- package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
- package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
- package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
- package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
- package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
- package/dist/components/Form/TextArea/TextArea.svelte +8 -0
- package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
- package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
- package/dist/components/Form/TextInput/TextInput.svelte +8 -1
- package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
- package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
- package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
- package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
- package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
- package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
- package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
- package/dist/components/HoverCard/HoverCard.svelte +100 -10
- package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
- package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
- package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
- package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
- package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
- package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
- package/dist/components/HoverCard/hoverCard.theme.js +9 -2
- package/dist/components/HoverCard/index.d.ts +1 -0
- package/dist/components/HoverCard/index.js +1 -0
- package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
- package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
- package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
- package/dist/components/Kanban/kanban.theme.js +7 -3
- package/dist/components/Layout/layoutSpacing.d.ts +2 -2
- package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
- package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
- package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
- package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
- package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
- package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
- package/dist/components/Map/maplibre-cdn.js +3 -2
- package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
- package/dist/components/Markdown/markdown.mcp.js +2 -1
- package/dist/components/Markdown/markdown.theme.js +18 -9
- package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
- package/dist/components/Menu/Menu.svelte +3 -3
- package/dist/components/Menu/Menu.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
- package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
- package/dist/components/Menu/MenuFloating.svelte +421 -74
- package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
- package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
- package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
- package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
- package/dist/components/Menu/MenuSearchField.svelte +54 -0
- package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
- package/dist/components/Menu/MenuStacked.svelte +404 -158
- package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
- package/dist/components/Menu/index.d.ts +2 -1
- package/dist/components/Menu/index.js +1 -0
- package/dist/components/Menu/menu.attributes.d.ts +37 -0
- package/dist/components/Menu/menu.attributes.js +28 -0
- package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
- package/dist/components/Menu/menu.filter.svelte.js +143 -0
- package/dist/components/Menu/menu.mcp.d.ts +1 -1
- package/dist/components/Menu/menu.mcp.js +227 -17
- package/dist/components/Menu/menu.platform.d.ts +5 -0
- package/dist/components/Menu/menu.platform.js +11 -0
- package/dist/components/Menu/menu.props.d.ts +172 -9
- package/dist/components/Menu/menu.theme.d.ts +147 -0
- package/dist/components/Menu/menu.theme.js +101 -0
- package/dist/components/Menu/menuTree.d.ts +35 -1
- package/dist/components/Menu/menuTree.js +158 -1
- package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
- package/dist/components/MenuBar/menuBar.mcp.js +4 -2
- package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
- package/dist/components/MenuOption/MenuOption.svelte +5 -1
- package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
- package/dist/components/MenuOption/menuOption.mcp.js +8 -0
- package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
- package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
- package/dist/components/MenuOption/menuOption.theme.js +24 -4
- package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
- package/dist/components/Mermaid/mermaid.mcp.js +8 -8
- package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
- package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
- package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
- package/dist/components/Mermaid/mermaid.theme.js +26 -1
- package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
- package/dist/components/Meter/Meter.svelte +110 -24
- package/dist/components/Meter/Meter.svelte.d.ts +12 -12
- package/dist/components/Meter/meter.mcp.d.ts +1 -1
- package/dist/components/Meter/meter.mcp.js +23 -37
- package/dist/components/Meter/meter.props.d.ts +36 -44
- package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
- package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/index.d.ts +4 -0
- package/dist/components/NavigationMenu/index.js +3 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
- package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
- package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
- package/dist/components/Overlay/Overlay.svelte +19 -30
- package/dist/components/Overlay/index.d.ts +1 -0
- package/dist/components/Overlay/index.js +1 -0
- package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
- package/dist/components/Overlay/overlay.attributes.js +14 -0
- package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
- package/dist/components/Overlay/overlay.mcp.js +21 -3
- package/dist/components/Overlay/overlay.props.d.ts +8 -4
- package/dist/components/Popover/Popover.svelte +163 -52
- package/dist/components/Popover/Popover.svelte.d.ts +23 -2
- package/dist/components/Popover/PopoverSession.svelte +12 -0
- package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
- package/dist/components/Popover/index.d.ts +10 -2
- package/dist/components/Popover/index.js +4 -1
- package/dist/components/Popover/popover.api.d.ts +83 -0
- package/dist/components/Popover/popover.api.js +1 -0
- package/dist/components/Popover/popover.attributes.d.ts +32 -0
- package/dist/components/Popover/popover.attributes.js +28 -0
- package/dist/components/Popover/popover.claims.d.ts +19 -0
- package/dist/components/Popover/popover.claims.js +45 -0
- package/dist/components/Popover/popover.mcp.d.ts +1 -1
- package/dist/components/Popover/popover.mcp.js +163 -31
- package/dist/components/Popover/popover.position.d.ts +226 -0
- package/dist/components/Popover/popover.position.js +402 -0
- package/dist/components/Popover/popover.props.d.ts +179 -24
- package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
- package/dist/components/Popover/popover.state.svelte.js +1034 -194
- package/dist/components/Popover/popover.theme.d.ts +15 -0
- package/dist/components/Popover/popover.theme.js +27 -2
- package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
- package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
- package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
- package/dist/components/PopupMenu/popupMenu.context.js +52 -0
- package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
- package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
- package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
- package/dist/components/Progress/Progress.svelte +160 -0
- package/dist/components/Progress/Progress.svelte.d.ts +4 -0
- package/dist/components/Progress/index.d.ts +3 -0
- package/dist/components/Progress/index.js +2 -0
- package/dist/components/Progress/progress.mcp.d.ts +1 -0
- package/dist/components/Progress/progress.mcp.js +101 -0
- package/dist/components/Progress/progress.props.d.ts +79 -0
- package/dist/components/Progress/progress.props.js +1 -0
- package/dist/components/Progress/progress.theme.d.ts +129 -0
- package/dist/components/Progress/progress.theme.js +83 -0
- package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
- package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
- package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
- package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
- package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
- package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
- package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
- package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
- package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
- package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
- package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
- package/dist/components/RichTextInput/suggestions.js +2 -0
- package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
- package/dist/components/ScrollArea/index.d.ts +2 -1
- package/dist/components/ScrollArea/index.js +1 -0
- package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
- package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
- package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
- package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
- package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
- package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
- package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
- package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
- package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
- package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
- package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
- package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
- package/dist/components/Sidebar/SidebarAction.svelte +13 -3
- package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
- package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
- package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
- package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
- package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
- package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
- package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
- package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
- package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
- package/dist/components/Sidebar/index.d.ts +1 -0
- package/dist/components/Sidebar/index.js +1 -0
- package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
- package/dist/components/Sidebar/sidebar-position.js +31 -2
- package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
- package/dist/components/Sidebar/sidebar.attributes.js +29 -0
- package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
- package/dist/components/Sidebar/sidebar.mcp.js +45 -10
- package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
- package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
- package/dist/components/Sidebar/sidebar.theme.js +113 -62
- package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
- package/dist/components/Stepper/Stepper.svelte +2 -0
- package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
- package/dist/components/Stepper/stepper.mcp.js +1 -0
- package/dist/components/Stepper/stepper.props.d.ts +5 -0
- package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
- package/dist/components/Stepper/stepper.state.svelte.js +31 -12
- package/dist/components/Tabbar/Tabbar.svelte +55 -16
- package/dist/components/Tabbar/index.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.js +26 -9
- package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
- package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
- package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
- package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
- package/dist/components/Tabs/Tabs.svelte +73 -16
- package/dist/components/Tabs/index.d.ts +2 -1
- package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
- package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
- package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
- package/dist/components/Tabs/tabs.mcp.js +22 -4
- package/dist/components/Tabs/tabs.props.d.ts +39 -12
- package/dist/components/Tabs/tabs.theme.js +3 -1
- package/dist/components/Theme/Theme.svelte +44 -27
- package/dist/components/Theme/helper.d.ts +16 -2
- package/dist/components/Theme/helper.js +46 -4
- package/dist/components/Theme/theme.mcp.d.ts +1 -1
- package/dist/components/Theme/theme.mcp.js +103 -0
- package/dist/components/Theme/theme.props.d.ts +16 -0
- package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
- package/dist/components/Theme/theme.state.svelte.js +18 -1
- package/dist/components/Toast/Toast.svelte +184 -39
- package/dist/components/Toast/Toaster.svelte +14 -10
- package/dist/components/Toast/index.d.ts +1 -0
- package/dist/components/Toast/toast.mcp.d.ts +1 -1
- package/dist/components/Toast/toast.mcp.js +47 -6
- package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
- package/dist/components/Toast/toast.state.svelte.js +513 -68
- package/dist/components/Toast/toast.theme.js +1 -1
- package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
- package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
- package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
- package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
- package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
- package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
- package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
- package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
- package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
- package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
- package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
- package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
- package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
- package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
- package/dist/components/Tooltip/Tooltip.svelte +4 -12
- package/dist/components/Tooltip/TooltipHost.svelte +136 -15
- package/dist/components/Tooltip/index.d.ts +1 -0
- package/dist/components/Tooltip/index.js +1 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
- package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
- package/dist/components/Tooltip/tooltip.attributes.js +28 -0
- package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
- package/dist/components/Tooltip/tooltip.mcp.js +111 -10
- package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
- package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
- package/dist/components/Tooltip/tooltip.surface.js +42 -0
- package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
- package/dist/components/Utils/BeforeHydratation.svelte +14 -3
- package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
- package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
- package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
- package/dist/generated/componentAliases.d.ts +3 -0
- package/dist/generated/componentAliases.js +3 -0
- package/dist/generated/componentContract.d.ts +79 -34
- package/dist/generated/componentContract.js +225 -6
- package/dist/generated/componentMcpRegistry.js +6 -0
- package/dist/i18n/ar.js +107 -3
- package/dist/i18n/context.svelte.d.ts +6 -0
- package/dist/i18n/context.svelte.js +12 -0
- package/dist/i18n/de.js +101 -3
- package/dist/i18n/en.d.ts +91 -2
- package/dist/i18n/en.js +101 -3
- package/dist/i18n/es.js +101 -3
- package/dist/i18n/fr.js +101 -3
- package/dist/i18n/ja.js +101 -3
- package/dist/i18n/pt.js +101 -3
- package/dist/i18n/zh.js +101 -3
- package/dist/tailwind/geometry.js +7 -0
- package/dist/tailwind/global.js +31 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/types.mcp.d.ts +1 -1
- package/dist/types/types.mcp.js +23 -0
- package/dist/utils/cspNonce.d.ts +16 -0
- package/dist/utils/cspNonce.js +39 -0
- package/dist/utils/cva/merge.d.ts +5 -1
- package/dist/utils/cva/merge.js +6 -4
- package/dist/utils/focus.d.ts +34 -0
- package/dist/utils/focus.js +93 -0
- package/dist/utils/focusHistory.d.ts +21 -0
- package/dist/utils/focusHistory.js +99 -0
- package/dist/utils/handlers.d.ts +7 -0
- package/dist/utils/handlers.js +14 -0
- package/dist/utils/hoverIntent.d.ts +42 -0
- package/dist/utils/hoverIntent.js +57 -0
- package/dist/utils/id.d.ts +7 -0
- package/dist/utils/id.js +15 -0
- package/dist/utils/layers.svelte.d.ts +32 -4
- package/dist/utils/layers.svelte.js +214 -21
- package/dist/utils/listFilter.d.ts +44 -0
- package/dist/utils/listFilter.js +130 -0
- package/dist/utils/match.d.ts +35 -0
- package/dist/utils/match.js +36 -0
- package/dist/utils/number.d.ts +126 -0
- package/dist/utils/number.js +401 -0
- package/dist/utils/openChange.d.ts +88 -0
- package/dist/utils/openChange.js +71 -0
- package/dist/utils/openLifecycle.svelte.d.ts +41 -0
- package/dist/utils/openLifecycle.svelte.js +134 -0
- package/dist/utils/pointerDrag.d.ts +10 -0
- package/dist/utils/pointerDrag.js +37 -2
- package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
- package/dist/utils/pragmaticDragAndDrop.js +8 -3
- package/dist/utils/range.d.ts +62 -0
- package/dist/utils/range.js +70 -0
- package/dist/utils/requestNativeSubmit.d.ts +17 -0
- package/dist/utils/requestNativeSubmit.js +47 -0
- package/dist/utils/safeArea.svelte.d.ts +10 -1
- package/dist/utils/safeArea.svelte.js +19 -11
- package/dist/utils/stateAttributes.d.ts +108 -0
- package/dist/utils/stateAttributes.js +78 -0
- package/dist/utils/swipeVelocity.d.ts +32 -0
- package/dist/utils/swipeVelocity.js +59 -0
- package/dist/utils/timer.svelte.d.ts +65 -2
- package/dist/utils/timer.svelte.js +159 -25
- package/dist/utils/trigger.d.ts +41 -0
- package/dist/utils/trigger.js +103 -0
- package/dist/utils/typeahead.d.ts +9 -0
- package/dist/utils/typeahead.js +21 -9
- package/dist/utils/useDndList.svelte.d.ts +1 -1
- package/dist/utils/useDndList.svelte.js +6 -23
- package/dist/utils/useFocusScope.svelte.d.ts +29 -0
- package/dist/utils/useFocusScope.svelte.js +189 -27
- package/dist/utils/useHoverAction.svelte.d.ts +44 -4
- package/dist/utils/useHoverAction.svelte.js +161 -51
- package/dist/utils/useKeyDown.svelte.d.ts +19 -2
- package/dist/utils/useKeyDown.svelte.js +19 -12
- package/dist/utils/useListNavigation.svelte.d.ts +94 -13
- package/dist/utils/useListNavigation.svelte.js +261 -35
- package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
- package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
- package/dist/utils/useNavigation.svelte.d.ts +36 -3
- package/dist/utils/useNavigation.svelte.js +699 -332
- package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
- package/dist/utils/usePressAndHold.svelte.js +191 -0
- package/dist/utils/useScrollLock.svelte.d.ts +20 -1
- package/dist/utils/useScrollLock.svelte.js +54 -13
- package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
- package/dist/utils/useSlidingIndicator.svelte.js +27 -5
- package/dist/utils/useTabBridge.svelte.d.ts +20 -0
- package/dist/utils/useTabBridge.svelte.js +109 -0
- package/dist/utils/values.d.ts +15 -0
- package/dist/utils/values.js +49 -0
- package/package.json +31 -2
- package/dist/generated/componentMcpRegistry.d.ts +0 -142
- package/dist/utils/useDrag.svelte.d.ts +0 -11
- package/dist/utils/useDrag.svelte.js +0 -55
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { default as Menu } from './Menu.svelte';
|
|
2
|
-
export type { MenuProps, MenuItem, MenuSubmenuMode } from './menu.props.js';
|
|
2
|
+
export type { MenuProps, MenuItem, MenuItemBase, MenuButtonItem, MenuOptionItem, MenuSeparatorItem, MenuSubmenuItem, MenuCheckboxItem, MenuRadioItem, MenuRadioGroupItem, MenuGroupItem, MenuFilter, MenuFilterOptions, MenuFilterMatchItem, MenuSubmenuMode } from './menu.props.js';
|
|
3
3
|
export { menuTheme, setMenuTheme, useMenuTheme, type MenuTheme, type MenuThemeProps } from './menu.theme.js';
|
|
4
|
+
export { menuDataAttributes, menuCssVariables, type MenuDataAttribute, type MenuCssVariable } from './menu.attributes.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The styling hooks a Menu exposes. Attributes are presence attributes (set while the state
|
|
3
|
+
* holds, omitted otherwise) unless the description says they carry a value. A popup menu
|
|
4
|
+
* (PopupMenu, ContextMenu, a submenu) is a Popover panel: it also carries `data-open`,
|
|
5
|
+
* `data-closed`, `data-entering`, `data-exiting`, `data-side` and `data-align`, and the CSS
|
|
6
|
+
* variables of `menuCssVariables`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const menuDataAttributes: {
|
|
9
|
+
readonly 'data-highlighted': "On a row: present while the keyboard or the pointer highlights it (the roving tab stop).";
|
|
10
|
+
readonly 'data-disabled': "On a row: present while it is disabled.";
|
|
11
|
+
readonly 'data-selected': "On a checkbox, radio or option row: present while it is checked or selected.";
|
|
12
|
+
readonly 'data-popup-open': "On a submenu row: present while its submenu is open.";
|
|
13
|
+
readonly 'data-popup-side': "On a submenu row: the submenu's `data-side` while it is placed.";
|
|
14
|
+
readonly 'data-open': "On a popup menu or submenu panel: present while open.";
|
|
15
|
+
readonly 'data-closed': "On a popup menu or submenu panel: present while its exit transition plays.";
|
|
16
|
+
readonly 'data-entering': "On a popup menu or submenu panel: present while the enter transition plays.";
|
|
17
|
+
readonly 'data-exiting': "On a popup menu or submenu panel: present while the exit transition plays.";
|
|
18
|
+
readonly 'data-side': "On a popup menu or submenu panel: the side of its trigger it sits on after flipping.";
|
|
19
|
+
readonly 'data-align': "On a popup menu or submenu panel: `start`, `center` or `end`.";
|
|
20
|
+
readonly 'data-size': "On the root and the list: the resolved `size`.";
|
|
21
|
+
readonly 'data-density': "On the root and the list: the resolved `density`.";
|
|
22
|
+
};
|
|
23
|
+
/** The name of a Menu data attribute. */
|
|
24
|
+
export type MenuDataAttribute = keyof typeof menuDataAttributes;
|
|
25
|
+
/**
|
|
26
|
+
* The CSS variables a placement writes on a popup menu's or submenu's positioned wrapper, inherited
|
|
27
|
+
* by the panel and its rows: the Popover set (`popoverCssVariables`). An inline Menu has none.
|
|
28
|
+
*/
|
|
29
|
+
export declare const menuCssVariables: {
|
|
30
|
+
readonly '--available-width': "The width in px the panel can take before it reaches the viewport edges, minus 20px.";
|
|
31
|
+
readonly '--available-height': "The room in px between the trigger and the viewport edge on the panel's side, minus 20px. Cap a scrolling list with `max-height: min(240px, var(--available-height))`.";
|
|
32
|
+
readonly '--anchor-width': "The trigger's width in px, snapped to the device pixel grid.";
|
|
33
|
+
readonly '--anchor-height': "The trigger's height in px, snapped to the device pixel grid.";
|
|
34
|
+
readonly '--transform-origin': "The panel corner facing the trigger, mirrored in right-to-left documents; the point the panel scales from.";
|
|
35
|
+
};
|
|
36
|
+
/** The name of a Menu CSS variable. */
|
|
37
|
+
export type MenuCssVariable = keyof typeof menuCssVariables;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { popoverCssVariables } from '../Popover/popover.attributes.js';
|
|
2
|
+
/**
|
|
3
|
+
* The styling hooks a Menu exposes. Attributes are presence attributes (set while the state
|
|
4
|
+
* holds, omitted otherwise) unless the description says they carry a value. A popup menu
|
|
5
|
+
* (PopupMenu, ContextMenu, a submenu) is a Popover panel: it also carries `data-open`,
|
|
6
|
+
* `data-closed`, `data-entering`, `data-exiting`, `data-side` and `data-align`, and the CSS
|
|
7
|
+
* variables of `menuCssVariables`.
|
|
8
|
+
*/
|
|
9
|
+
export const menuDataAttributes = {
|
|
10
|
+
'data-highlighted': 'On a row: present while the keyboard or the pointer highlights it (the roving tab stop).',
|
|
11
|
+
'data-disabled': 'On a row: present while it is disabled.',
|
|
12
|
+
'data-selected': 'On a checkbox, radio or option row: present while it is checked or selected.',
|
|
13
|
+
'data-popup-open': 'On a submenu row: present while its submenu is open.',
|
|
14
|
+
'data-popup-side': "On a submenu row: the submenu's `data-side` while it is placed.",
|
|
15
|
+
'data-open': 'On a popup menu or submenu panel: present while open.',
|
|
16
|
+
'data-closed': 'On a popup menu or submenu panel: present while its exit transition plays.',
|
|
17
|
+
'data-entering': 'On a popup menu or submenu panel: present while the enter transition plays.',
|
|
18
|
+
'data-exiting': 'On a popup menu or submenu panel: present while the exit transition plays.',
|
|
19
|
+
'data-side': 'On a popup menu or submenu panel: the side of its trigger it sits on after flipping.',
|
|
20
|
+
'data-align': 'On a popup menu or submenu panel: `start`, `center` or `end`.',
|
|
21
|
+
'data-size': 'On the root and the list: the resolved `size`.',
|
|
22
|
+
'data-density': 'On the root and the list: the resolved `density`.'
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The CSS variables a placement writes on a popup menu's or submenu's positioned wrapper, inherited
|
|
26
|
+
* by the panel and its rows: the Popover set (`popoverCssVariables`). An inline Menu has none.
|
|
27
|
+
*/
|
|
28
|
+
export const menuCssVariables = popoverCssVariables;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { useNavigation } from '../../utils/useNavigation.svelte.js';
|
|
2
|
+
import type { MenuFilter, MenuFilterOptions, MenuItem } from './menu.props.js';
|
|
3
|
+
type Navigation = ReturnType<typeof useNavigation>;
|
|
4
|
+
/** Where the search text of one menu level lives, and how a change of it is reported. */
|
|
5
|
+
export type MenuSearchOptions = {
|
|
6
|
+
/** The `filter` prop. */
|
|
7
|
+
filter: () => MenuFilter | undefined;
|
|
8
|
+
/** The controlled `search` text, `undefined` when the menu is uncontrolled. */
|
|
9
|
+
search: () => string | undefined;
|
|
10
|
+
/** Writes back to a bound `search`. */
|
|
11
|
+
write: (next: string) => void;
|
|
12
|
+
defaultSearch: () => string | undefined;
|
|
13
|
+
onSearchChange: () => ((search: string) => void) | undefined;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* The search state of a filterable menu: the field's text (controlled or not), the options of the
|
|
17
|
+
* filter, and the rows left for that text. Call during component initialisation.
|
|
18
|
+
*/
|
|
19
|
+
export declare const useMenuSearch: (opts: MenuSearchOptions) => {
|
|
20
|
+
/** Whether the menu has a search field. */
|
|
21
|
+
readonly enabled: boolean;
|
|
22
|
+
readonly options: MenuFilterOptions | undefined;
|
|
23
|
+
readonly search: string;
|
|
24
|
+
/** Edits the text; `onSearchChange` runs once per edit that changes it. */
|
|
25
|
+
set(next: string): void;
|
|
26
|
+
/** The rows that match the text, or all of them without a field. */
|
|
27
|
+
visible(items: readonly MenuItem[]): MenuItem[];
|
|
28
|
+
};
|
|
29
|
+
/** The attribute a row reports its value in, for the highlight callback. */
|
|
30
|
+
export declare const HIGHLIGHT_VALUE_ATTRIBUTE = "data-menu-value";
|
|
31
|
+
/**
|
|
32
|
+
* Reports the highlighted row of a menu list: its element, or `null` when none is. The list marks
|
|
33
|
+
* the row `data-highlighted` itself, whether the keyboard, the pointer or a filter moved it.
|
|
34
|
+
* Returns the cleanup.
|
|
35
|
+
*/
|
|
36
|
+
export declare const watchHighlight: (list: HTMLElement, report: (row: HTMLElement | null) => void) => () => void;
|
|
37
|
+
/** The value a highlighted row reports: its `data-menu-value`, else its text. */
|
|
38
|
+
export declare const rowValue: (row: HTMLElement | null) => string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* The key handler of a menu's search field. Focus stays in the field, so ArrowUp and ArrowDown
|
|
41
|
+
* only move the highlight (`virtualFocus`), Enter presses the highlighted row, and ArrowRight at
|
|
42
|
+
* the end of the text opens a highlighted submenu while ArrowLeft at its start leaves this level.
|
|
43
|
+
*/
|
|
44
|
+
export declare const createSearchKeys: (options: {
|
|
45
|
+
navigation: Navigation;
|
|
46
|
+
list: () => HTMLElement | null;
|
|
47
|
+
/** Whether text direction is right-to-left, which swaps ArrowLeft and ArrowRight. */
|
|
48
|
+
rtl: () => boolean;
|
|
49
|
+
/** Leaves this menu level; returns whether there was one to leave. */
|
|
50
|
+
leave: () => boolean;
|
|
51
|
+
}) => (event: KeyboardEvent) => void;
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createBindableValue } from '../../utils/state.svelte.js';
|
|
2
|
+
import { filterMenuItems } from './menuTree.js';
|
|
3
|
+
/**
|
|
4
|
+
* The search state of a filterable menu: the field's text (controlled or not), the options of the
|
|
5
|
+
* filter, and the rows left for that text. Call during component initialisation.
|
|
6
|
+
*/
|
|
7
|
+
export const useMenuSearch = (opts) => {
|
|
8
|
+
const state = createBindableValue(opts.search, opts.write, () => opts.defaultSearch() ?? '');
|
|
9
|
+
const config = $derived.by(() => {
|
|
10
|
+
const filter = opts.filter();
|
|
11
|
+
if (filter === undefined || filter === false)
|
|
12
|
+
return null;
|
|
13
|
+
return filter === true ? {} : filter;
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
/** Whether the menu has a search field. */
|
|
17
|
+
get enabled() {
|
|
18
|
+
return config !== null;
|
|
19
|
+
},
|
|
20
|
+
get options() {
|
|
21
|
+
return config ?? undefined;
|
|
22
|
+
},
|
|
23
|
+
get search() {
|
|
24
|
+
return state.value;
|
|
25
|
+
},
|
|
26
|
+
/** Edits the text; `onSearchChange` runs once per edit that changes it. */
|
|
27
|
+
set(next) {
|
|
28
|
+
if (next === state.value)
|
|
29
|
+
return;
|
|
30
|
+
state.value = next;
|
|
31
|
+
opts.onSearchChange()?.(next);
|
|
32
|
+
},
|
|
33
|
+
/** The rows that match the text, or all of them without a field. */
|
|
34
|
+
visible(items) {
|
|
35
|
+
return config === null ? [...items] : filterMenuItems(items, state.value, config);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
// The caret rests at the start or end of the field with nothing selected, so an arrow pointing past
|
|
40
|
+
// that edge has no text left to move through. Shift+arrow extends a selection instead.
|
|
41
|
+
const isCaretAtEdge = (field, edge, shift) => {
|
|
42
|
+
if (shift)
|
|
43
|
+
return false;
|
|
44
|
+
const { selectionStart, selectionEnd, value } = field;
|
|
45
|
+
if (selectionStart === null || selectionEnd === null || selectionStart !== selectionEnd) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return edge === 'start' ? selectionStart === 0 : selectionEnd === value.length;
|
|
49
|
+
};
|
|
50
|
+
/** The attribute a row reports its value in, for the highlight callback. */
|
|
51
|
+
export const HIGHLIGHT_VALUE_ATTRIBUTE = 'data-menu-value';
|
|
52
|
+
/**
|
|
53
|
+
* Reports the highlighted row of a menu list: its element, or `null` when none is. The list marks
|
|
54
|
+
* the row `data-highlighted` itself, whether the keyboard, the pointer or a filter moved it.
|
|
55
|
+
* Returns the cleanup.
|
|
56
|
+
*/
|
|
57
|
+
export const watchHighlight = (list, report) => {
|
|
58
|
+
let last;
|
|
59
|
+
const read = () => {
|
|
60
|
+
const row = list.querySelector('[data-highlighted="true"]');
|
|
61
|
+
if (row === last)
|
|
62
|
+
return;
|
|
63
|
+
last = row;
|
|
64
|
+
report(row);
|
|
65
|
+
};
|
|
66
|
+
const observer = new MutationObserver(read);
|
|
67
|
+
observer.observe(list, {
|
|
68
|
+
subtree: true,
|
|
69
|
+
childList: true,
|
|
70
|
+
attributes: true,
|
|
71
|
+
attributeFilter: ['data-highlighted']
|
|
72
|
+
});
|
|
73
|
+
read();
|
|
74
|
+
return () => observer.disconnect();
|
|
75
|
+
};
|
|
76
|
+
/** The value a highlighted row reports: its `data-menu-value`, else its text. */
|
|
77
|
+
export const rowValue = (row) => {
|
|
78
|
+
if (!row)
|
|
79
|
+
return undefined;
|
|
80
|
+
return row.getAttribute(HIGHLIGHT_VALUE_ATTRIBUTE) ?? row.textContent?.trim() ?? undefined;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* The key handler of a menu's search field. Focus stays in the field, so ArrowUp and ArrowDown
|
|
84
|
+
* only move the highlight (`virtualFocus`), Enter presses the highlighted row, and ArrowRight at
|
|
85
|
+
* the end of the text opens a highlighted submenu while ArrowLeft at its start leaves this level.
|
|
86
|
+
*/
|
|
87
|
+
export const createSearchKeys = (options) => {
|
|
88
|
+
const highlighted = () => options.list()?.querySelector('[data-highlighted="true"]') ?? null;
|
|
89
|
+
/** Moves the highlight one row up or down, wrapping, over rows that can take it. */
|
|
90
|
+
const move = (direction) => {
|
|
91
|
+
const { navigation } = options;
|
|
92
|
+
const count = options.list()?.querySelectorAll('[role^="menuitem"]').length ?? 0;
|
|
93
|
+
if (count === 0)
|
|
94
|
+
return;
|
|
95
|
+
const current = navigation.focusedIndex;
|
|
96
|
+
let index = current === null || current < 0 ? (direction === 1 ? -1 : count) : current;
|
|
97
|
+
for (let step = 0; step < count; step += 1) {
|
|
98
|
+
index = (index + direction + count) % count;
|
|
99
|
+
navigation.focusItem(index);
|
|
100
|
+
if (navigation.focusedIndex === index)
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return (event) => {
|
|
105
|
+
if (event.defaultPrevented || event.isComposing)
|
|
106
|
+
return;
|
|
107
|
+
if (event.altKey || event.ctrlKey || event.metaKey)
|
|
108
|
+
return;
|
|
109
|
+
const field = event.currentTarget;
|
|
110
|
+
switch (event.key) {
|
|
111
|
+
case 'ArrowDown':
|
|
112
|
+
case 'ArrowUp':
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
move(event.key === 'ArrowDown' ? 1 : -1);
|
|
115
|
+
return;
|
|
116
|
+
case 'Enter': {
|
|
117
|
+
const row = highlighted();
|
|
118
|
+
if (!row || row.getAttribute('aria-disabled') === 'true' || row.matches(':disabled'))
|
|
119
|
+
return;
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
row.click();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
case 'ArrowLeft':
|
|
125
|
+
case 'ArrowRight': {
|
|
126
|
+
const forward = (event.key === 'ArrowRight') !== options.rtl();
|
|
127
|
+
if (forward) {
|
|
128
|
+
if (!isCaretAtEdge(field, 'end', event.shiftKey))
|
|
129
|
+
return;
|
|
130
|
+
const row = highlighted();
|
|
131
|
+
if (typeof row?.onNext === 'function' && row.onNext() !== false)
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!isCaretAtEdge(field, 'start', event.shiftKey))
|
|
136
|
+
return;
|
|
137
|
+
if (options.leave())
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const menuDescription = "\n# Menu Component\n\nThe Menu component is a flexible container that renders an array of menu items including Buttons, MenuOptions, and Separators. It provides theme forwarding capabilities and manages vertical layout with configurable spacing.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\timport { Menu, type MenuItem } from 'entasis/menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile', prefix: userIcon },\n\t\t{ type: 'option', title: 'Settings', prefix: gearIcon },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Logout', color: 'danger', variant: 'ghost' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n\n<!-- With optional header and footer -->\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"px-2 pb-2 border-b mb-2\">\n\t\t\t<h3>Menu Title</h3>\n\t\t</div>\n\t{/snippet}\n\t{#snippet footer()}\n\t\t<div class=\"px-2 pt-2 border-t mt-2\">\n\t\t\t<p class=\"text-xs\">Footer content</p>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n## Props\n\n### Core Props\n- **items**: MenuItem[] (required)\n - Array of menu items to render\n - Each item must have a `type` field: 'button', 'option', or 'separator'\n - Items are spread with their respective component props\n\n- **class**: string - Additional CSS classes for the menu container\n\n- **density**: 'compact' | 'normal' | 'comfortable' (default: 'normal') - Spacing density: controls the gap between rows and is forwarded to every MenuOption row (option, submenu trigger, back control); a per-item `density` wins. Items of type 'button' render a Button, which has no density axis and is unaffected.\n\n- **size**: 'small' | 'normal' | 'large' (default: 'normal') - Type/icon scale of every MenuOption row; a per-item `size` wins. Items of type 'button' are unaffected.\n\n- **color**: Colors - Role every MenuOption row follows unless the item names its own `color`. Left undefined, each row keeps the MenuOption default.\n\nAll three axes (`density`, `size`, `color`) are inherited by submenus: a submenu is the same menu one level down and opens on the axes its parent was given.\n\n- **header**: Snippet - Optional header content rendered at the top of the menu\n\n- **footer**: Snippet - Optional footer content rendered at the bottom of the menu\n\n- **theme**: MenuThemeProps - Custom theme overrides\n - menu: Theme for the container (gap spacing, layout)\n - button: Theme forwarded to Button components\n - option: Theme forwarded to MenuOption components\n - separator: Theme forwarded to Separator components\n - submenu: Theme forwarded to submenu MenuOption triggers\n\n- **submenuMode**: 'auto' | 'popover' | 'stack' (default: 'auto')\n - auto: floating submenus normally, stacked views inside mobile-sheet popovers\n - popover: always open submenus as nested PopupMenu instances\n - stack: navigate to submenu views inside the same menu surface\n\n## MenuItem Types\n\nThe Menu accepts a discriminated union of four item types:\n\n### Button Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst buttonItem = {\n\ttype: 'button',\n\tchildren: 'Log out',\n\tvariant: 'ghost',\n\tcolor: 'danger'\n} satisfies MenuItem;\n```\n\n### MenuOption Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst optionItem = {\n\ttype: 'option',\n\ttitle: 'Profile',\n\tdescription: 'Manage your account',\n\thref: '/profile'\n} satisfies MenuItem;\n```\n\n### Separator Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst separatorItem = {\n\ttype: 'separator',\n\tcolor: 'neutral',\n\tdecorative: true\n} satisfies MenuItem;\n```\n\n### Submenu Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst submenuItem = {\n\ttype: 'submenu',\n\ttitle: 'Settings',\n\tmenu: [\n\t\t{ type: 'option', title: 'General' },\n\t\t{ type: 'option', title: 'Privacy' }\n\t],\n\topenOnHover: true,\n\tdelay: 100\n} satisfies MenuItem;\n```\n\n## Structure\n\nThe menu follows this DOM structure:\n```\n<Menu>\n\t<div role=\"menu\">\n\t\t<!-- Items rendered based on type -->\n\t\t<Button />\n\t\t<MenuOption />\n\t\t<Separator />\n\t\t<!-- ... -->\n\t</div>\n</Menu>\n```\n\n## Examples\n\n### Simple Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { fileIcon } from 'entasis/icons/file';\n\timport { folderIcon } from 'entasis/icons/folder';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'New File', prefix: fileIcon },\n\t\t{ type: 'option', title: 'Open...', prefix: folderIcon },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Exit', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Buttons\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'button', children: 'Save', variant: 'solid', color: 'primary' },\n\t\t{ type: 'button', children: 'Cancel', variant: 'ghost' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Descriptions\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { starIcon } from 'entasis/icons/star';\n\timport { checkIcon } from 'entasis/icons/check';\n\timport { buildingIcon } from 'entasis/icons/building';\n\n\tconst items = [\n\t\t{ \n\t\t\ttype: 'option',\n\t\t\ttitle: 'Pro Plan',\n\t\t\tdescription: 'For growing teams',\n\t\t\tprefix: starIcon,\n\t\t\tsuffix: checkIcon\n\t\t},\n\t\t{ \n\t\t\ttype: 'option',\n\t\t\ttitle: 'Enterprise',\n\t\t\tdescription: 'For large organizations',\n\t\t\tprefix: buildingIcon\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Event Handlers\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tfunction handleProfile() {\n\t\tconsole.log('Profile clicked');\n\t}\n\t\n\tfunction handleLogout() {\n\t\tconsole.log('Logout clicked');\n\t}\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile', onclick: handleProfile },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Logout', onclick: handleLogout, color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Custom Theme\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst customTheme = {\n\t\troot: {\n\t\t\tbase: 'gap-3' // More spacing between items\n\t\t},\n\t\toption: {\n\t\t\troot: {\n\t\t\t\tbase: 'px-4 py-3'\n\t\t\t}\n\t\t}\n\t};\n\t\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<Menu {items} theme={customTheme} />\n```\n\n### Menu with Links\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Dashboard', href: '/dashboard' },\n\t\t{ type: 'option', title: 'Profile', href: '/profile' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'External Link', href: 'https://example.com', target: '_blank' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Submenus\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { gearIcon } from 'entasis/icons/gear';\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Dashboard' },\n\t\t{ type: 'option', title: 'Profile' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\tprefix: gearIcon,\n\t\t\ttitle: 'Settings',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'General' },\n\t\t\t\t{ type: 'option', title: 'Privacy' },\n\t\t\t\t{ type: 'option', title: 'Security' }\n\t\t\t]\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Stacked Submenus\n```svelte\n<Menu {items} submenuMode=\"stack\" />\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: 'Recent Files',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'document.txt' },\n\t\t\t\t{ type: 'option', title: 'project.js' },\n\t\t\t\t{\n\t\t\t\t\ttype: 'submenu',\n\t\t\t\t\ttitle: 'More',\n\t\t\t\t\tmenu: [\n\t\t\t\t\t\t{ type: 'option', title: 'file1.txt' },\n\t\t\t\t\t\t{ type: 'option', title: 'file2.txt' }\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Save' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Submenu with Custom Trigger Behavior\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Option 1' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'Click Only',\n\t\t\topenOnHover: false,\n\t\t\topenOnClick: true,\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\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'Hover with Delay',\n\t\t\topenOnHover: true,\n\t\t\tdelay: 500,\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<Menu {items} />\n```\n\n### Menu with Header\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile' },\n\t\t{ type: 'option', title: 'Settings' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"border-b pb-2 mb-2\">\n\t\t\t<h3 class=\"text-sm font-semibold px-2\">User Menu</h3>\n\t\t\t<p class=\"text-xs text-gray-500 px-2\">Manage your account</p>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Menu with Footer\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Item 1' },\n\t\t{ type: 'option', title: 'Item 2' },\n\t\t{ type: 'option', title: 'Item 3' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet footer()}\n\t\t<div class=\"border-t pt-2 mt-2\">\n\t\t\t<div class=\"text-xs text-gray-500 px-2\">Version 1.0.0</div>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Menu with Header and Footer\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 { signOutIcon } from 'entasis/icons/signOut';\n\n\tconst items = [\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: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"border-b pb-2 mb-2\">\n\t\t\t<div class=\"flex items-center gap-2 px-2\">\n\t\t\t\t<div class=\"w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center text-white\">\n\t\t\t\t\tJD\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"text-sm font-semibold\">John Doe</div>\n\t\t\t\t\t<div class=\"text-xs text-gray-500\">john@example.com</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t{/snippet}\n\t{#snippet footer()}\n\t\t<div class=\"border-t pt-2 mt-2\">\n\t\t\t<div class=\"text-xs text-gray-500 px-2 text-center\">\n\t\t\t\t<a href=\"/privacy\">Privacy</a> \u00B7 <a href=\"/terms\">Terms</a>\n\t\t\t</div>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Mixed Size Items\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Small Option', size: 'small' },\n\t\t{ type: 'option', title: 'Normal Option', size: 'normal' },\n\t\t{ type: 'option', title: 'Large Option', size: 'large' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Large Button', size: 'large', variant: 'solid' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Density\n```svelte\n<!-- density tightens/loosens the row gap and every option row's paddings.\n Button items are unaffected (Button has no density axis). -->\n<Menu {items} density=\"compact\" />\n<Menu {items} density=\"normal\" />\n<Menu {items} density=\"comfortable\" />\n```\n\n## Accessibility\n\n- Automatically sets `role=\"menu\"` on the container\n- Option items render `role=\"menuitem\"`; an option that passes `selected` (true or false) renders `role=\"menuitemradio\"` with `aria-checked`, so a check-marked choice is announced as checked rather than as a plain command\n- ArrowUp / ArrowDown move the highlight, Home / End jump, Enter or Space activates, ArrowRight opens a submenu and ArrowLeft closes it (mirrored in RTL)\n- Type-ahead: typing letters moves the highlight to the next item whose label starts with the typed text\n- Supports keyboard navigation through child components\n- MenuOption and Button items handle interactive states\n\n## Theme Forwarding\n\nThe Menu component forwards theme props to its child components:\n- `theme.menu` - Applied to the container (gap, layout)\n- `theme.button` - Forwarded to all Button items\n- `theme.option` - Forwarded to all MenuOption items\n- `theme.separator` - Forwarded to all Separator items\n- `theme.submenu` - Forwarded to submenu MenuOption triggers\n\nThis allows for consistent styling across all menu items while maintaining flexibility for individual customization.\n\n## Submenu Behavior\n\nSubmenu items automatically:\n- Add a caret-right icon as suffix (unless custom suffix provided)\n- Open submenus positioned to the right (right-start)\n- Support hover and click triggers (configurable)\n- Manage submenu state internally using PopupMenu\n- Support nested submenus (submenus within submenus)\n\nDefault submenu behavior:\n- Opens on hover (after 100ms delay)\n- Opens on click\n- Closes when the pointer leaves the submenu prediction cone and rectangle tolerance\n- Does not close when clicking items inside (allows multi-interaction)\n\n## Notes\n\n- The Menu component is a controlled component that renders based on the items array\n- Items are distinguished by their `type` property using TypeScript discriminated unions\n- Each item type spreads its respective component props for full flexibility\n- The menu container uses minimal styling, focusing on vertical layout and spacing\n- Theme forwarding allows global styling of all items of a specific type\n\n## Theme Customization\n\nThe Menu component uses a theme object that can be customized using the `theme` prop or by setting a global theme.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **root**: Main menu container styles\n- **button**: Theme forwarded to Button items (optional)\n- **option**: Theme forwarded to MenuOption items (optional)\n- **separator**: Theme forwarded to Separator items (optional)\n- **submenu**: Theme forwarded to submenu MenuOption triggers (optional)\n\n### Theme Type Definition\n\n```typescript\nimport type { MenuThemeProps } from 'entasis/menu';\nimport type { ButtonThemeProps } from 'entasis/button';\nimport type { MenuOptionThemeProps } from 'entasis/menu-option';\nimport type { SeparatorThemeProps } from 'entasis/separator';\n\n// Example theme customization\nconst customTheme: MenuThemeProps = {\n root: {\n base: 'flex flex-col w-full',\n density: {\n compact: 'gap-0',\n normal: 'gap-0.5',\n comfortable: 'gap-1'\n }\n },\n button: {\n root: {\n base: 'w-full justify-start'\n }\n },\n option: {\n root: {\n density: {\n normal: 'px-3 py-2'\n }\n }\n },\n separator: {\n root: {\n base: 'my-2'\n }\n }\n};\n```\n\n### Available Variants\n\n**root**:\n- base: Base classes for menu container\n- Variants:\n - density: 'compact' | 'normal' | 'comfortable' - Spacing between menu items\n\n**button** (optional):\n- Forwards theme to all Button items in the menu\n- See Button component theme documentation for available variants\n\n**option** (optional):\n- Forwards theme to all MenuOption items in the menu\n- See MenuOption component theme documentation for available variants\n\n**separator** (optional):\n- Forwards theme to all Separator items in the menu\n- See Separator component theme documentation for available variants\n\n**submenu** (optional):\n- Forwards theme to submenu MenuOption triggers\n- See MenuOption component theme documentation for available variants\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<Menu\n items={menuItems}\n theme={{\n root: {\n density: {\n normal: 'gap-2'\n }\n }\n }}\n/>\n```\n\n**Theme Forwarding to Child Components**:\n```svelte\n<Menu\n items={menuItems}\n theme={{\n root: {\n density: {\n comfortable: 'gap-3'\n }\n },\n option: {\n root: {\n density: {\n normal: 'px-4 py-3 min-h-10'\n },\n color: {\n primary: 'text-blue-600 highlight:bg-blue-50'\n }\n }\n },\n separator: {\n root: {\n base: 'my-3',\n\t\tcolor: {\n\t\t\tneutral: 'before:border-gray-200 after:border-gray-200'\n\t\t}\n }\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setMenuTheme } from './index.ts';\n import { setMenuOptionTheme } from '../MenuOption/index.ts';\n \n // The global menu theme covers the container parts (root, header, footer).\n // Option rows are themed globally through MenuOption's own setter.\n setMenuTheme({\n root: {\n density: {\n normal: 'gap-2'\n }\n }\n });\n setMenuOptionTheme({\n root: {\n base: 'rounded-lg',\n density: {\n normal: 'px-3 py-2'\n }\n }\n });\n</script>\n```\n";
|
|
1
|
+
export declare const menuDescription = "\n# Menu Component\n\nThe Menu component is a flexible container that renders an array of menu items: Buttons, MenuOptions, Separators, submenus, checkbox items, radio groups and labelled groups. It provides theme forwarding capabilities and manages vertical layout with configurable spacing.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\timport { Menu, type MenuItem } from 'entasis/menu';\n\timport { userIcon } from 'entasis/icons/user';\n\timport { gearIcon } from 'entasis/icons/gear';\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile', prefix: userIcon },\n\t\t{ type: 'option', title: 'Settings', prefix: gearIcon },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Logout', color: 'danger', variant: 'ghost' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n\n<!-- With optional header and footer -->\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"px-2 pb-2 border-b mb-2\">\n\t\t\t<h3>Menu Title</h3>\n\t\t</div>\n\t{/snippet}\n\t{#snippet footer()}\n\t\t<div class=\"px-2 pt-2 border-t mt-2\">\n\t\t\t<p class=\"text-xs\">Footer content</p>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n## Props\n\n### Core Props\n- **items**: MenuItem[] (required)\n - Array of menu items to render\n - Each item must have a `type` field: 'button', 'option', 'separator', 'submenu', 'checkbox', 'radio-group' or 'group'\n - Items are spread with their respective component props\n - Every item accepts a `key`. A row keeps its DOM node, and with it focus, the Tab stop and hover state, while rows before it are inserted, removed or reordered, as long as its key stays the same. Without a `key` the identity comes from the row's plain-text title or children, its `href` or its `textValue`, so a menu built from strings needs none. A row whose text changes when it is pressed (Mute becoming Unmute) keeps its node too, as it takes over the key of the row that disappeared in the same place. Give rows whose title is a snippet, or whose text repeats, an explicit `key`\n\n- **class**: string - Additional CSS classes for the menu container\n\n- **density**: 'compact' | 'normal' | 'comfortable' (default: 'normal') - Spacing density: controls the gap between rows and is forwarded to every MenuOption row (option, submenu trigger, back control); a per-item `density` wins. Items of type 'button' render a Button, which has no density axis and is unaffected.\n\n- **size**: 'small' | 'normal' | 'large' (default: 'normal') - Type/icon scale of every MenuOption row; a per-item `size` wins. Items of type 'button' are unaffected.\n\n- **color**: Colors - Role every MenuOption row follows unless the item names its own `color`. Left undefined, each row keeps the MenuOption default.\n\nAll three axes (`density`, `size`, `color`) are inherited by submenus: a submenu is the same menu one level down and opens on the axes its parent was given.\n\n- **header**: Snippet - Optional header content rendered at the top of the menu, outside the `role=\"menu\"` element: a field or a link in it is not a menu item\n\n- **footer**: Snippet - Optional footer content rendered at the bottom of the menu, outside the `role=\"menu\"` element: links and buttons in it are not menu items. A PopupMenu still closes when a button or link in the footer is pressed\n\n- **focusOnMount**: boolean | 'container' | 'last' - Which part takes focus when the menu mounts: `true` the first row, `'last'` the last row, `'container'` the menu itself. A PopupMenu decides from how it opened when this is left out: a keyboard open (Enter, Space, ArrowDown, Shift+F10) highlights the first row, ArrowUp the last, a pointer open focuses the menu itself, and a hover open leaves focus where it is\n\n- **filter**: boolean | { placeholder?, label?, match? } (default: false) - Adds a search field above the rows. See Filterable menus\n\n- **search** / **defaultSearch** / **onSearchChange**: the text of the search field (bindable `search`, initial `defaultSearch`, `onSearchChange(search)` once per edit)\n\n- **onHighlightChange**: (value: string | undefined) => void - Called when the highlighted row changes (keyboard, pointer or filter), with that row's `value` (its `textValue`, or its text when that is a string); `undefined` when no row is highlighted\n\n- **empty**: Snippet - Shown in place of the rows when the search matches none of them (default: \"No results found.\")\n\n- **theme**: MenuThemeProps - Custom theme overrides\n - menu: Theme for the container (gap spacing, layout)\n - button: Theme forwarded to Button components\n - option: Theme forwarded to MenuOption components\n - separator: Theme forwarded to Separator components\n - submenu: Theme forwarded to submenu MenuOption triggers\n\n- **submenuMode**: 'auto' | 'popover' | 'stack' (default: 'auto')\n - auto: floating submenus normally, stacked views inside mobile-sheet popovers\n - popover: always open submenus as nested PopupMenu instances\n - stack: navigate to submenu views inside the same menu surface\n\n## MenuItem Types\n\nThe Menu accepts a discriminated union of seven item types:\n\n### Button Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst buttonItem = {\n\ttype: 'button',\n\tchildren: 'Log out',\n\tvariant: 'ghost',\n\tcolor: 'danger'\n} satisfies MenuItem;\n```\n\n### MenuOption Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst optionItem = {\n\ttype: 'option',\n\ttitle: 'Profile',\n\tdescription: 'Manage your account',\n\thref: '/profile'\n} satisfies MenuItem;\n```\n\n`textValue` sets the text type-ahead matches when the visible text should not count, for\nexample a row that starts with a keyboard shortcut:\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst copyItem = {\n\ttype: 'option',\n\ttitle: '\u2318C Copy',\n\ttextValue: 'Copy'\n} satisfies MenuItem;\n```\n\n`closeOnClick` (default true) says whether pressing a button or option closes the PopupMenu it sits in; `false` marks the row `data-menu-keep-open=\"true\"`:\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst zoomIn = {\n\ttype: 'option',\n\ttitle: 'Zoom in',\n\tcloseOnClick: false\n} satisfies MenuItem;\n```\n\n### Separator Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst separatorItem = {\n\ttype: 'separator',\n\tcolor: 'neutral',\n\tdecorative: true\n} satisfies MenuItem;\n```\n\n### Submenu Item\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst submenuItem = {\n\ttype: 'submenu',\n\ttitle: 'Settings',\n\tmenu: [\n\t\t{ type: 'option', title: 'General' },\n\t\t{ type: 'option', title: 'Privacy' }\n\t],\n\topenOnHover: true,\n\tdelay: 100\n} satisfies MenuItem;\n```\n\n### Checkbox Item\nA row with a checked state. It is a `menuitemcheckbox` with `aria-checked`, takes `value`, `defaultValue` and `onValueChange` like the other editable components, and keeps the menu open unless `closeOnClick: true`. The check indicator stays mounted and fades out when the row is unchecked. A consumer `onclick` runs first and `preventDefault()` there refuses the toggle.\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst wordWrap = {\n\ttype: 'checkbox',\n\ttitle: 'Word wrap',\n\tdefaultValue: true,\n\tonValueChange: (next) => console.log(next)\n} satisfies MenuItem;\n```\n\n### Radio Group Item\nRadio rows that share one value, inside a `role=\"group\"` named by `label`. Each radio is a `menuitemradio`. Choosing the checked radio changes nothing; `onValueChange` reports the chosen value once. The group keeps the menu open unless `closeOnClick: true` (a radio's own `closeOnClick` wins).\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst sortBy = {\n\ttype: 'radio-group',\n\tlabel: 'Sort by',\n\tdefaultValue: 'name',\n\tonValueChange: (value) => console.log(value),\n\titems: [\n\t\t{ value: 'name', title: 'Name' },\n\t\t{ value: 'date', title: 'Date modified' }\n\t]\n} satisfies MenuItem;\n```\n\nAn option that passes `selected` still renders a `menuitemradio` for single-choice lists that keep their value elsewhere.\n\n### Group Item\nRows under a label, inside a `role=\"group\"` that the label names. The visible label is hidden from the accessibility tree, so it is not read twice. Arrow keys and type-ahead cross group boundaries.\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst recent = {\n\ttype: 'group',\n\tlabel: 'Recent',\n\titems: [\n\t\t{ type: 'option', title: 'notes.md' },\n\t\t{ type: 'option', title: 'todo.md' }\n\t]\n} satisfies MenuItem;\n```\n\n## Structure\n\nThe menu follows this DOM structure:\n```\n<Menu>\n\t<div> <!-- first element: class, data attributes -->\n\t\t<!-- header snippet -->\n\t\t<div role=\"menu\">\n\t\t\t<!-- Items rendered based on type -->\n\t\t\t<Button />\n\t\t\t<MenuOption />\n\t\t\t<div role=\"group\">...</div>\n\t\t\t<Separator />\n\t\t\t<!-- ... -->\n\t\t</div>\n\t\t<!-- footer snippet -->\n\t</div>\n</Menu>\n```\n\nWith `filter` the search field sits between the header and the `role=\"menu\"` element, and the empty message (a `role=\"status\"` region) after it.\n\n## Examples\n\n### Simple Menu\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { fileIcon } from 'entasis/icons/file';\n\timport { folderIcon } from 'entasis/icons/folder';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'New File', prefix: fileIcon },\n\t\t{ type: 'option', title: 'Open...', prefix: folderIcon },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Exit', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Buttons\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'button', children: 'Save', variant: 'solid', color: 'primary' },\n\t\t{ type: 'button', children: 'Cancel', variant: 'ghost' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Descriptions\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { starIcon } from 'entasis/icons/star';\n\timport { checkIcon } from 'entasis/icons/check';\n\timport { buildingIcon } from 'entasis/icons/building';\n\n\tconst items = [\n\t\t{ \n\t\t\ttype: 'option',\n\t\t\ttitle: 'Pro Plan',\n\t\t\tdescription: 'For growing teams',\n\t\t\tprefix: starIcon,\n\t\t\tsuffix: checkIcon\n\t\t},\n\t\t{ \n\t\t\ttype: 'option',\n\t\t\ttitle: 'Enterprise',\n\t\t\tdescription: 'For large organizations',\n\t\t\tprefix: buildingIcon\n\t\t}\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Event Handlers\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tfunction handleProfile() {\n\t\tconsole.log('Profile clicked');\n\t}\n\t\n\tfunction handleLogout() {\n\t\tconsole.log('Logout clicked');\n\t}\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile', onclick: handleProfile },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Logout', onclick: handleLogout, color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Custom Theme\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst customTheme = {\n\t\troot: {\n\t\t\tbase: 'gap-3' // More spacing between items\n\t\t},\n\t\toption: {\n\t\t\troot: {\n\t\t\t\tbase: 'px-4 py-3'\n\t\t\t}\n\t\t}\n\t};\n\t\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<Menu {items} theme={customTheme} />\n```\n\n### Menu with Links\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Dashboard', href: '/dashboard' },\n\t\t{ type: 'option', title: 'Profile', href: '/profile' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'External Link', href: 'https://example.com', target: '_blank' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Menu with Submenus\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\timport { gearIcon } from 'entasis/icons/gear';\n\t\n\tconst items = [\n\t\t{ type: 'option', title: 'Dashboard' },\n\t\t{ type: 'option', title: 'Profile' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\tprefix: gearIcon,\n\t\t\ttitle: 'Settings',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'General' },\n\t\t\t\t{ type: 'option', title: 'Privacy' },\n\t\t\t\t{ type: 'option', title: 'Security' }\n\t\t\t]\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Stacked Submenus\n```svelte\n<Menu {items} submenuMode=\"stack\" />\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: 'Recent Files',\n\t\t\tmenu: [\n\t\t\t\t{ type: 'option', title: 'document.txt' },\n\t\t\t\t{ type: 'option', title: 'project.js' },\n\t\t\t\t{\n\t\t\t\t\ttype: 'submenu',\n\t\t\t\t\ttitle: 'More',\n\t\t\t\t\tmenu: [\n\t\t\t\t\t\t{ type: 'option', title: 'file1.txt' },\n\t\t\t\t\t\t{ type: 'option', title: 'file2.txt' }\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Save' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Submenu with Custom Trigger Behavior\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Option 1' },\n\t\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'Click Only',\n\t\t\topenOnHover: false,\n\t\t\topenOnClick: true,\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\t{\n\t\t\ttype: 'submenu',\n\t\t\ttitle: 'Hover with Delay',\n\t\t\topenOnHover: true,\n\t\t\tdelay: 500,\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<Menu {items} />\n```\n\n### Menu with Header\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Profile' },\n\t\t{ type: 'option', title: 'Settings' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'option', title: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"border-b pb-2 mb-2\">\n\t\t\t<h3 class=\"text-sm font-semibold px-2\">User Menu</h3>\n\t\t\t<p class=\"text-xs text-gray-500 px-2\">Manage your account</p>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Menu with Footer\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Item 1' },\n\t\t{ type: 'option', title: 'Item 2' },\n\t\t{ type: 'option', title: 'Item 3' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet footer()}\n\t\t<div class=\"border-t pt-2 mt-2\">\n\t\t\t<div class=\"text-xs text-gray-500 px-2\">Version 1.0.0</div>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Menu with Header and Footer\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 { signOutIcon } from 'entasis/icons/signOut';\n\n\tconst items = [\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: 'Log Out', color: 'danger' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items}>\n\t{#snippet header()}\n\t\t<div class=\"border-b pb-2 mb-2\">\n\t\t\t<div class=\"flex items-center gap-2 px-2\">\n\t\t\t\t<div class=\"w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center text-white\">\n\t\t\t\t\tJD\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"text-sm font-semibold\">John Doe</div>\n\t\t\t\t\t<div class=\"text-xs text-gray-500\">john@example.com</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t{/snippet}\n\t{#snippet footer()}\n\t\t<div class=\"border-t pt-2 mt-2\">\n\t\t\t<div class=\"text-xs text-gray-500 px-2 text-center\">\n\t\t\t\t<a href=\"/privacy\">Privacy</a> \u00B7 <a href=\"/terms\">Terms</a>\n\t\t\t</div>\n\t\t</div>\n\t{/snippet}\n</Menu>\n```\n\n### Checkbox Items and Radio Groups\n```svelte\n<script lang=\"ts\">\n\timport { Menu, type MenuItem } from 'entasis/menu';\n\n\tlet minimap = $state(true);\n\tlet sort = $state('name');\n\n\tconst items: MenuItem[] = $derived([\n\t\t{\n\t\t\ttype: 'checkbox',\n\t\t\ttitle: 'Minimap',\n\t\t\tvalue: minimap,\n\t\t\tonValueChange: (next) => (minimap = next)\n\t\t},\n\t\t{ type: 'checkbox', title: 'Word wrap', defaultValue: false },\n\t\t{ type: 'separator' },\n\t\t{\n\t\t\ttype: 'radio-group',\n\t\t\tlabel: 'Sort by',\n\t\t\tvalue: sort,\n\t\t\tonValueChange: (next) => (sort = next),\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\t{ value: 'size', title: 'Size' }\n\t\t\t]\n\t\t}\n\t]);\n</script>\n\n<Menu {items} />\n```\n\n### Filterable Menu\nA search field above the rows. Typing narrows them (case and accent insensitive, over the row's `textValue`, or its text, and its `value`); a group whose rows all drop out goes too, and separators are dropped while searching. Focus stays in the field: ArrowDown and ArrowUp highlight rows (wrapping), the first match is highlighted as you type, and Enter presses the highlighted row. ArrowRight at the end of the text opens a highlighted submenu, ArrowLeft at the start leaves a submenu. A row whose title is a snippet needs a `textValue` to be found.\n```svelte\n<script lang=\"ts\">\n\timport { PopupMenu } from 'entasis/popup-menu';\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items: MenuItem[] = [\n\t\t{ type: 'option', title: 'Open file' },\n\t\t{ type: 'option', title: 'Open folder' },\n\t\t{ type: 'option', title: 'Open recent' },\n\t\t{ type: 'option', title: 'Save' },\n\t\t{ type: 'option', title: 'Save as' }\n\t];\n</script>\n\n<PopupMenu\n\ttrigger={{ content: 'Commands' }}\n\tmenu={{\n\t\titems,\n\t\tfilter: { placeholder: 'Find a command' },\n\t\tonSearchChange: (search) => console.log(search),\n\t\tonHighlightChange: (value) => console.log(value)\n\t}}\n/>\n```\n\nA submenu takes its own `filter` (a \"Move to...\" picker); it opens on its search field:\n```typescript\nimport type { MenuItem } from 'entasis/menu';\n\nconst moveTo = {\n\ttype: 'submenu',\n\ttitle: 'Move to',\n\tfilter: { placeholder: 'Pick a folder' },\n\tmenu: [\n\t\t{ type: 'option', title: 'Inbox' },\n\t\t{ type: 'option', title: 'Archive' },\n\t\t{ type: 'option', title: 'Projects' }\n\t]\n} satisfies MenuItem;\n```\n\n### Mixed Size Items\n```svelte\n<script lang=\"ts\">\n\timport type { MenuItem } from 'entasis/menu';\n\n\tconst items = [\n\t\t{ type: 'option', title: 'Small Option', size: 'small' },\n\t\t{ type: 'option', title: 'Normal Option', size: 'normal' },\n\t\t{ type: 'option', title: 'Large Option', size: 'large' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'button', children: 'Large Button', size: 'large', variant: 'solid' }\n\t] satisfies MenuItem[];\n</script>\n\n<Menu {items} />\n```\n\n### Density\n```svelte\n<!-- density tightens/loosens the row gap and every option row's paddings.\n Button items are unaffected (Button has no density axis). -->\n<Menu {items} density=\"compact\" />\n<Menu {items} density=\"normal\" />\n<Menu {items} density=\"comfortable\" />\n```\n\n## Styling hooks\n\nRows carry their state as attributes, so `data-highlighted:`, `data-disabled:` and `data-selected:` variants style them without a theme override. `data-highlighted` and `data-selected` are written as `\"true\"`; match them by presence (`[data-highlighted]`).\n\nAttributes are presence attributes (set while the state holds, omitted otherwise) unless they carry a value.\n\n**Data attributes**\n- `data-highlighted`: On a row: present while the keyboard or the pointer highlights it (the roving tab stop).\n- `data-disabled`: On a row: present while it is disabled.\n- `data-selected`: On a checkbox, radio or option row: present while it is checked or selected.\n- `data-popup-open`: On a submenu row: present while its submenu is open.\n- `data-popup-side`: On a submenu row: the submenu's `data-side` while it is placed.\n- `data-open`: On a popup menu or submenu panel: present while open.\n- `data-closed`: On a popup menu or submenu panel: present while its exit transition plays.\n- `data-entering`: On a popup menu or submenu panel: present while the enter transition plays.\n- `data-exiting`: On a popup menu or submenu panel: present while the exit transition plays.\n- `data-side`: On a popup menu or submenu panel: the side of its trigger it sits on after flipping.\n- `data-align`: On a popup menu or submenu panel: `start`, `center` or `end`.\n- `data-size`: On the root and the list: the resolved `size`.\n- `data-density`: On the root and the list: the resolved `density`.\n\n**CSS variables** (set on a popup menu's or submenu's positioned wrapper and inherited by the panel and its rows; an inline Menu has none)\n- `--available-width`: The width in px the panel can take before it reaches the viewport edges, minus 20px.\n- `--available-height`: The room in px between the trigger and the viewport edge on the panel's side, minus 20px. Cap a scrolling list with `max-height: min(240px, var(--available-height))`.\n- `--anchor-width`: The trigger's width in px, snapped to the device pixel grid.\n- `--anchor-height`: The trigger's height in px, snapped to the device pixel grid.\n- `--transform-origin`: The panel corner facing the trigger, mirrored in right-to-left documents; the point the panel scales from.\n\nThe typed maps `menuDataAttributes` and `menuCssVariables` (from `entasis/menu`) list each name with its meaning.\n\n## Accessibility\n\n- Automatically sets `role=\"menu\"` on the container\n- Option items render `role=\"menuitem\"`; checkbox items render `menuitemcheckbox` and radio items `menuitemradio`, each with `aria-checked`; an option that passes `selected` (true or false) renders `role=\"menuitemradio\"` too, so a check-marked choice is announced as checked rather than as a plain command\n- Groups and radio groups render `role=\"group\"` named (`aria-labelledby`) by their label, which is hidden from the accessibility tree. The header, footer and search field sit outside the `role=\"menu\"` element\n- ArrowUp / ArrowDown move the highlight, Home / End jump, Enter or Space activates, ArrowRight opens a submenu and ArrowLeft closes it; both are mirrored in right-to-left text, in an inline Menu as in a PopupMenu. A panel opened from a right-to-left trigger carries `dir=\"rtl\"` itself, because it is portaled out of the trigger's subtree\n- Tab inside a PopupMenu, ContextMenu or MenuBar menu closes every level and lets the browser carry on from the trigger, so focus lands on the control after it; Shift+Tab closes the menu and stays on the trigger. A field or link in the header or footer keeps Tab until the last one. Focus moving back to a row of the parent menu (a screen reader's cursor, a click) closes the submenus open beside it, so the arrow keys work there again\n- Type-ahead: typing letters moves the highlight to the next item whose label starts with the typed text. An option or submenu item's `textValue` replaces its visible text for matching (useful when the title is a snippet or the row shows a shortcut); disabled and hidden items are passed over for the next match, and the typed text starts over when focus leaves the menu\n- Disabled items and items hidden with CSS are skipped by the arrow keys, Home and End. The single Tab stop stays on the focused row element and follows the row that takes its place when the focused row is removed. Rows are keyed by identity (see `key`), so inserting, removing or reordering rows around the focused one leaves focus and the Tab stop on the same row\n- Hovering a row highlights it without moving focus. While nothing on the page has focus, the arrow keys and Home / End move focus into the hovered menu; keys typed in a text field, a button or another popup stay there, and Enter or Space never activate the hovered row. A submenu row is the exception: it still opens its submenu after the hover `delay`, but a submenu the pointer opened does not take focus, so typing in a field elsewhere carries on\n- Once focus is inside the menu, keys act on the focused row, not on the row under the pointer. When the menu panel itself has focus (a popup menu opened with the pointer), they act on the highlighted row that `aria-activedescendant` names, so Enter activates the row under the pointer\n- Arrow, Home, End, Enter and Space pressed with Alt, Ctrl or Meta are left to the browser (Alt+ArrowLeft stays Back), including in menus opened from a MenuBar; Shift does not count as a modifier\n- Supports keyboard navigation through child components\n- MenuOption and Button items handle interactive states\n\n## Theme Forwarding\n\nThe Menu component forwards theme props to its child components:\n- `theme.menu` - Applied to the container (gap, layout)\n- `theme.button` - Forwarded to all Button items\n- `theme.option` - Forwarded to all MenuOption items\n- `theme.separator` - Forwarded to all Separator items\n- `theme.submenu` - Forwarded to submenu MenuOption triggers\n\nThis allows for consistent styling across all menu items while maintaining flexibility for individual customization.\n\n## Submenu Behavior\n\nSubmenu items automatically:\n- Add a caret-right icon as suffix (unless custom suffix provided)\n- Open submenus beside their row on the reading direction's end side (`inline-end-start`: right in a left-to-right document, left in a right-to-left one); below `md` they drop below the row (`bottom-start`)\n- Fall back below their row when neither side of the menu has room (`fallbackAxisSide: 'end'`), instead of covering the menu\n- Support hover and click triggers (configurable)\n- Manage submenu state internally using PopupMenu\n- Support nested submenus (submenus within submenus)\n\nDefault submenu behavior:\n- Opens on hover (after 100ms delay)\n- Opens on click. A keyboard open (ArrowRight, Enter, Space) focuses the submenu's first row, a pointer click the submenu itself\n- A second press on an open submenu's row closes it when it came from the keyboard or assistive technology, or follows a click; a mouse click on a submenu the pointer opened keeps it open\n- On Apple platforms an open submenu's row omits `aria-expanded` (keeping `aria-haspopup` and `aria-controls`), because VoiceOver reads the trigger's state again when focus moves into the submenu\n- Closes when the pointer leaves the submenu prediction cone and rectangle tolerance\n- Closes when an item inside is chosen. Inside a PopupMenu, ContextMenu or MenuBar the submenu belongs to that menu: choosing an item at any depth closes every level at once, following the menu's closeOnItemClick. In an inline Menu, choosing an item closes the submenu and focus returns to its row\n- An item (or an ancestor) with `data-menu-keep-open=\"true\"` keeps every level open, for multi-select options: `{ type: 'option', title: 'Bold', attrs: { 'data-menu-keep-open': 'true' } }`\n\n## Notes\n\n- The Menu component is a controlled component that renders based on the items array\n- Items are distinguished by their `type` property using TypeScript discriminated unions\n- Each item type spreads its respective component props for full flexibility\n- The menu container uses minimal styling, focusing on vertical layout and spacing\n- Theme forwarding allows global styling of all items of a specific type\n\n## Theme Customization\n\nThe Menu component uses a theme object that can be customized using the `theme` prop or by setting a global theme.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **root**: Main menu container styles\n- **list**: The `role=\"menu\"` element (density gap)\n- **group** / **groupLabel**: A `role=\"group\"` and its label\n- **search** / **searchIcon** / **searchInput**: The search field of a filterable menu\n- **empty**: The message shown when a search matches nothing\n- **header** / **footer**: The header and footer slots\n- **button**: Theme forwarded to Button items (optional)\n- **option**: Theme forwarded to MenuOption items (optional)\n- **separator**: Theme forwarded to Separator items (optional)\n- **submenu**: Theme forwarded to submenu MenuOption triggers (optional)\n\n### Theme Type Definition\n\n```typescript\nimport type { MenuThemeProps } from 'entasis/menu';\nimport type { ButtonThemeProps } from 'entasis/button';\nimport type { MenuOptionThemeProps } from 'entasis/menu-option';\nimport type { SeparatorThemeProps } from 'entasis/separator';\n\n// Example theme customization\nconst customTheme: MenuThemeProps = {\n root: {\n base: 'flex flex-col w-full',\n density: {\n compact: 'gap-0',\n normal: 'gap-0.5',\n comfortable: 'gap-1'\n }\n },\n button: {\n root: {\n base: 'w-full justify-start'\n }\n },\n option: {\n root: {\n density: {\n normal: 'px-3 py-2'\n }\n }\n },\n separator: {\n root: {\n base: 'my-2'\n }\n }\n};\n```\n\n### Available Variants\n\n**root**:\n- base: Base classes for menu container\n- Variants:\n - density: 'compact' | 'normal' | 'comfortable' - Spacing between menu items\n\n**button** (optional):\n- Forwards theme to all Button items in the menu\n- See Button component theme documentation for available variants\n\n**option** (optional):\n- Forwards theme to all MenuOption items in the menu\n- See MenuOption component theme documentation for available variants\n\n**separator** (optional):\n- Forwards theme to all Separator items in the menu\n- See Separator component theme documentation for available variants\n\n**submenu** (optional):\n- Forwards theme to submenu MenuOption triggers\n- See MenuOption component theme documentation for available variants\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<Menu\n items={menuItems}\n theme={{\n root: {\n density: {\n normal: 'gap-2'\n }\n }\n }}\n/>\n```\n\n**Theme Forwarding to Child Components**:\n```svelte\n<Menu\n items={menuItems}\n theme={{\n root: {\n density: {\n comfortable: 'gap-3'\n }\n },\n option: {\n root: {\n density: {\n normal: 'px-4 py-3 min-h-10'\n },\n color: {\n primary: 'text-blue-600 highlight:bg-blue-50'\n }\n }\n },\n separator: {\n root: {\n base: 'my-3',\n\t\tcolor: {\n\t\t\tneutral: 'before:border-gray-200 after:border-gray-200'\n\t\t}\n }\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setMenuTheme } from './index.ts';\n import { setMenuOptionTheme } from '../MenuOption/index.ts';\n \n // The global menu theme covers the container parts (root, header, footer).\n // Option rows are themed globally through MenuOption's own setter.\n setMenuTheme({\n root: {\n density: {\n normal: 'gap-2'\n }\n }\n });\n setMenuOptionTheme({\n root: {\n base: 'rounded-lg',\n density: {\n normal: 'px-3 py-2'\n }\n }\n });\n</script>\n```\n";
|