entasis 0.10.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/attachments/disclosurePanel.svelte.d.ts +84 -0
- package/dist/attachments/disclosurePanel.svelte.js +277 -0
- package/dist/attachments/portal.d.ts +17 -1
- package/dist/attachments/portal.js +39 -2
- package/dist/attachments/spinnerOverlay.svelte.js +12 -0
- package/dist/attachments/transitionSize.d.ts +6 -0
- package/dist/attachments/transitionSize.js +30 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestion.svelte +131 -17
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte +26 -6
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFileStep.svelte.d.ts +6 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte +27 -53
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionFooter.svelte.d.ts +3 -4
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionHeader.svelte +19 -16
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte +180 -21
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionStep.svelte.d.ts +9 -1
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte +56 -0
- package/dist/components/AIAskUserQuestion/AIAskUserQuestionSummary.svelte.d.ts +4 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.d.ts +1 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.mcp.js +26 -8
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.props.d.ts +62 -5
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.d.ts +42 -0
- package/dist/components/AIAskUserQuestion/aiAskUserQuestion.theme.js +53 -12
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.d.ts +17 -1
- package/dist/components/AIAskUserQuestion/aiAskUserQuestionAnswers.js +56 -8
- package/dist/components/AIAskUserQuestion/index.d.ts +3 -1
- package/dist/components/AIAskUserQuestion/index.js +2 -0
- package/dist/components/AIAskUserQuestion/schemas.d.ts +44 -0
- package/dist/components/AIAskUserQuestion/schemas.js +10 -3
- package/dist/components/AIChat/AIChat.svelte +10 -0
- package/dist/components/AIChat/AIChat.svelte.d.ts +2 -2
- package/dist/components/AIChat/AIChatComposerSurface.svelte +23 -5
- package/dist/components/AIChat/AIChatComposerSurface.svelte.d.ts +5 -0
- package/dist/components/AIChat/AIChatSkeleton.svelte +29 -37
- package/dist/components/AIChat/AIChatSurface.svelte +30 -2
- package/dist/components/AIChat/AIChatSurface.svelte.d.ts +1 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte +11 -1
- package/dist/components/AIChat/AIChatThreadSurface.svelte.d.ts +3 -1
- package/dist/components/AIChat/aiChat.mcp.d.ts +1 -1
- package/dist/components/AIChat/aiChat.mcp.js +31 -15
- package/dist/components/AIChat/aiChat.props.d.ts +36 -10
- package/dist/components/AIChat/aiChat.theme.d.ts +9 -0
- package/dist/components/AIChat/aiChat.theme.js +21 -4
- package/dist/components/AIChat/aiChatSkeleton.props.d.ts +5 -0
- package/dist/components/AIChat/index.d.ts +1 -1
- package/dist/components/AIComposer/AIComposer.svelte +102 -5
- package/dist/components/AIComposer/AIComposer.svelte.d.ts +1 -0
- package/dist/components/AIComposer/AIComposerFooter.svelte +54 -12
- package/dist/components/AIComposer/AIComposerFooter.svelte.d.ts +2 -0
- package/dist/components/AIComposer/AIComposerQueue.svelte +8 -3
- package/dist/components/AIComposer/aiComposer.editor.theme.js +13 -2
- package/dist/components/AIComposer/aiComposer.mcp.d.ts +1 -1
- package/dist/components/AIComposer/aiComposer.mcp.js +15 -7
- package/dist/components/AIComposer/aiComposer.props.d.ts +27 -7
- package/dist/components/AIComposer/aiComposer.theme.d.ts +42 -3
- package/dist/components/AIComposer/aiComposer.theme.js +37 -5
- package/dist/components/AIComposer/aiComposerFileController.svelte.d.ts +20 -0
- package/dist/components/AIComposer/aiComposerFileController.svelte.js +75 -9
- package/dist/components/AIComposer/aiComposerSourceAdapter.js +22 -4
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.d.ts +12 -0
- package/dist/components/AIComposer/aiComposerSubmitController.svelte.js +16 -6
- package/dist/components/AIContext/AIContext.svelte +7 -3
- package/dist/components/AIContext/aiContext.mcp.d.ts +1 -1
- package/dist/components/AIContext/aiContext.mcp.js +1 -1
- package/dist/components/AIContext/aiContext.props.d.ts +4 -1
- package/dist/components/AIContext/aiContext.theme.d.ts +3 -0
- package/dist/components/AIContext/aiContext.theme.js +7 -2
- package/dist/components/AIConversation/AIConversation.svelte.d.ts +2 -2
- package/dist/components/AIFilePreview/aiFilePreview.theme.js +1 -1
- package/dist/components/AIMarker/AIMarker.svelte +2 -0
- package/dist/components/AIMarker/aiMarker.mcp.d.ts +1 -1
- package/dist/components/AIMarker/aiMarker.mcp.js +2 -0
- package/dist/components/AIMarker/aiMarker.props.d.ts +3 -0
- package/dist/components/AIMarker/aiMarker.theme.js +2 -2
- package/dist/components/AIMessage/AIMessage.svelte +38 -16
- package/dist/components/AIMessage/aiMessage.mcp.d.ts +1 -1
- package/dist/components/AIMessage/aiMessage.mcp.js +20 -6
- package/dist/components/AIMessage/aiMessage.props.d.ts +18 -2
- package/dist/components/AIMessage/aiMessage.theme.d.ts +51 -6
- package/dist/components/AIMessage/aiMessage.theme.js +91 -32
- package/dist/components/AIMessageActions/AIMessageActions.svelte +19 -9
- package/dist/components/AIMessageActions/aiMessageActions.mcp.d.ts +1 -1
- package/dist/components/AIMessageActions/aiMessageActions.mcp.js +11 -3
- package/dist/components/AIMessageActions/aiMessageActions.theme.js +36 -9
- package/dist/components/AIModelSelector/AIModelSelector.svelte +25 -10
- package/dist/components/AIModelSelector/aiModelSelector.mcp.d.ts +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.mcp.js +1 -1
- package/dist/components/AIModelSelector/aiModelSelector.theme.d.ts +3 -0
- package/dist/components/AIModelSelector/aiModelSelector.theme.js +7 -3
- package/dist/components/AIReasoning/AIReasoning.svelte +135 -38
- package/dist/components/AIReasoning/aiReasoning.mcp.d.ts +1 -1
- package/dist/components/AIReasoning/aiReasoning.mcp.js +11 -5
- package/dist/components/AIReasoning/aiReasoning.props.d.ts +15 -4
- package/dist/components/AIReasoning/aiReasoning.theme.d.ts +45 -0
- package/dist/components/AIReasoning/aiReasoning.theme.js +47 -7
- package/dist/components/AISuggestion/AISuggestion.svelte +2 -1
- package/dist/components/AISuggestion/AISuggestions.svelte +2 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.d.ts +1 -1
- package/dist/components/AISuggestion/aiSuggestion.mcp.js +8 -1
- package/dist/components/AISuggestion/aiSuggestion.props.d.ts +4 -1
- package/dist/components/AISuggestion/aiSuggestion.theme.js +1 -1
- package/dist/components/AISuggestion/aiSuggestions.props.d.ts +7 -0
- package/dist/components/AIThread/AIThread.svelte +378 -95
- package/dist/components/AIThread/AIThreadAskUserQuestion.svelte +1 -0
- package/dist/components/AIThread/AIThreadItems.svelte +266 -64
- package/dist/components/AIThread/AIThreadItems.svelte.d.ts +7 -3
- package/dist/components/AIThread/AIThreadMarker.svelte +8 -1
- package/dist/components/AIThread/AIThreadMarker.svelte.d.ts +1 -0
- package/dist/components/AIThread/aiThread.mcp.d.ts +1 -1
- package/dist/components/AIThread/aiThread.mcp.js +34 -20
- package/dist/components/AIThread/aiThread.props.d.ts +73 -8
- package/dist/components/AIThread/aiThread.theme.d.ts +78 -0
- package/dist/components/AIThread/aiThread.theme.js +108 -9
- package/dist/components/AIThread/index.d.ts +1 -1
- package/dist/components/AIThread/threadAskUserQuestion.d.ts +4 -1
- package/dist/components/AIThread/threadAskUserQuestion.js +8 -4
- package/dist/components/AIThread/threadRenderItems.d.ts +74 -3
- package/dist/components/AIThread/threadRenderItems.js +265 -77
- package/dist/components/AIThread/threadScrollController.d.ts +0 -8
- package/dist/components/AIThread/threadScrollController.js +2 -39
- package/dist/components/AIThread/threadTools.d.ts +11 -0
- package/dist/components/AIThread/threadTools.js +79 -0
- package/dist/components/AIThreadToc/AIThreadToc.svelte +188 -18
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte +25 -2
- package/dist/components/AIThreadToc/AIThreadTocPreview.svelte.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.d.ts +4 -2
- package/dist/components/AIThreadToc/aiThreadToc.js +17 -5
- package/dist/components/AIThreadToc/aiThreadToc.mcp.d.ts +1 -1
- package/dist/components/AIThreadToc/aiThreadToc.mcp.js +13 -3
- package/dist/components/AIThreadToc/aiThreadToc.props.d.ts +11 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.d.ts +3 -0
- package/dist/components/AIThreadToc/aiThreadToc.theme.js +15 -6
- package/dist/components/AITool/AITool.svelte +56 -21
- package/dist/components/AITool/AIToolCallList.svelte +79 -29
- package/dist/components/AITool/AIToolCallList.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolStatusMark.svelte +52 -0
- package/dist/components/AITool/AIToolStatusMark.svelte.d.ts +14 -0
- package/dist/components/AITool/AIToolValueSection.svelte +126 -28
- package/dist/components/AITool/AIToolValueSection.svelte.d.ts +6 -2
- package/dist/components/AITool/AIToolValueTree.svelte +11 -16
- package/dist/components/AITool/AIToolValueTree.svelte.d.ts +2 -3
- package/dist/components/AITool/aiTool.mcp.d.ts +1 -1
- package/dist/components/AITool/aiTool.mcp.js +36 -8
- package/dist/components/AITool/aiTool.props.d.ts +52 -6
- package/dist/components/AITool/aiTool.theme.d.ts +117 -39
- package/dist/components/AITool/aiTool.theme.js +144 -140
- package/dist/components/AITool/aiToolClock.svelte.d.ts +18 -0
- package/dist/components/AITool/aiToolClock.svelte.js +62 -0
- package/dist/components/AITool/aiToolPrimitiveThemes.d.ts +0 -2
- package/dist/components/AITool/aiToolPrimitiveThemes.js +0 -10
- package/dist/components/AITool/index.d.ts +2 -1
- package/dist/components/AITool/index.js +1 -0
- package/dist/components/AITool/toolRendering.d.ts +33 -1
- package/dist/components/AITool/toolRendering.js +179 -15
- package/dist/components/AITool/toolValueTree.d.ts +14 -1
- package/dist/components/AITool/toolValueTree.js +126 -27
- package/dist/components/Accordion/Accordion.svelte +109 -109
- package/dist/components/Accordion/Accordion.svelte.d.ts +0 -1
- package/dist/components/Accordion/AccordionPanel.svelte +64 -0
- package/dist/components/Accordion/AccordionPanel.svelte.d.ts +20 -0
- package/dist/components/Accordion/accordion.attributes.d.ts +24 -0
- package/dist/components/Accordion/accordion.attributes.js +20 -0
- package/dist/components/Accordion/accordion.mcp.d.ts +1 -1
- package/dist/components/Accordion/accordion.mcp.js +78 -22
- package/dist/components/Accordion/accordion.props.d.ts +54 -10
- package/dist/components/Accordion/accordion.theme.d.ts +3 -0
- package/dist/components/Accordion/accordion.theme.js +4 -0
- package/dist/components/Accordion/index.d.ts +1 -0
- package/dist/components/Accordion/index.js +1 -0
- package/dist/components/AudioPlayer/audioPlayerVolumeControl.slider.theme.d.ts +31 -1
- package/dist/components/Avatar/Avatar.svelte +60 -10
- package/dist/components/Avatar/AvatarGroup.svelte +9 -0
- package/dist/components/Avatar/avatar.mcp.d.ts +1 -1
- package/dist/components/Avatar/avatar.mcp.js +13 -5
- package/dist/components/Avatar/avatar.props.d.ts +28 -1
- package/dist/components/Avatar/avatar.theme.js +3 -3
- package/dist/components/Avatar/index.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.d.ts +1 -1
- package/dist/components/Breadcrumbs/breadcrumbs.mcp.js +1 -1
- package/dist/components/Button/Button.svelte +35 -15
- package/dist/components/Button/button.mcp.d.ts +1 -1
- package/dist/components/Button/button.mcp.js +8 -4
- package/dist/components/Button/button.props.d.ts +23 -8
- package/dist/components/Button/button.theme.d.ts +12 -0
- package/dist/components/Button/button.theme.js +17 -4
- package/dist/components/ButtonGroup/buttonGroup.mcp.d.ts +1 -1
- package/dist/components/ButtonGroup/buttonGroup.mcp.js +1 -1
- package/dist/components/ButtonGroup/buttonGroup.props.d.ts +4 -1
- package/dist/components/Collapsible/Collapsible.svelte +125 -19
- package/dist/components/Collapsible/collapsible.attributes.d.ts +21 -0
- package/dist/components/Collapsible/collapsible.attributes.js +17 -0
- package/dist/components/Collapsible/collapsible.mcp.d.ts +1 -1
- package/dist/components/Collapsible/collapsible.mcp.js +62 -12
- package/dist/components/Collapsible/collapsible.props.d.ts +39 -8
- package/dist/components/Collapsible/collapsible.theme.js +3 -1
- package/dist/components/Collapsible/index.d.ts +1 -0
- package/dist/components/Collapsible/index.js +1 -0
- package/dist/components/Command/Command.svelte +56 -14
- package/dist/components/Command/command.mcp.d.ts +1 -1
- package/dist/components/Command/command.mcp.js +12 -6
- package/dist/components/Command/command.props.d.ts +39 -6
- package/dist/components/Command/command.state.svelte.d.ts +40 -11
- package/dist/components/Command/command.state.svelte.js +75 -28
- package/dist/components/Command/command.theme.js +4 -3
- package/dist/components/Confirmation/Confirmation.svelte +72 -31
- package/dist/components/Confirmation/confirmation.mcp.d.ts +1 -1
- package/dist/components/Confirmation/confirmation.mcp.js +5 -4
- package/dist/components/ContextMenu/ContextMenu.svelte +126 -16
- package/dist/components/ContextMenu/contextMenu.mcp.d.ts +1 -1
- package/dist/components/ContextMenu/contextMenu.mcp.js +10 -7
- package/dist/components/ContextMenu/contextMenu.props.d.ts +13 -4
- package/dist/components/ContextMenu/contextMenu.theme.d.ts +3 -3
- package/dist/components/ContextMenu/contextMenu.theme.js +3 -2
- package/dist/components/DataTable/DataTable.svelte +4 -9
- package/dist/components/DataTable/DataTableEditor.svelte +5 -0
- package/dist/components/DataTable/DataTableFilter.svelte +1 -0
- package/dist/components/DataTable/DataTableToolbar.svelte +1 -0
- package/dist/components/DataTable/dataTable.mcp.d.ts +1 -1
- package/dist/components/DataTable/dataTable.mcp.js +4 -2
- package/dist/components/DataTable/dataTable.theme.d.ts +0 -3
- package/dist/components/DataTable/dataTable.theme.js +9 -6
- package/dist/components/Dialog/Dialog.svelte +120 -35
- package/dist/components/Dialog/Dialog.svelte.d.ts +1 -1
- package/dist/components/Dialog/DialogBackdrop.svelte +21 -1
- package/dist/components/Dialog/dialog.api.d.ts +65 -0
- package/dist/components/Dialog/dialog.api.js +1 -0
- package/dist/components/Dialog/dialog.attributes.d.ts +23 -0
- package/dist/components/Dialog/dialog.attributes.js +19 -0
- package/dist/components/Dialog/dialog.indent.d.ts +6 -0
- package/dist/components/Dialog/dialog.indent.js +16 -0
- package/dist/components/Dialog/dialog.mcp.d.ts +1 -1
- package/dist/components/Dialog/dialog.mcp.js +195 -22
- package/dist/components/Dialog/dialog.props.d.ts +102 -19
- package/dist/components/Dialog/dialog.snap.d.ts +40 -0
- package/dist/components/Dialog/dialog.snap.js +78 -0
- package/dist/components/Dialog/dialog.state.svelte.d.ts +122 -10
- package/dist/components/Dialog/dialog.state.svelte.js +525 -66
- package/dist/components/Dialog/dialog.theme.d.ts +48 -0
- package/dist/components/Dialog/dialog.theme.js +32 -9
- package/dist/components/Dialog/index.d.ts +4 -1
- package/dist/components/Dialog/index.js +1 -0
- package/dist/components/DocumentViewer/DocumentSearchControl.svelte +5 -3
- package/dist/components/DocumentViewer/documentOutput.js +2 -1
- package/dist/components/FloatingWindow/FloatingWindow.svelte +20 -32
- package/dist/components/FloatingWindow/FloatingWindow.svelte.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.d.ts +1 -1
- package/dist/components/FloatingWindow/floatingWindow.mcp.js +3 -3
- package/dist/components/FloatingWindow/floatingWindow.props.d.ts +9 -4
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.d.ts +8 -2
- package/dist/components/FloatingWindow/floatingWindow.state.svelte.js +18 -7
- package/dist/components/Form/Ask/Ask.svelte +9 -13
- package/dist/components/Form/Ask/ask.mcp.d.ts +1 -1
- package/dist/components/Form/Ask/ask.mcp.js +1 -1
- package/dist/components/Form/Ask/ask.props.d.ts +1 -1
- package/dist/components/Form/Autocomplete/Autocomplete.svelte +418 -0
- package/dist/components/Form/Autocomplete/Autocomplete.svelte.d.ts +4 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.d.ts +30 -0
- package/dist/components/Form/Autocomplete/autocomplete.items.js +64 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.d.ts +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.mcp.js +134 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.d.ts +146 -0
- package/dist/components/Form/Autocomplete/autocomplete.props.js +1 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.d.ts +213 -0
- package/dist/components/Form/Autocomplete/autocomplete.theme.js +119 -0
- package/dist/components/Form/Autocomplete/index.d.ts +3 -0
- package/dist/components/Form/Autocomplete/index.js +2 -0
- package/dist/components/Form/Calendar/CalendarInput.svelte +9 -0
- package/dist/components/Form/Calendar/CalendarMonthYearPicker.svelte +3 -0
- package/dist/components/Form/Calendar/CalendarPrimitive.svelte +5 -0
- package/dist/components/Form/Calendar/calendar.mcp.d.ts +1 -1
- package/dist/components/Form/Calendar/calendar.mcp.js +2 -1
- package/dist/components/Form/Calendar/calendarInput.props.d.ts +2 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.d.ts +3 -0
- package/dist/components/Form/Calendar/useCalendar.svelte.js +3 -0
- package/dist/components/Form/Checkbox/Checkbox.svelte +17 -2
- package/dist/components/Form/Checkbox/checkbox.mcp.d.ts +1 -1
- package/dist/components/Form/Checkbox/checkbox.mcp.js +11 -1
- package/dist/components/Form/Checkbox/checkbox.props.d.ts +12 -1
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte +69 -32
- package/dist/components/Form/CheckboxesInput/CheckboxLine.svelte.d.ts +10 -2
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte +123 -74
- package/dist/components/Form/CheckboxesInput/CheckboxesInput.svelte.d.ts +12 -12
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.d.ts +1 -1
- package/dist/components/Form/CheckboxesInput/checkboxesInput.mcp.js +11 -7
- package/dist/components/Form/CheckboxesInput/checkboxesInput.props.d.ts +25 -9
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.d.ts +12 -0
- package/dist/components/Form/CheckboxesInput/checkboxesInput.theme.js +9 -4
- package/dist/components/Form/CheckboxesInput/choiceEnter.d.ts +11 -0
- package/dist/components/Form/CheckboxesInput/choiceEnter.js +27 -0
- package/dist/components/Form/ColorInput/ColorInput.svelte +12 -3
- package/dist/components/Form/ColorInput/colorInput.mcp.d.ts +1 -1
- package/dist/components/Form/ColorInput/colorInput.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/ColorPicker.svelte +11 -2
- package/dist/components/Form/ColorPicker/ColorPickerInput.svelte +9 -0
- package/dist/components/Form/ColorPicker/colorPicker.mcp.d.ts +1 -1
- package/dist/components/Form/ColorPicker/colorPicker.mcp.js +1 -0
- package/dist/components/Form/ColorPicker/colorPicker.props.d.ts +2 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.d.ts +4 -0
- package/dist/components/Form/ColorPicker/colorPicker.state.svelte.js +12 -8
- package/dist/components/Form/Combobox/Combobox.svelte +145 -185
- package/dist/components/Form/Combobox/Combobox.svelte.d.ts +1 -1
- package/dist/components/Form/Combobox/ComboboxPopup.svelte +128 -0
- package/dist/components/Form/Combobox/ComboboxPopup.svelte.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.attributes.d.ts +34 -0
- package/dist/components/Form/Combobox/combobox.attributes.js +25 -0
- package/dist/components/Form/Combobox/combobox.items.d.ts +28 -0
- package/dist/components/Form/Combobox/combobox.items.js +68 -0
- package/dist/components/Form/Combobox/combobox.mcp.d.ts +1 -1
- package/dist/components/Form/Combobox/combobox.mcp.js +104 -13
- package/dist/components/Form/Combobox/combobox.props.d.ts +113 -19
- package/dist/components/Form/Combobox/combobox.state.svelte.d.ts +137 -0
- package/dist/components/Form/Combobox/combobox.state.svelte.js +375 -0
- package/dist/components/Form/Combobox/combobox.theme.d.ts +63 -0
- package/dist/components/Form/Combobox/combobox.theme.js +37 -1
- package/dist/components/Form/Combobox/index.d.ts +2 -1
- package/dist/components/Form/Combobox/index.js +1 -0
- package/dist/components/Form/DateInput/DateInput.svelte +11 -3
- package/dist/components/Form/DateInput/dateInput.mcp.d.ts +1 -1
- package/dist/components/Form/DateInput/dateInput.mcp.js +5 -0
- package/dist/components/Form/DateSelector/DateSelector.svelte +5 -2
- package/dist/components/Form/DateSelector/DateSelectorInput.svelte +9 -0
- package/dist/components/Form/DateSelector/dateSelector.mcp.d.ts +1 -1
- package/dist/components/Form/DateSelector/dateSelector.mcp.js +2 -2
- package/dist/components/Form/DateSelector/dateSelector.props.d.ts +2 -0
- package/dist/components/Form/Field/Field.svelte +258 -32
- package/dist/components/Form/Field/Field.svelte.d.ts +15 -6
- package/dist/components/Form/Field/FieldGroup.svelte +29 -0
- package/dist/components/Form/Field/FieldGroup.svelte.d.ts +11 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte +187 -0
- package/dist/components/Form/Field/FieldHiddenInputs.svelte.d.ts +26 -0
- package/dist/components/Form/Field/field.d.ts +75 -10
- package/dist/components/Form/Field/field.mcp.d.ts +1 -1
- package/dist/components/Form/Field/field.mcp.js +158 -18
- package/dist/components/Form/Field/field.messages.d.ts +47 -0
- package/dist/components/Form/Field/field.messages.js +64 -0
- package/dist/components/Form/Field/field.state.svelte.d.ts +117 -40
- package/dist/components/Form/Field/field.state.svelte.js +525 -16
- package/dist/components/Form/Field/field.theme.d.ts +46 -0
- package/dist/components/Form/Field/field.theme.js +33 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.d.ts +61 -0
- package/dist/components/Form/Field/fieldHiddenInputs.props.js +1 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.d.ts +14 -0
- package/dist/components/Form/Field/fieldNativeForm.svelte.js +113 -0
- package/dist/components/Form/Field/index.d.ts +5 -2
- package/dist/components/Form/Field/index.js +1 -0
- package/dist/components/Form/Field/schemas.js +7 -2
- package/dist/components/Form/File/FileInput.svelte +24 -3
- package/dist/components/Form/File/fileInput.mcp.d.ts +1 -1
- package/dist/components/Form/File/fileInput.mcp.js +1 -0
- package/dist/components/Form/Form/Form.svelte +49 -15
- package/dist/components/Form/Form/FormActions.svelte +3 -1
- package/dist/components/Form/Form/FormActions.svelte.d.ts +42 -2
- package/dist/components/Form/Form/FormFieldRenderer.svelte +96 -12
- package/dist/components/Form/Form/FormFieldRenderer.svelte.d.ts +3 -2
- package/dist/components/Form/Form/FormInputRenderer.svelte +7 -0
- package/dist/components/Form/Form/form.d.ts +84 -11
- package/dist/components/Form/Form/form.mcp.d.ts +1 -1
- package/dist/components/Form/Form/form.mcp.js +178 -12
- package/dist/components/Form/Form/form.props.d.ts +32 -1
- package/dist/components/Form/Form/form.registry.d.ts +28 -0
- package/dist/components/Form/Form/form.registry.js +59 -0
- package/dist/components/Form/Form/form.state.svelte.d.ts +1186 -420
- package/dist/components/Form/Form/form.state.svelte.js +322 -28
- package/dist/components/Form/Form/index.d.ts +4 -1
- package/dist/components/Form/Form/index.js +1 -0
- package/dist/components/Form/Form/visibility.d.ts +3130 -1863
- package/dist/components/Form/KeyValueInput/KeyValueInput.svelte +22 -10
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.d.ts +1 -1
- package/dist/components/Form/KeyValueInput/keyValueInput.mcp.js +1 -0
- package/dist/components/Form/MultiStepForm/MultiStepForm.svelte +12 -5
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.d.ts +1 -1
- package/dist/components/Form/MultiStepForm/multiStepForm.mcp.js +5 -3
- package/dist/components/Form/MultiStepForm/multiStepForm.props.d.ts +5 -0
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.d.ts +1050 -408
- package/dist/components/Form/MultiStepForm/multiStepForm.state.svelte.js +48 -24
- package/dist/components/Form/NumberInput/NumberInput.svelte +365 -46
- package/dist/components/Form/NumberInput/index.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.d.ts +1 -1
- package/dist/components/Form/NumberInput/numberInput.mcp.js +55 -30
- package/dist/components/Form/NumberInput/numberInput.props.d.ts +64 -4
- package/dist/components/Form/PasswordInput/Password.svelte +28 -1
- package/dist/components/Form/PasswordInput/index.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.d.ts +1 -1
- package/dist/components/Form/PasswordInput/passwordInput.mcp.js +20 -2
- package/dist/components/Form/PasswordInput/passwordInput.props.d.ts +23 -0
- package/dist/components/Form/PhoneInput/PhoneInput.svelte +11 -4
- package/dist/components/Form/PhoneInput/PhoneInputCountryPicker.svelte +47 -21
- package/dist/components/Form/PhoneInput/phoneInput-cdn.js +2 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.d.ts +1 -1
- package/dist/components/Form/PhoneInput/phoneInput.mcp.js +6 -2
- package/dist/components/Form/PhoneInput/phoneInputCountry.d.ts +9 -3
- package/dist/components/Form/PhoneInput/phoneInputCountry.js +34 -24
- package/dist/components/Form/PinInput/PinInput.svelte +44 -9
- package/dist/components/Form/PinInput/PinInputCells.svelte +22 -1
- package/dist/components/Form/PinInput/PinInputCells.svelte.d.ts +1 -0
- package/dist/components/Form/PinInput/index.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.d.ts +1 -1
- package/dist/components/Form/PinInput/pinInput.mcp.js +29 -6
- package/dist/components/Form/PinInput/pinInput.props.d.ts +38 -4
- package/dist/components/Form/PinInput/pinInput.state.svelte.d.ts +41 -0
- package/dist/components/Form/PinInput/pinInput.state.svelte.js +227 -24
- package/dist/components/Form/PinInput/pinInput.theme.d.ts +39 -3
- package/dist/components/Form/PinInput/pinInput.theme.js +27 -1
- package/dist/components/Form/RadioInput/RadioInput.svelte +94 -32
- package/dist/components/Form/RadioInput/RadioInput.svelte.d.ts +12 -12
- package/dist/components/Form/RadioInput/radioInput.mcp.d.ts +1 -1
- package/dist/components/Form/RadioInput/radioInput.mcp.js +12 -9
- package/dist/components/Form/RadioInput/radioInput.props.d.ts +22 -6
- package/dist/components/Form/RadioInput/radioInput.theme.d.ts +12 -0
- package/dist/components/Form/RadioInput/radioInput.theme.js +10 -5
- package/dist/components/Form/RatingInput/RatingInput.svelte +13 -4
- package/dist/components/Form/RatingInput/ratingInput.mcp.d.ts +1 -1
- package/dist/components/Form/RatingInput/ratingInput.mcp.js +3 -3
- package/dist/components/Form/RatingInput/ratingInput.props.d.ts +1 -1
- package/dist/components/Form/Select/Select.svelte +186 -48
- package/dist/components/Form/Select/Select.svelte.d.ts +23 -2
- package/dist/components/Form/Select/SelectOptionRow.svelte +69 -0
- package/dist/components/Form/Select/SelectOptionRow.svelte.d.ts +18 -0
- package/dist/components/Form/Select/index.d.ts +2 -1
- package/dist/components/Form/Select/index.js +1 -0
- package/dist/components/Form/Select/select.align.d.ts +5 -0
- package/dist/components/Form/Select/select.align.js +19 -5
- package/dist/components/Form/Select/select.attributes.d.ts +36 -0
- package/dist/components/Form/Select/select.attributes.js +27 -0
- package/dist/components/Form/Select/select.mcp.d.ts +1 -1
- package/dist/components/Form/Select/select.mcp.js +103 -18
- package/dist/components/Form/Select/select.props.d.ts +87 -10
- package/dist/components/Form/Select/select.state.svelte.d.ts +108 -17
- package/dist/components/Form/Select/select.state.svelte.js +354 -59
- package/dist/components/Form/Select/select.theme.d.ts +21 -0
- package/dist/components/Form/Select/select.theme.js +22 -0
- package/dist/components/Form/Slider/Slider.svelte +54 -14
- package/dist/components/Form/Slider/SliderMarks.svelte +1 -1
- package/dist/components/Form/Slider/SliderThumb.svelte +49 -19
- package/dist/components/Form/Slider/SliderThumb.svelte.d.ts +8 -2
- package/dist/components/Form/Slider/SliderTrack.svelte +33 -12
- package/dist/components/Form/Slider/SliderTrack.svelte.d.ts +6 -2
- package/dist/components/Form/Slider/index.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.d.ts +1 -1
- package/dist/components/Form/Slider/slider.mcp.js +55 -11
- package/dist/components/Form/Slider/slider.props.d.ts +35 -2
- package/dist/components/Form/Slider/slider.state.svelte.d.ts +66 -5
- package/dist/components/Form/Slider/slider.state.svelte.js +273 -49
- package/dist/components/Form/Slider/slider.theme.d.ts +36 -0
- package/dist/components/Form/Slider/slider.theme.js +35 -17
- package/dist/components/Form/Switch/Switch.svelte +61 -38
- package/dist/components/Form/Switch/switch.mcp.d.ts +1 -1
- package/dist/components/Form/Switch/switch.mcp.js +25 -5
- package/dist/components/Form/Switch/switch.props.d.ts +14 -1
- package/dist/components/Form/Switch/switch.theme.d.ts +12 -0
- package/dist/components/Form/Switch/switch.theme.js +8 -3
- package/dist/components/Form/TagGroup/TagGroup.svelte +8 -0
- package/dist/components/Form/TagGroup/tagGroup.mcp.d.ts +1 -1
- package/dist/components/Form/TagGroup/tagGroup.mcp.js +1 -0
- package/dist/components/Form/TagsInput/TagsInput.svelte +277 -275
- package/dist/components/Form/TagsInput/TagsInput.svelte.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.d.ts +1 -1
- package/dist/components/Form/TagsInput/tagsInput.mcp.js +31 -11
- package/dist/components/Form/TagsInput/tagsInput.props.d.ts +6 -26
- package/dist/components/Form/TagsInput/tagsInput.theme.d.ts +63 -0
- package/dist/components/Form/TagsInput/tagsInput.theme.js +37 -1
- package/dist/components/Form/TextArea/TextArea.svelte +8 -0
- package/dist/components/Form/TextArea/textArea.mcp.d.ts +1 -1
- package/dist/components/Form/TextArea/textArea.mcp.js +1 -0
- package/dist/components/Form/TextInput/TextInput.svelte +8 -1
- package/dist/components/Form/TextInput/textInput.mcp.d.ts +1 -1
- package/dist/components/Form/TextInput/textInput.mcp.js +5 -0
- package/dist/components/Form/TimeInput/TimeInput.svelte +9 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.d.ts +1 -1
- package/dist/components/Form/TimeInput/timeInput.mcp.js +31 -0
- package/dist/components/Form/VoiceInput/VoiceInput.svelte +10 -2
- package/dist/components/Form/VoiceInput/voiceInput.mcp.d.ts +1 -1
- package/dist/components/Form/VoiceInput/voiceInput.mcp.js +1 -0
- package/dist/components/GanttChart/GanttDependencyControl.svelte +4 -4
- package/dist/components/HoverCard/HoverCard.svelte +100 -10
- package/dist/components/HoverCard/hoverCard.attributes.d.ts +33 -0
- package/dist/components/HoverCard/hoverCard.attributes.js +24 -0
- package/dist/components/HoverCard/hoverCard.mcp.d.ts +1 -1
- package/dist/components/HoverCard/hoverCard.mcp.js +61 -2
- package/dist/components/HoverCard/hoverCard.props.d.ts +19 -0
- package/dist/components/HoverCard/hoverCard.theme.d.ts +12 -0
- package/dist/components/HoverCard/hoverCard.theme.js +9 -2
- package/dist/components/HoverCard/index.d.ts +1 -0
- package/dist/components/HoverCard/index.js +1 -0
- package/dist/components/ImageGallery/imageGallery.state.svelte.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.lightbox.js +40 -6
- package/dist/components/ImageZoom/imageZoom.mcp.d.ts +1 -1
- package/dist/components/ImageZoom/imageZoom.mcp.js +3 -3
- package/dist/components/ImageZoom/imageZoom.props.d.ts +10 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.d.ts +16 -4
- package/dist/components/ImageZoom/imageZoom.state.svelte.js +38 -9
- package/dist/components/Kanban/kanban.theme.js +7 -3
- package/dist/components/Layout/layoutSpacing.d.ts +2 -2
- package/dist/components/LinkPreview/LinkPreview.svelte +7 -1
- package/dist/components/LinkPreview/linkPreview.mcp.d.ts +1 -1
- package/dist/components/LinkPreview/linkPreview.mcp.js +4 -1
- package/dist/components/LinkPreview/linkPreview.props.d.ts +15 -0
- package/dist/components/LinkPreview/linkPreview.theme.d.ts +12 -0
- package/dist/components/LinkPreview/linkPreview.theme.js +9 -2
- package/dist/components/Map/maplibre-cdn.js +3 -2
- package/dist/components/Markdown/markdown.mcp.d.ts +1 -1
- package/dist/components/Markdown/markdown.mcp.js +2 -1
- package/dist/components/Markdown/markdown.theme.js +18 -9
- package/dist/components/MediaVolume/MediaVolumeControl.svelte +4 -3
- package/dist/components/Menu/Menu.svelte +3 -3
- package/dist/components/Menu/Menu.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuCheckboxItem.svelte +87 -0
- package/dist/components/Menu/MenuCheckboxItem.svelte.d.ts +16 -0
- package/dist/components/Menu/MenuFloating.svelte +421 -74
- package/dist/components/Menu/MenuFloating.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuMirroredIcon.svelte +9 -0
- package/dist/components/Menu/MenuMirroredIcon.svelte.d.ts +7 -0
- package/dist/components/Menu/MenuRadioGroup.svelte +102 -0
- package/dist/components/Menu/MenuRadioGroup.svelte.d.ts +18 -0
- package/dist/components/Menu/MenuSearchField.svelte +54 -0
- package/dist/components/Menu/MenuSearchField.svelte.d.ts +20 -0
- package/dist/components/Menu/MenuStacked.svelte +404 -158
- package/dist/components/Menu/MenuStacked.svelte.d.ts +1 -1
- package/dist/components/Menu/MenuStackedBackHeader.svelte +6 -1
- package/dist/components/Menu/index.d.ts +2 -1
- package/dist/components/Menu/index.js +1 -0
- package/dist/components/Menu/menu.attributes.d.ts +37 -0
- package/dist/components/Menu/menu.attributes.js +28 -0
- package/dist/components/Menu/menu.filter.svelte.d.ts +52 -0
- package/dist/components/Menu/menu.filter.svelte.js +143 -0
- package/dist/components/Menu/menu.mcp.d.ts +1 -1
- package/dist/components/Menu/menu.mcp.js +227 -17
- package/dist/components/Menu/menu.platform.d.ts +5 -0
- package/dist/components/Menu/menu.platform.js +11 -0
- package/dist/components/Menu/menu.props.d.ts +172 -9
- package/dist/components/Menu/menu.theme.d.ts +147 -0
- package/dist/components/Menu/menu.theme.js +101 -0
- package/dist/components/Menu/menuTree.d.ts +35 -1
- package/dist/components/Menu/menuTree.js +158 -1
- package/dist/components/MenuBar/menuBar.mcp.d.ts +1 -1
- package/dist/components/MenuBar/menuBar.mcp.js +4 -2
- package/dist/components/MenuBar/menuBar.state.svelte.js +28 -10
- package/dist/components/MenuOption/MenuOption.svelte +5 -1
- package/dist/components/MenuOption/menuOption.mcp.d.ts +1 -1
- package/dist/components/MenuOption/menuOption.mcp.js +8 -0
- package/dist/components/MenuOption/menuOption.props.d.ts +12 -0
- package/dist/components/MenuOption/menuOption.theme.d.ts +18 -0
- package/dist/components/MenuOption/menuOption.theme.js +24 -4
- package/dist/components/Mermaid/mermaid.mcp.d.ts +1 -1
- package/dist/components/Mermaid/mermaid.mcp.js +8 -8
- package/dist/components/Mermaid/mermaid.props.d.ts +3 -4
- package/dist/components/Mermaid/mermaid.state.svelte.d.ts +20 -19
- package/dist/components/Mermaid/mermaid.state.svelte.js +80 -243
- package/dist/components/Mermaid/mermaid.theme.js +26 -1
- package/dist/components/MetadataList/MetadataList.svelte.d.ts +1 -1
- package/dist/components/Meter/Meter.svelte +110 -24
- package/dist/components/Meter/Meter.svelte.d.ts +12 -12
- package/dist/components/Meter/meter.mcp.d.ts +1 -1
- package/dist/components/Meter/meter.mcp.js +23 -37
- package/dist/components/Meter/meter.props.d.ts +36 -44
- package/dist/components/NavigationMenu/NavigationMenu.svelte +181 -0
- package/dist/components/NavigationMenu/NavigationMenu.svelte.d.ts +25 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte +141 -0
- package/dist/components/NavigationMenu/NavigationMenuContent.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte +75 -0
- package/dist/components/NavigationMenu/NavigationMenuTrigger.svelte.d.ts +13 -0
- package/dist/components/NavigationMenu/index.d.ts +4 -0
- package/dist/components/NavigationMenu/index.js +3 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.d.ts +24 -0
- package/dist/components/NavigationMenu/navigationMenu.attributes.js +21 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.d.ts +1 -0
- package/dist/components/NavigationMenu/navigationMenu.mcp.js +138 -0
- package/dist/components/NavigationMenu/navigationMenu.props.d.ts +129 -0
- package/dist/components/NavigationMenu/navigationMenu.props.js +1 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.d.ts +163 -0
- package/dist/components/NavigationMenu/navigationMenu.state.svelte.js +721 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.d.ts +326 -0
- package/dist/components/NavigationMenu/navigationMenu.theme.js +239 -0
- package/dist/components/Overlay/Overlay.svelte +19 -30
- package/dist/components/Overlay/index.d.ts +1 -0
- package/dist/components/Overlay/index.js +1 -0
- package/dist/components/Overlay/overlay.attributes.d.ts +16 -0
- package/dist/components/Overlay/overlay.attributes.js +14 -0
- package/dist/components/Overlay/overlay.mcp.d.ts +1 -1
- package/dist/components/Overlay/overlay.mcp.js +21 -3
- package/dist/components/Overlay/overlay.props.d.ts +8 -4
- package/dist/components/Popover/Popover.svelte +163 -52
- package/dist/components/Popover/Popover.svelte.d.ts +23 -2
- package/dist/components/Popover/PopoverSession.svelte +12 -0
- package/dist/components/Popover/PopoverSession.svelte.d.ts +7 -0
- package/dist/components/Popover/index.d.ts +10 -2
- package/dist/components/Popover/index.js +4 -1
- package/dist/components/Popover/popover.api.d.ts +83 -0
- package/dist/components/Popover/popover.api.js +1 -0
- package/dist/components/Popover/popover.attributes.d.ts +32 -0
- package/dist/components/Popover/popover.attributes.js +28 -0
- package/dist/components/Popover/popover.claims.d.ts +19 -0
- package/dist/components/Popover/popover.claims.js +45 -0
- package/dist/components/Popover/popover.mcp.d.ts +1 -1
- package/dist/components/Popover/popover.mcp.js +163 -31
- package/dist/components/Popover/popover.position.d.ts +226 -0
- package/dist/components/Popover/popover.position.js +402 -0
- package/dist/components/Popover/popover.props.d.ts +179 -24
- package/dist/components/Popover/popover.state.svelte.d.ts +169 -37
- package/dist/components/Popover/popover.state.svelte.js +1034 -194
- package/dist/components/Popover/popover.theme.d.ts +15 -0
- package/dist/components/Popover/popover.theme.js +27 -2
- package/dist/components/PopupMenu/PopupMenu.svelte +193 -22
- package/dist/components/PopupMenu/PopupMenu.svelte.d.ts +2 -2
- package/dist/components/PopupMenu/popupMenu.context.d.ts +42 -0
- package/dist/components/PopupMenu/popupMenu.context.js +52 -0
- package/dist/components/PopupMenu/popupMenu.mcp.d.ts +1 -1
- package/dist/components/PopupMenu/popupMenu.mcp.js +46 -6
- package/dist/components/PopupMenu/popupMenu.props.d.ts +29 -2
- package/dist/components/Progress/Progress.svelte +160 -0
- package/dist/components/Progress/Progress.svelte.d.ts +4 -0
- package/dist/components/Progress/index.d.ts +3 -0
- package/dist/components/Progress/index.js +2 -0
- package/dist/components/Progress/progress.mcp.d.ts +1 -0
- package/dist/components/Progress/progress.mcp.js +101 -0
- package/dist/components/Progress/progress.props.d.ts +79 -0
- package/dist/components/Progress/progress.props.js +1 -0
- package/dist/components/Progress/progress.theme.d.ts +129 -0
- package/dist/components/Progress/progress.theme.js +83 -0
- package/dist/components/ProgressCircle/ProgressCircle.svelte +51 -6
- package/dist/components/ProgressCircle/progressCircle.mcp.d.ts +1 -1
- package/dist/components/ProgressCircle/progressCircle.mcp.js +18 -4
- package/dist/components/ProgressCircle/progressCircle.props.d.ts +32 -2
- package/dist/components/ProgressCircle/progressCircle.theme.d.ts +15 -3
- package/dist/components/ProgressCircle/progressCircle.theme.js +7 -2
- package/dist/components/RichTextInput/RichTextInput.svelte +19 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte +5 -1
- package/dist/components/RichTextInput/RichTextInputChrome.svelte.d.ts +2 -0
- package/dist/components/RichTextInput/RichTextInputViewport.svelte +3 -1
- package/dist/components/RichTextInput/RichTextInputViewport.svelte.d.ts +1 -0
- package/dist/components/RichTextInput/richTextInput.mcp.d.ts +1 -1
- package/dist/components/RichTextInput/richTextInput.mcp.js +1 -0
- package/dist/components/RichTextInput/suggestions.js +2 -0
- package/dist/components/ScrollArea/ScrollArea.svelte +166 -27
- package/dist/components/ScrollArea/index.d.ts +2 -1
- package/dist/components/ScrollArea/index.js +1 -0
- package/dist/components/ScrollArea/scrollArea.attributes.d.ts +25 -0
- package/dist/components/ScrollArea/scrollArea.attributes.js +21 -0
- package/dist/components/ScrollArea/scrollArea.mcp.d.ts +1 -1
- package/dist/components/ScrollArea/scrollArea.mcp.js +47 -3
- package/dist/components/ScrollArea/scrollArea.props.d.ts +33 -6
- package/dist/components/ScrollArea/scrollArea.svelte.d.ts +56 -12
- package/dist/components/ScrollArea/scrollArea.svelte.js +281 -71
- package/dist/components/ScrollArea/scrollArea.theme.js +5 -2
- package/dist/components/SegmentedControl/SegmentedControl.svelte +4 -3
- package/dist/components/SegmentedControl/segmentedControl.mcp.d.ts +1 -1
- package/dist/components/SegmentedControl/segmentedControl.mcp.js +3 -2
- package/dist/components/SelectionMenu/SelectionMenu.svelte +4 -2
- package/dist/components/Sidebar/SidebarAction.svelte +13 -3
- package/dist/components/Sidebar/SidebarAction.svelte.d.ts +2 -1
- package/dist/components/Sidebar/SidebarActivityBar.svelte +14 -7
- package/dist/components/Sidebar/SidebarFlyout.svelte +97 -0
- package/dist/components/Sidebar/SidebarFlyout.svelte.d.ts +32 -0
- package/dist/components/Sidebar/SidebarGroup.svelte +39 -15
- package/dist/components/Sidebar/SidebarMenuButton.svelte +6 -3
- package/dist/components/Sidebar/SidebarMenuItem.svelte +134 -31
- package/dist/components/Sidebar/SidebarMenuSubItem.svelte +30 -14
- package/dist/components/Sidebar/SidebarTreeNode.svelte +41 -61
- package/dist/components/Sidebar/index.d.ts +1 -0
- package/dist/components/Sidebar/index.js +1 -0
- package/dist/components/Sidebar/sidebar-position.d.ts +37 -2
- package/dist/components/Sidebar/sidebar-position.js +31 -2
- package/dist/components/Sidebar/sidebar.attributes.d.ts +33 -0
- package/dist/components/Sidebar/sidebar.attributes.js +29 -0
- package/dist/components/Sidebar/sidebar.mcp.d.ts +1 -1
- package/dist/components/Sidebar/sidebar.mcp.js +45 -10
- package/dist/components/Sidebar/sidebar.props.d.ts +28 -7
- package/dist/components/Sidebar/sidebar.theme.d.ts +51 -21
- package/dist/components/Sidebar/sidebar.theme.js +113 -62
- package/dist/components/Sidebar/sidebar.views.svelte.js +11 -18
- package/dist/components/Stepper/Stepper.svelte +2 -0
- package/dist/components/Stepper/stepper.mcp.d.ts +1 -1
- package/dist/components/Stepper/stepper.mcp.js +1 -0
- package/dist/components/Stepper/stepper.props.d.ts +5 -0
- package/dist/components/Stepper/stepper.state.svelte.d.ts +2 -0
- package/dist/components/Stepper/stepper.state.svelte.js +31 -12
- package/dist/components/Tabbar/Tabbar.svelte +55 -16
- package/dist/components/Tabbar/index.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.d.ts +1 -1
- package/dist/components/Tabbar/tabbar.mcp.js +26 -9
- package/dist/components/Tabbar/tabbar.props.d.ts +34 -5
- package/dist/components/Tabbar/tabbar.selection.svelte.d.ts +79 -0
- package/dist/components/Tabbar/tabbar.selection.svelte.js +99 -0
- package/dist/components/TableOfContents/tableOfContents.state.svelte.js +9 -7
- package/dist/components/Tabs/Tabs.svelte +73 -16
- package/dist/components/Tabs/index.d.ts +2 -1
- package/dist/components/Tabs/tabs.direction.svelte.d.ts +25 -0
- package/dist/components/Tabs/tabs.direction.svelte.js +40 -0
- package/dist/components/Tabs/tabs.mcp.d.ts +1 -1
- package/dist/components/Tabs/tabs.mcp.js +22 -4
- package/dist/components/Tabs/tabs.props.d.ts +39 -12
- package/dist/components/Tabs/tabs.theme.js +3 -1
- package/dist/components/Theme/Theme.svelte +44 -27
- package/dist/components/Theme/helper.d.ts +16 -2
- package/dist/components/Theme/helper.js +46 -4
- package/dist/components/Theme/theme.mcp.d.ts +1 -1
- package/dist/components/Theme/theme.mcp.js +103 -0
- package/dist/components/Theme/theme.props.d.ts +16 -0
- package/dist/components/Theme/theme.state.svelte.d.ts +14 -1
- package/dist/components/Theme/theme.state.svelte.js +18 -1
- package/dist/components/Toast/Toast.svelte +184 -39
- package/dist/components/Toast/Toaster.svelte +14 -10
- package/dist/components/Toast/index.d.ts +1 -0
- package/dist/components/Toast/toast.mcp.d.ts +1 -1
- package/dist/components/Toast/toast.mcp.js +47 -6
- package/dist/components/Toast/toast.state.svelte.d.ts +172 -6
- package/dist/components/Toast/toast.state.svelte.js +513 -68
- package/dist/components/Toast/toast.theme.js +1 -1
- package/dist/components/ToggleButton/ToggleButton.svelte +23 -1
- package/dist/components/ToggleButton/toggleButton.mcp.d.ts +1 -1
- package/dist/components/ToggleButton/toggleButton.mcp.js +3 -1
- package/dist/components/ToggleButton/toggleButton.props.d.ts +13 -1
- package/dist/components/ToggleButton/toggleButton.theme.d.ts +12 -0
- package/dist/components/ToggleButton/toggleButton.theme.js +15 -3
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.svelte +29 -9
- package/dist/components/ToggleButtonGroup/index.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.d.ts +1 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.mcp.js +5 -2
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.props.d.ts +19 -1
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.d.ts +12 -0
- package/dist/components/ToggleButtonGroup/toggleButtonGroup.theme.js +21 -2
- package/dist/components/ToggleMenu/ToggleMenu.svelte +57 -43
- package/dist/components/ToggleMenu/ToggleMenuGroup.svelte +1 -0
- package/dist/components/ToggleMenu/ToggleMenuMenu.svelte +9 -3
- package/dist/components/ToggleMenu/ToggleMenuRadioGroup.svelte +7 -2
- package/dist/components/ToggleMenu/toggleMenu.mcp.d.ts +1 -1
- package/dist/components/ToggleMenu/toggleMenu.mcp.js +3 -2
- package/dist/components/ToggleMenu/toggleMenu.props.d.ts +4 -1
- package/dist/components/Tooltip/Tooltip.svelte +4 -12
- package/dist/components/Tooltip/TooltipHost.svelte +136 -15
- package/dist/components/Tooltip/index.d.ts +1 -0
- package/dist/components/Tooltip/index.js +1 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.d.ts +5 -0
- package/dist/components/Tooltip/tooltip.attachment.svelte.js +215 -33
- package/dist/components/Tooltip/tooltip.attributes.d.ts +32 -0
- package/dist/components/Tooltip/tooltip.attributes.js +28 -0
- package/dist/components/Tooltip/tooltip.mcp.d.ts +1 -1
- package/dist/components/Tooltip/tooltip.mcp.js +111 -10
- package/dist/components/Tooltip/tooltip.props.d.ts +33 -2
- package/dist/components/Tooltip/tooltip.surface.d.ts +24 -0
- package/dist/components/Tooltip/tooltip.surface.js +42 -0
- package/dist/components/Tree/TreeContextMenuSurface.svelte +16 -3
- package/dist/components/Utils/BeforeHydratation.svelte +14 -3
- package/dist/components/Utils/BeforeHydratation.svelte.d.ts +2 -0
- package/dist/components/VideoPlayer/VideoPlayer.svelte.d.ts +1 -1
- package/dist/components/VideoPlayer/VideoPlayerSettings.svelte +2 -0
- package/dist/generated/componentAliases.d.ts +3 -0
- package/dist/generated/componentAliases.js +3 -0
- package/dist/generated/componentContract.d.ts +79 -34
- package/dist/generated/componentContract.js +231 -6
- package/dist/generated/componentMcpRegistry.js +6 -0
- package/dist/i18n/ar.js +107 -3
- package/dist/i18n/context.svelte.d.ts +6 -0
- package/dist/i18n/context.svelte.js +12 -0
- package/dist/i18n/de.js +101 -3
- package/dist/i18n/en.d.ts +91 -2
- package/dist/i18n/en.js +101 -3
- package/dist/i18n/es.js +101 -3
- package/dist/i18n/fr.js +101 -3
- package/dist/i18n/ja.js +101 -3
- package/dist/i18n/pt.js +101 -3
- package/dist/i18n/zh.js +101 -3
- package/dist/tailwind/geometry.js +7 -0
- package/dist/tailwind/global.js +31 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/types.mcp.d.ts +1 -1
- package/dist/types/types.mcp.js +23 -0
- package/dist/utils/cspNonce.d.ts +16 -0
- package/dist/utils/cspNonce.js +39 -0
- package/dist/utils/cva/merge.d.ts +5 -1
- package/dist/utils/cva/merge.js +6 -4
- package/dist/utils/focus.d.ts +34 -0
- package/dist/utils/focus.js +93 -0
- package/dist/utils/focusHistory.d.ts +21 -0
- package/dist/utils/focusHistory.js +99 -0
- package/dist/utils/handlers.d.ts +7 -0
- package/dist/utils/handlers.js +14 -0
- package/dist/utils/hoverIntent.d.ts +42 -0
- package/dist/utils/hoverIntent.js +57 -0
- package/dist/utils/id.d.ts +7 -0
- package/dist/utils/id.js +15 -0
- package/dist/utils/layers.svelte.d.ts +32 -4
- package/dist/utils/layers.svelte.js +214 -21
- package/dist/utils/listFilter.d.ts +44 -0
- package/dist/utils/listFilter.js +130 -0
- package/dist/utils/match.d.ts +35 -0
- package/dist/utils/match.js +36 -0
- package/dist/utils/number.d.ts +126 -0
- package/dist/utils/number.js +401 -0
- package/dist/utils/openChange.d.ts +88 -0
- package/dist/utils/openChange.js +71 -0
- package/dist/utils/openLifecycle.svelte.d.ts +41 -0
- package/dist/utils/openLifecycle.svelte.js +134 -0
- package/dist/utils/pointerDrag.d.ts +10 -0
- package/dist/utils/pointerDrag.js +37 -2
- package/dist/utils/pragmaticDragAndDrop.d.ts +2 -1
- package/dist/utils/pragmaticDragAndDrop.js +8 -3
- package/dist/utils/range.d.ts +62 -0
- package/dist/utils/range.js +70 -0
- package/dist/utils/requestNativeSubmit.d.ts +17 -0
- package/dist/utils/requestNativeSubmit.js +47 -0
- package/dist/utils/safeArea.svelte.d.ts +10 -1
- package/dist/utils/safeArea.svelte.js +19 -11
- package/dist/utils/stateAttributes.d.ts +108 -0
- package/dist/utils/stateAttributes.js +78 -0
- package/dist/utils/swipeVelocity.d.ts +32 -0
- package/dist/utils/swipeVelocity.js +59 -0
- package/dist/utils/timer.svelte.d.ts +65 -2
- package/dist/utils/timer.svelte.js +159 -25
- package/dist/utils/trigger.d.ts +41 -0
- package/dist/utils/trigger.js +103 -0
- package/dist/utils/typeahead.d.ts +9 -0
- package/dist/utils/typeahead.js +21 -9
- package/dist/utils/useDndList.svelte.d.ts +1 -1
- package/dist/utils/useDndList.svelte.js +6 -23
- package/dist/utils/useFocusScope.svelte.d.ts +29 -0
- package/dist/utils/useFocusScope.svelte.js +189 -27
- package/dist/utils/useHoverAction.svelte.d.ts +44 -4
- package/dist/utils/useHoverAction.svelte.js +161 -51
- package/dist/utils/useKeyDown.svelte.d.ts +19 -2
- package/dist/utils/useKeyDown.svelte.js +19 -12
- package/dist/utils/useListNavigation.svelte.d.ts +94 -13
- package/dist/utils/useListNavigation.svelte.js +261 -35
- package/dist/utils/useLiveAnnouncer.svelte.d.ts +77 -2
- package/dist/utils/useLiveAnnouncer.svelte.js +119 -2
- package/dist/utils/useNavigation.svelte.d.ts +36 -3
- package/dist/utils/useNavigation.svelte.js +699 -332
- package/dist/utils/usePressAndHold.svelte.d.ts +38 -0
- package/dist/utils/usePressAndHold.svelte.js +191 -0
- package/dist/utils/useScrollLock.svelte.d.ts +20 -1
- package/dist/utils/useScrollLock.svelte.js +54 -13
- package/dist/utils/useSlidingIndicator.svelte.d.ts +2 -0
- package/dist/utils/useSlidingIndicator.svelte.js +27 -5
- package/dist/utils/useTabBridge.svelte.d.ts +20 -0
- package/dist/utils/useTabBridge.svelte.js +109 -0
- package/dist/utils/values.d.ts +15 -0
- package/dist/utils/values.js +49 -0
- package/package.json +31 -2
- package/dist/generated/componentMcpRegistry.d.ts +0 -142
- package/dist/utils/useDrag.svelte.d.ts +0 -11
- package/dist/utils/useDrag.svelte.js +0 -55
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
import TextInput from '../TextInput/TextInput.svelte';
|
|
10
10
|
import type { Sizes } from '../../../types/theme.js';
|
|
11
11
|
import { useListNavigation } from '../../../utils/useListNavigation.svelte.js';
|
|
12
|
+
import { useLiveAnnouncer } from '../../../utils/useLiveAnnouncer.svelte.js';
|
|
13
|
+
import { untrack } from 'svelte';
|
|
12
14
|
import type { PhoneInputThemeProps } from './phoneInput.theme.js';
|
|
13
15
|
import { usePhoneInputTheme } from './phoneInput.theme.js';
|
|
14
16
|
import { filterPhoneCountryOptions, type PhoneCountryOption } from './phoneInputCountry.js';
|
|
@@ -44,7 +46,7 @@
|
|
|
44
46
|
const listboxId = $derived(`${id}-listbox`);
|
|
45
47
|
const classes = $derived(usePhoneInputTheme(theme));
|
|
46
48
|
const t = $derived(useI18n());
|
|
47
|
-
const filteredCountries = $derived(filterPhoneCountryOptions(countries, searchQuery));
|
|
49
|
+
const filteredCountries = $derived(filterPhoneCountryOptions(countries, searchQuery, t.locale));
|
|
48
50
|
const optionId = (iso2: string) => `${id}-option-${iso2}`;
|
|
49
51
|
|
|
50
52
|
const selectCountry = (iso2: string) => {
|
|
@@ -52,21 +54,34 @@
|
|
|
52
54
|
if (country) onSelectCountry(country);
|
|
53
55
|
};
|
|
54
56
|
|
|
57
|
+
// The selected country is highlighted when the picker opens and again when the search clears.
|
|
55
58
|
const nav = useListNavigation({
|
|
56
59
|
values: () => filteredCountries.map((country) => country.iso2),
|
|
57
60
|
optionId,
|
|
61
|
+
query: () => searchQuery,
|
|
62
|
+
anchor: () => selectedCountry?.iso2,
|
|
58
63
|
onSelect: selectCountry
|
|
59
64
|
});
|
|
60
65
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
// Result counts and the empty state reach screen readers through one persistent region,
|
|
67
|
+
// announced after typing settles (a region that mounts already filled is skipped).
|
|
68
|
+
const announcer = useLiveAnnouncer(generatedId, 'live');
|
|
69
|
+
$effect(() => {
|
|
70
|
+
const message =
|
|
71
|
+
filteredCountries.length === 0
|
|
72
|
+
? t.noCountries
|
|
73
|
+
: searchQuery.trim()
|
|
74
|
+
? t.resultsCount(filteredCountries.length)
|
|
75
|
+
: '';
|
|
76
|
+
return untrack(() => {
|
|
77
|
+
if (!message) {
|
|
78
|
+
announcer.reset();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const timer = setTimeout(() => announcer.announce(message), 250);
|
|
82
|
+
return () => clearTimeout(timer);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
70
85
|
|
|
71
86
|
const attachSearchInput: Attachment<HTMLElement> = (node) => {
|
|
72
87
|
const input = node.querySelector<HTMLInputElement>('input');
|
|
@@ -75,17 +90,13 @@
|
|
|
75
90
|
searchInput = input;
|
|
76
91
|
input.setAttribute('role', 'combobox');
|
|
77
92
|
input.setAttribute('aria-autocomplete', 'list');
|
|
78
|
-
input.setAttribute('aria-expanded', 'true');
|
|
79
93
|
input.setAttribute('aria-haspopup', 'listbox');
|
|
80
94
|
input.setAttribute('autocomplete', 'off');
|
|
81
95
|
input.setAttribute('autocorrect', 'off');
|
|
82
96
|
input.setAttribute('autocapitalize', 'off');
|
|
83
97
|
input.setAttribute('spellcheck', 'false');
|
|
84
98
|
|
|
85
|
-
const focusTimeout = setTimeout(() =>
|
|
86
|
-
input.focus();
|
|
87
|
-
highlightSelectedCountry();
|
|
88
|
-
}, 0);
|
|
99
|
+
const focusTimeout = setTimeout(() => input.focus(), 0);
|
|
89
100
|
const removeKeydown = on(input, 'keydown', nav.onKeydown);
|
|
90
101
|
|
|
91
102
|
return () => {
|
|
@@ -109,6 +120,8 @@
|
|
|
109
120
|
if (!searchInput) return;
|
|
110
121
|
|
|
111
122
|
searchInput.setAttribute('aria-controls', listboxId);
|
|
123
|
+
// The listbox is hidden while the search matches nothing, so the combobox is collapsed.
|
|
124
|
+
searchInput.setAttribute('aria-expanded', String(filteredCountries.length > 0));
|
|
112
125
|
if (nav.activeDescendant) {
|
|
113
126
|
searchInput.setAttribute('aria-activedescendant', nav.activeDescendant);
|
|
114
127
|
} else {
|
|
@@ -121,6 +134,7 @@
|
|
|
121
134
|
<TextInput
|
|
122
135
|
{@attach attachSearchInput}
|
|
123
136
|
bind:value={searchQuery}
|
|
137
|
+
inputAttrs={{ 'data-1p-ignore': true }}
|
|
124
138
|
placeholder={searchPlaceholder}
|
|
125
139
|
{size}
|
|
126
140
|
class={classes.countrySearch({ class: theme?.countrySearch?.base })}
|
|
@@ -145,7 +159,23 @@
|
|
|
145
159
|
type="auto"
|
|
146
160
|
class={classes.countryList({ class: theme?.countryList?.base })}
|
|
147
161
|
>
|
|
148
|
-
|
|
162
|
+
<!-- The empty message lives OUTSIDE the listbox: a listbox may only own options and groups
|
|
163
|
+
(aria-required-children). The persistent live region announces it and the result counts:
|
|
164
|
+
screen readers skip a live region that mounts already filled. -->
|
|
165
|
+
{#if filteredCountries.length === 0}
|
|
166
|
+
<div class={classes.countryEmpty({ size, class: theme?.countryEmpty?.base })}>
|
|
167
|
+
{t.noCountries}
|
|
168
|
+
</div>
|
|
169
|
+
{/if}
|
|
170
|
+
<span class="sr-only" {...announcer.regionAttrs}>{announcer.message}</span>
|
|
171
|
+
<!-- Kept mounted while empty (hidden) so the search input's aria-controls always resolves. -->
|
|
172
|
+
<div
|
|
173
|
+
id={listboxId}
|
|
174
|
+
role="listbox"
|
|
175
|
+
aria-label={t.countries}
|
|
176
|
+
hidden={filteredCountries.length === 0}
|
|
177
|
+
class={classes.countryListbox()}
|
|
178
|
+
>
|
|
149
179
|
{#each filteredCountries as country (country.iso2)}
|
|
150
180
|
{@const selected = country.iso2 === selectedCountry?.iso2}
|
|
151
181
|
{@const highlighted = nav.highlighted === country.iso2}
|
|
@@ -166,7 +196,7 @@
|
|
|
166
196
|
highlighted,
|
|
167
197
|
class: theme?.countryOption?.base
|
|
168
198
|
})}
|
|
169
|
-
onpointermove={() => nav.
|
|
199
|
+
onpointermove={(event) => nav.pointerHighlight(country.iso2, event)}
|
|
170
200
|
onclick={() => onSelectCountry(country)}
|
|
171
201
|
>
|
|
172
202
|
<span class={classes.countryFlag({ size, class: theme?.countryFlag?.base })}>
|
|
@@ -189,10 +219,6 @@
|
|
|
189
219
|
})}
|
|
190
220
|
{/if}
|
|
191
221
|
</Button>
|
|
192
|
-
{:else}
|
|
193
|
-
<div class={classes.countryEmpty({ size, class: theme?.countryEmpty?.base })}>
|
|
194
|
-
{t.noCountries}
|
|
195
|
-
</div>
|
|
196
222
|
{/each}
|
|
197
223
|
</div>
|
|
198
224
|
</ScrollArea>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { applyCspNonce } from '../../../utils/cspNonce.js';
|
|
1
2
|
const INTL_TEL_INPUT_CDN_VERSION = '29.1.1';
|
|
2
3
|
const INTL_TEL_INPUT_SCRIPT_ID = 'entasis-intl-tel-input-script';
|
|
3
4
|
const INTL_TEL_INPUT_SCRIPT_URL = `https://cdn.jsdelivr.net/npm/intl-tel-input@${INTL_TEL_INPUT_CDN_VERSION}/dist/js/intlTelInputWithUtils.min.js`;
|
|
@@ -50,7 +51,7 @@ function createIntlTelInputScriptPromise() {
|
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
53
|
function createIntlTelInputScript() {
|
|
53
|
-
const script = document.createElement('script');
|
|
54
|
+
const script = applyCspNonce(document.createElement('script'));
|
|
54
55
|
script.id = INTL_TEL_INPUT_SCRIPT_ID;
|
|
55
56
|
script.src = INTL_TEL_INPUT_SCRIPT_URL;
|
|
56
57
|
script.async = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const phoneInputDescription = "\n# PhoneInput Component\n\nThe PhoneInput component provides a formatted input field for phone numbers with country code selection and automatic formatting. [intl-tel-input](https://intl-tel-input.com/) is loaded from a CDN at runtime and never bundled. A strict Content-Security-Policy must allow `cdn.jsdelivr.net` in `script-src`.\n\n## Basic Usage\n\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput label=\"Phone Number\" bind:value={phone} />\n```\n\n## Props\n\nExtends all Field component props plus:\n\n### Core Props\n- **value**: string (bindable) - Phone number value\n- **country**: string (bindable, default: 'fr') - ISO country code selected in the country picker\n- **placeholder**: string - Placeholder text\n\n### Field Props (inherited)\n- **label**: string | Snippet - Field label\n- **description**: string | Snippet - Helper text\n- **error**: string - Error message\n- **required**: boolean - Mark as required\n- **disabled**: boolean - Disable input\n- **size**: 'small' | 'normal' | 'large'\n\n### Styling Props\n- **class**: string - Additional CSS classes\n- **theme**: ComponentTheme - Custom theme overrides\n\n## Structure\n\n```\n<Field>\n\t<Label />\n\t<Description />\n\t<InputContainer>\n\t\t<CountrySelector />\n\t\t<PhoneNumberInput />\n\t</InputContainer>\n\t<Error />\n</Field>\n```\n\n## Examples\n\n### Basic Phone Input\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n/>\n```\n\n### With Default Country\n```svelte\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\tcountry=\"gb\"\n/>\n```\n\n### Required Field\n```svelte\n<PhoneInput \n\tlabel=\"Contact Number\"\n\tbind:value={phone}\n\trequired\n/>\n```\n\n### With Description\n```svelte\n<PhoneInput \n\tlabel=\"Mobile Number\"\n\tdescription=\"We'll send verification code to this number\"\n\tbind:value={phone}\n/>\n```\n\n### Disabled State\n```svelte\n<PhoneInput \n\tlabel=\"Phone\"\n\tvalue=\"+1 234 567 8900\"\n\tdisabled\n/>\n```\n\n### Contact Form\n```svelte\n<script>\n\tlet contact = $state({\n\t\tname: '',\n\t\temail: '',\n\t\tphone: ''\n\t});\n</script>\n\n<form>\n\t<TextInput \n\t\tlabel=\"Name\"\n\t\tbind:value={contact.name}\n\t\trequired\n\t/>\n\t\n\t<TextInput \n\t\ttype=\"email\"\n\t\tlabel=\"Email\"\n\t\tbind:value={contact.email}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Phone\"\n\t\tbind:value={contact.phone}\n\t\trequired\n\t/>\n\t\n\t<Button type=\"submit\">Submit</Button>\n</form>\n```\n\n### Multiple Phone Numbers\n```svelte\n<script>\n\tlet phones = $state({\n\t\thome: '',\n\t\tmobile: '',\n\t\twork: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Home Phone\"\n\tbind:value={phones.home}\n/>\n\n<PhoneInput \n\tlabel=\"Mobile Phone\"\n\tbind:value={phones.mobile}\n\trequired\n/>\n\n<PhoneInput \n\tlabel=\"Work Phone\"\n\tbind:value={phones.work}\n/>\n```\n\n### With Validation\n```svelte\n<script>\n\tlet phone = $state('');\n\tlet error = $state('');\n\t\n\tfunction validatePhone(value) {\n\t\t// Simple validation - in production use a proper library\n\t\tif (!value) return '';\n\t\tif (value.length < 10) return 'Phone number is too short';\n\t\treturn '';\n\t}\n\t\n\t$effect(() => {\n\t\terror = validatePhone(phone);\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\terror={error}\n\trequired\n/>\n```\n\n### International Support\n```svelte\n<script>\n\tlet phoneNumbers = $state({\n\t\tus: '',\n\t\tuk: '',\n\t\tfr: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"US Number\"\n\tbind:value={phoneNumbers.us}\n\tcountry=\"us\"\n/>\n\n<PhoneInput \n\tlabel=\"UK Number\"\n\tbind:value={phoneNumbers.uk}\n\tcountry=\"gb\"\n/>\n\n<PhoneInput \n\tlabel=\"France Number\"\n\tbind:value={phoneNumbers.fr}\n\tcountry=\"fr\"\n/>\n```\n\n### Delivery Information\n```svelte\n<script>\n\tlet delivery = $state({\n\t\taddress: '',\n\t\tphone: '',\n\t\tnotes: ''\n\t});\n</script>\n\n<form>\n\t<TextArea \n\t\tlabel=\"Delivery Address\"\n\t\tbind:value={delivery.address}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Contact Phone\"\n\t\tdescription=\"For delivery updates\"\n\t\tbind:value={delivery.phone}\n\t\trequired\n\t/>\n\t\n\t<TextArea \n\t\tlabel=\"Delivery Notes\"\n\t\tbind:value={delivery.notes}\n\t/>\n\t\n\t<Button type=\"submit\">Confirm Order</Button>\n</form>\n```\n\n## Formatting\n\nPhoneInput automatically formats numbers based on the selected country:\n- US: (123) 456-7890\n- UK: 07123 456789\n- International: +XX XXX XXX XXXX\n\n## Country Selection\n\n- Searchable dropdown of countries\n- Country flags displayed\n- International dialing codes shown\n- Detects country from phone number\n\n## Validation\n\nPhoneInput validates:\n- **required**: Non-empty phone number\n- **format**: Valid phone number format for selected country\n- **length**: Appropriate length for country\n\n## Accessibility\n\n- Proper label association\n- Country selector is keyboard accessible\n- ARIA attributes for required state\n- Error messages announced\n- Focus management between country and number\n\n## Notes\n\n- intl-tel-input loads from a CDN on first mount; nothing is bundled. A network connection is required for formatting and validation.\n- Automatically formats as user types\n- Supports international phone numbers\n- Country code is included in value\n- Validation depends on country format\n- Works with form libraries and validation schemas\n\n## Theme Customization\n\nThe PhoneInput component uses a theme object that can be customized using the `theme` prop or by setting a global theme. It shares the same theme structure as TextInput.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **input**: Input element styles\n- **inputContainer**: Input container wrapper styles\n\n### Available Variants\n\n**input**:\n- base: Base classes applied to the input element\n- Variants:\n - size: 'small' | 'normal' | 'large' - Text size\n - disabled: boolean - Disabled state styling\n\n**inputContainer**:\n- base: Base classes for the input container (handles focus states, borders, padding)\n- Variants:\n - size: 'small' | 'normal' | 'large' - Size-based styling\n - disabled: boolean - Disabled state styling\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<PhoneInput \n label=\"Phone Number\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'border-2 rounded-lg',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n size: {\n normal: 'text-base'\n }\n }\n }}\n/>\n```\n\n**Focus State Customization**:\n\nTo recolor every focus ring in the app at once, set `designTokens.focusColor` on `Theme`\ninstead of overriding per component. `ring-focus` is the focus state role and falls back to the\ncurrent role, so it never hard-pins a color.\n\n```svelte\n<PhoneInput \n label=\"Contact Phone\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'focus-within:ring-2 focus-within:ring-focus/50 focus-within:border-focus'\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setPhoneInputTheme } from './index.ts';\n \n setPhoneInputTheme({\n inputContainer: {\n base: 'rounded-lg border-2 transition-all',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n base: 'placeholder:text-gray-400'\n }\n });\n</script>\n```\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
|
|
1
|
+
export declare const phoneInputDescription = "\n# PhoneInput Component\n\nThe PhoneInput component provides a formatted input field for phone numbers with country code selection and automatic formatting. [intl-tel-input](https://intl-tel-input.com/) is loaded from a CDN at runtime and never bundled. A strict Content-Security-Policy must allow `cdn.jsdelivr.net` in `script-src`.\n\n## Basic Usage\n\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput label=\"Phone Number\" bind:value={phone} />\n```\n\n## Props\n\nExtends all Field component props plus:\n\n### Core Props\n- **value**: string (bindable) - Phone number value\n- **country**: string (bindable, default: 'fr') - ISO country code selected in the country picker\n- **placeholder**: string - Placeholder text\n\n### Field Props (inherited)\n- **label**: string | Snippet - Field label\n- **description**: string | Snippet - Helper text\n- **error**: string - Error message\n- **required**: boolean - Mark as required\n- **disabled**: boolean - Disable input\n- **readOnly**: boolean - Make the input read-only: stays focusable and announced as read-only, refuses edits, and still validates and submits. A read-only Form, FormGroup or fieldset Field makes it read-only too\n- **size**: 'small' | 'normal' | 'large'\n\n### Styling Props\n- **class**: string - Additional CSS classes\n- **theme**: ComponentTheme - Custom theme overrides\n\n## Structure\n\n```\n<Field>\n\t<Label />\n\t<Description />\n\t<InputContainer>\n\t\t<CountrySelector />\n\t\t<PhoneNumberInput />\n\t</InputContainer>\n\t<Error />\n</Field>\n```\n\n## Examples\n\n### Basic Phone Input\n```svelte\n<script>\n\tlet phone = $state('');\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n/>\n```\n\n### With Default Country\n```svelte\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\tcountry=\"gb\"\n/>\n```\n\n### Required Field\n```svelte\n<PhoneInput \n\tlabel=\"Contact Number\"\n\tbind:value={phone}\n\trequired\n/>\n```\n\n### With Description\n```svelte\n<PhoneInput \n\tlabel=\"Mobile Number\"\n\tdescription=\"We'll send verification code to this number\"\n\tbind:value={phone}\n/>\n```\n\n### Disabled State\n```svelte\n<PhoneInput \n\tlabel=\"Phone\"\n\tvalue=\"+1 234 567 8900\"\n\tdisabled\n/>\n```\n\n### Contact Form\n```svelte\n<script>\n\tlet contact = $state({\n\t\tname: '',\n\t\temail: '',\n\t\tphone: ''\n\t});\n</script>\n\n<form>\n\t<TextInput \n\t\tlabel=\"Name\"\n\t\tbind:value={contact.name}\n\t\trequired\n\t/>\n\t\n\t<TextInput \n\t\ttype=\"email\"\n\t\tlabel=\"Email\"\n\t\tbind:value={contact.email}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Phone\"\n\t\tbind:value={contact.phone}\n\t\trequired\n\t/>\n\t\n\t<Button type=\"submit\">Submit</Button>\n</form>\n```\n\n### Multiple Phone Numbers\n```svelte\n<script>\n\tlet phones = $state({\n\t\thome: '',\n\t\tmobile: '',\n\t\twork: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Home Phone\"\n\tbind:value={phones.home}\n/>\n\n<PhoneInput \n\tlabel=\"Mobile Phone\"\n\tbind:value={phones.mobile}\n\trequired\n/>\n\n<PhoneInput \n\tlabel=\"Work Phone\"\n\tbind:value={phones.work}\n/>\n```\n\n### With Validation\n```svelte\n<script>\n\tlet phone = $state('');\n\tlet error = $state('');\n\t\n\tfunction validatePhone(value) {\n\t\t// Simple validation - in production use a proper library\n\t\tif (!value) return '';\n\t\tif (value.length < 10) return 'Phone number is too short';\n\t\treturn '';\n\t}\n\t\n\t$effect(() => {\n\t\terror = validatePhone(phone);\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"Phone Number\"\n\tbind:value={phone}\n\terror={error}\n\trequired\n/>\n```\n\n### International Support\n```svelte\n<script>\n\tlet phoneNumbers = $state({\n\t\tus: '',\n\t\tuk: '',\n\t\tfr: ''\n\t});\n</script>\n\n<PhoneInput \n\tlabel=\"US Number\"\n\tbind:value={phoneNumbers.us}\n\tcountry=\"us\"\n/>\n\n<PhoneInput \n\tlabel=\"UK Number\"\n\tbind:value={phoneNumbers.uk}\n\tcountry=\"gb\"\n/>\n\n<PhoneInput \n\tlabel=\"France Number\"\n\tbind:value={phoneNumbers.fr}\n\tcountry=\"fr\"\n/>\n```\n\n### Delivery Information\n```svelte\n<script>\n\tlet delivery = $state({\n\t\taddress: '',\n\t\tphone: '',\n\t\tnotes: ''\n\t});\n</script>\n\n<form>\n\t<TextArea \n\t\tlabel=\"Delivery Address\"\n\t\tbind:value={delivery.address}\n\t\trequired\n\t/>\n\t\n\t<PhoneInput \n\t\tlabel=\"Contact Phone\"\n\t\tdescription=\"For delivery updates\"\n\t\tbind:value={delivery.phone}\n\t\trequired\n\t/>\n\t\n\t<TextArea \n\t\tlabel=\"Delivery Notes\"\n\t\tbind:value={delivery.notes}\n\t/>\n\t\n\t<Button type=\"submit\">Confirm Order</Button>\n</form>\n```\n\n## Formatting\n\nPhoneInput automatically formats numbers based on the selected country:\n- US: (123) 456-7890\n- UK: 07123 456789\n- International: +XX XXX XXX XXXX\n\n## Country Selection\n\n- Searchable dropdown of countries: names are written, sorted and searched in the active I18n locale (`Intl.DisplayNames`), ignoring case and accents (\"cote\" finds \"C\u00F4te d\u2019Ivoire\"); the dial code (`+33`) and ISO code match too\n- The selected country is highlighted when the picker opens and again when the search is cleared\n- Country flags displayed\n- International dialing codes shown\n- Detects country from phone number\n\n## Validation\n\nPhoneInput validates:\n- **required**: Non-empty phone number\n- **format**: Valid phone number format for selected country\n- **length**: Appropriate length for country\n\n## Accessibility\n\n- Proper label association\n- Country selector is keyboard accessible: the search input is a `role=\"combobox\"` that drives the country `role=\"listbox\"` through `aria-activedescendant`\n- A persistent visually hidden `role=\"status\"` region inside the picker announces result counts (\"3 results available\") and \"No countries found\" after typing settles; the visible empty message is plain text outside the listbox, the empty listbox is hidden and the search combobox reports `aria-expanded=\"false\"`\n- ARIA attributes for required state\n- Error messages announced\n- Focus management between country and number\n\n## Notes\n\n- intl-tel-input loads from a CDN on first mount; nothing is bundled. A network connection is required for formatting and validation.\n- Automatically formats as user types\n- Supports international phone numbers\n- Country code is included in value\n- Validation depends on country format\n- Works with form libraries and validation schemas\n- Password managers and browser autofill are not blocked on the number input\n\n## Theme Customization\n\nThe PhoneInput component uses a theme object that can be customized using the `theme` prop or by setting a global theme. It shares the same theme structure as TextInput.\n\n### Theme Structure\n\nThe theme object contains the following parts:\n- **input**: Input element styles\n- **inputContainer**: Input container wrapper styles\n\n### Available Variants\n\n**input**:\n- base: Base classes applied to the input element\n- Variants:\n - size: 'small' | 'normal' | 'large' - Text size\n - disabled: boolean - Disabled state styling\n\n**inputContainer**:\n- base: Base classes for the input container (handles focus states, borders, padding)\n- Variants:\n - size: 'small' | 'normal' | 'large' - Size-based styling\n - disabled: boolean - Disabled state styling\n\n### Usage Examples\n\n**Basic Theme Override**:\n```svelte\n<PhoneInput \n label=\"Phone Number\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'border-2 rounded-lg',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n size: {\n normal: 'text-base'\n }\n }\n }}\n/>\n```\n\n**Focus State Customization**:\n\nTo recolor every focus ring in the app at once, set `designTokens.focusColor` on `Theme`\ninstead of overriding per component. `ring-focus` is the focus state role and falls back to the\ncurrent role, so it never hard-pins a color.\n\n```svelte\n<PhoneInput \n label=\"Contact Phone\"\n bind:value={phone}\n theme={{\n inputContainer: {\n base: 'focus-within:ring-2 focus-within:ring-focus/50 focus-within:border-focus'\n }\n }}\n/>\n```\n\n**Global Theme Setting**:\n```svelte\n<script>\n import { setPhoneInputTheme } from './index.ts';\n \n setPhoneInputTheme({\n inputContainer: {\n base: 'rounded-lg border-2 transition-all',\n size: {\n normal: 'px-4 py-2'\n }\n },\n input: {\n base: 'placeholder:text-gray-400'\n }\n });\n</script>\n```\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
|
|
@@ -28,6 +28,7 @@ Extends all Field component props plus:
|
|
|
28
28
|
- **error**: string - Error message
|
|
29
29
|
- **required**: boolean - Mark as required
|
|
30
30
|
- **disabled**: boolean - Disable input
|
|
31
|
+
- **readOnly**: boolean - Make the input read-only: stays focusable and announced as read-only, refuses edits, and still validates and submits. A read-only Form, FormGroup or fieldset Field makes it read-only too
|
|
31
32
|
- **size**: 'small' | 'normal' | 'large'
|
|
32
33
|
|
|
33
34
|
### Styling Props
|
|
@@ -256,7 +257,8 @@ PhoneInput automatically formats numbers based on the selected country:
|
|
|
256
257
|
|
|
257
258
|
## Country Selection
|
|
258
259
|
|
|
259
|
-
- Searchable dropdown of countries
|
|
260
|
+
- Searchable dropdown of countries: names are written, sorted and searched in the active I18n locale (\`Intl.DisplayNames\`), ignoring case and accents ("cote" finds "Côte d’Ivoire"); the dial code (\`+33\`) and ISO code match too
|
|
261
|
+
- The selected country is highlighted when the picker opens and again when the search is cleared
|
|
260
262
|
- Country flags displayed
|
|
261
263
|
- International dialing codes shown
|
|
262
264
|
- Detects country from phone number
|
|
@@ -271,7 +273,8 @@ PhoneInput validates:
|
|
|
271
273
|
## Accessibility
|
|
272
274
|
|
|
273
275
|
- Proper label association
|
|
274
|
-
- Country selector is keyboard accessible
|
|
276
|
+
- Country selector is keyboard accessible: the search input is a \`role="combobox"\` that drives the country \`role="listbox"\` through \`aria-activedescendant\`
|
|
277
|
+
- A persistent visually hidden \`role="status"\` region inside the picker announces result counts ("3 results available") and "No countries found" after typing settles; the visible empty message is plain text outside the listbox, the empty listbox is hidden and the search combobox reports \`aria-expanded="false"\`
|
|
275
278
|
- ARIA attributes for required state
|
|
276
279
|
- Error messages announced
|
|
277
280
|
- Focus management between country and number
|
|
@@ -284,6 +287,7 @@ PhoneInput validates:
|
|
|
284
287
|
- Country code is included in value
|
|
285
288
|
- Validation depends on country format
|
|
286
289
|
- Works with form libraries and validation schemas
|
|
290
|
+
- Password managers and browser autofill are not blocked on the number input
|
|
287
291
|
|
|
288
292
|
## Theme Customization
|
|
289
293
|
|
|
@@ -4,8 +4,14 @@ export type PhoneCountryOption = {
|
|
|
4
4
|
name: string;
|
|
5
5
|
dialCode: string;
|
|
6
6
|
flag: string;
|
|
7
|
-
searchText: string;
|
|
8
7
|
};
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
/**
|
|
9
|
+
* The country list with names written in `locale` and sorted by that locale's alphabet.
|
|
10
|
+
*/
|
|
11
|
+
export declare const createPhoneCountryOptions: (countries: PhoneCountry[], locale?: string) => PhoneCountryOption[];
|
|
12
|
+
/**
|
|
13
|
+
* The countries whose name, ISO code or dial code (`+33`) contains the search text, ignoring case
|
|
14
|
+
* and accents in `locale`.
|
|
15
|
+
*/
|
|
16
|
+
export declare const filterPhoneCountryOptions: (countries: PhoneCountryOption[], searchQuery: string, locale?: string) => PhoneCountryOption[];
|
|
11
17
|
export declare const getPhoneCountryOption: (countries: PhoneCountryOption[], iso2?: string | null) => PhoneCountryOption | null;
|
|
@@ -1,42 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
4
|
-
.toLowerCase();
|
|
5
|
-
const getDisplayNames = () => {
|
|
1
|
+
import { createListFilter } from '../../../utils/listFilter.js';
|
|
2
|
+
const getDisplayNames = (locale) => {
|
|
6
3
|
if (typeof Intl === 'undefined' || typeof Intl.DisplayNames !== 'function') {
|
|
7
4
|
return null;
|
|
8
5
|
}
|
|
9
6
|
try {
|
|
10
|
-
return new Intl.DisplayNames(
|
|
7
|
+
return new Intl.DisplayNames(locale, { type: 'region' });
|
|
11
8
|
}
|
|
12
9
|
catch {
|
|
13
10
|
return null;
|
|
14
11
|
}
|
|
15
12
|
};
|
|
13
|
+
const getCollator = (locale) => {
|
|
14
|
+
try {
|
|
15
|
+
return new Intl.Collator(locale);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return new Intl.Collator();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
16
21
|
const getCountryName = (iso2, displayNames) => displayNames?.of(iso2.toUpperCase()) || iso2.toUpperCase();
|
|
17
22
|
const getCountryFlag = (iso2) => iso2.toUpperCase().replace(/./g, (letter) => String.fromCodePoint(127397 + letter.charCodeAt(0)));
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The country list with names written in `locale` and sorted by that locale's alphabet.
|
|
25
|
+
*/
|
|
26
|
+
export const createPhoneCountryOptions = (countries, locale = 'en') => {
|
|
27
|
+
const displayNames = getDisplayNames(locale);
|
|
28
|
+
const collator = getCollator(locale);
|
|
20
29
|
return countries
|
|
21
|
-
.map((country) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
flag: getCountryFlag(country.iso2),
|
|
29
|
-
searchText: normalizeSearchText(`${name} ${country.iso2} ${dialCode}`)
|
|
30
|
-
};
|
|
31
|
-
})
|
|
32
|
-
.sort((firstCountry, secondCountry) => firstCountry.name.localeCompare(secondCountry.name));
|
|
30
|
+
.map((country) => ({
|
|
31
|
+
iso2: country.iso2,
|
|
32
|
+
name: getCountryName(country.iso2, displayNames),
|
|
33
|
+
dialCode: country.dialCode,
|
|
34
|
+
flag: getCountryFlag(country.iso2)
|
|
35
|
+
}))
|
|
36
|
+
.sort((firstCountry, secondCountry) => collator.compare(firstCountry.name, secondCountry.name));
|
|
33
37
|
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
/**
|
|
39
|
+
* The countries whose name, ISO code or dial code (`+33`) contains the search text, ignoring case
|
|
40
|
+
* and accents in `locale`.
|
|
41
|
+
*/
|
|
42
|
+
export const filterPhoneCountryOptions = (countries, searchQuery, locale = 'en') => {
|
|
43
|
+
const query = searchQuery.trim();
|
|
44
|
+
if (!query) {
|
|
37
45
|
return countries;
|
|
38
46
|
}
|
|
39
|
-
return
|
|
47
|
+
return createListFilter({ locale }).filter(countries, query, {
|
|
48
|
+
text: (country) => [country.name, country.iso2, `+${country.dialCode}`]
|
|
49
|
+
});
|
|
40
50
|
};
|
|
41
51
|
export const getPhoneCountryOption = (countries, iso2) => {
|
|
42
52
|
if (!iso2) {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { untrack } from 'svelte';
|
|
3
3
|
import Field from '../Field/Field.svelte';
|
|
4
|
-
import { createFieldState } from '../Field/field.state.svelte.js';
|
|
4
|
+
import { createFieldState, type FieldValidatorResult } from '../Field/field.state.svelte.js';
|
|
5
|
+
import { useI18n } from '../../../i18n/context.svelte.js';
|
|
5
6
|
import PinInputCells from './PinInputCells.svelte';
|
|
6
7
|
import type { PinInputProps } from './pinInput.props.js';
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
PIN_INPUT_DIGITS_PATTERN,
|
|
10
|
+
PIN_INPUT_TEXT_MARGIN,
|
|
11
|
+
PinInputState
|
|
12
|
+
} from './pinInput.state.svelte.js';
|
|
8
13
|
import { usePinInputTheme } from './pinInput.theme.js';
|
|
9
14
|
|
|
10
15
|
let {
|
|
@@ -18,9 +23,15 @@
|
|
|
18
23
|
inputMode = 'numeric',
|
|
19
24
|
autocomplete = 'one-time-code',
|
|
20
25
|
pasteTransformer,
|
|
26
|
+
normalizeValue,
|
|
27
|
+
onRejectInput,
|
|
28
|
+
submitOnComplete = false,
|
|
29
|
+
groups,
|
|
21
30
|
mask = false,
|
|
22
31
|
theme,
|
|
23
32
|
disabled,
|
|
33
|
+
readOnly,
|
|
34
|
+
messages,
|
|
24
35
|
name,
|
|
25
36
|
onValidate,
|
|
26
37
|
onValueChange,
|
|
@@ -30,6 +41,7 @@
|
|
|
30
41
|
description,
|
|
31
42
|
...rest
|
|
32
43
|
}: PinInputProps = $props();
|
|
44
|
+
const t = $derived(useI18n());
|
|
33
45
|
if (value === undefined) value = untrack(() => defaultValue);
|
|
34
46
|
|
|
35
47
|
const id = $props.id();
|
|
@@ -62,6 +74,12 @@
|
|
|
62
74
|
set disabled(v: boolean | undefined) {
|
|
63
75
|
disabled = v;
|
|
64
76
|
},
|
|
77
|
+
get readOnly() {
|
|
78
|
+
return readOnly;
|
|
79
|
+
},
|
|
80
|
+
get messages() {
|
|
81
|
+
return messages;
|
|
82
|
+
},
|
|
65
83
|
get required() {
|
|
66
84
|
return required;
|
|
67
85
|
},
|
|
@@ -71,9 +89,9 @@
|
|
|
71
89
|
set name(v: string | undefined) {
|
|
72
90
|
name = v;
|
|
73
91
|
},
|
|
74
|
-
onValidate: (currentValue) => {
|
|
92
|
+
onValidate: (currentValue): FieldValidatorResult => {
|
|
75
93
|
if (required && typeof currentValue === 'string' && currentValue.length < resolvedLength()) {
|
|
76
|
-
return
|
|
94
|
+
return field.messages.incomplete(resolvedLength());
|
|
77
95
|
}
|
|
78
96
|
return onValidate?.(currentValue) || false;
|
|
79
97
|
},
|
|
@@ -94,8 +112,18 @@
|
|
|
94
112
|
length: resolvedLength,
|
|
95
113
|
pattern: () => pattern,
|
|
96
114
|
pasteTransformer: () => pasteTransformer,
|
|
115
|
+
normalizeValue: () => normalizeValue,
|
|
116
|
+
onRejectInput: () => onRejectInput,
|
|
97
117
|
onComplete: () => onComplete,
|
|
98
|
-
|
|
118
|
+
// Inside a Form it validates first and keeps focus on an earlier invalid field; the code
|
|
119
|
+
// input never takes focus back. Outside one, the native form submits.
|
|
120
|
+
submit: () => () => {
|
|
121
|
+
if (field.form) void field.form.submit();
|
|
122
|
+
else (field.node as HTMLInputElement | null)?.form?.requestSubmit();
|
|
123
|
+
},
|
|
124
|
+
submitOnComplete: () => submitOnComplete,
|
|
125
|
+
disabled: () => field.disabled,
|
|
126
|
+
readOnly: () => field.readOnly
|
|
99
127
|
});
|
|
100
128
|
|
|
101
129
|
const classes = $derived(usePinInputTheme(theme));
|
|
@@ -118,10 +146,14 @@
|
|
|
118
146
|
}}
|
|
119
147
|
{...rest}
|
|
120
148
|
>
|
|
149
|
+
<!-- Digits and codes read left to right in every document direction, so the cells and the
|
|
150
|
+
native caret over the transparent input agree. -->
|
|
121
151
|
<div
|
|
152
|
+
dir="ltr"
|
|
122
153
|
data-slot="pin-input"
|
|
123
154
|
data-focused={state.isFocused}
|
|
124
155
|
data-disabled={field.disabled}
|
|
156
|
+
data-readonly={field.readOnly || undefined}
|
|
125
157
|
class={classes.root({ size: rest.size, disabled: field.disabled })}
|
|
126
158
|
>
|
|
127
159
|
<input
|
|
@@ -129,21 +161,24 @@
|
|
|
129
161
|
{@attach state.inputAttachment}
|
|
130
162
|
data-slot="pin-input-input"
|
|
131
163
|
type="text"
|
|
164
|
+
dir="ltr"
|
|
132
165
|
{id}
|
|
133
166
|
name={field.name}
|
|
134
167
|
value={state.value}
|
|
135
|
-
maxlength={state.length}
|
|
168
|
+
maxlength={state.length + PIN_INPUT_TEXT_MARGIN}
|
|
136
169
|
inputmode={inputMode}
|
|
137
170
|
{autocomplete}
|
|
138
171
|
disabled={field.disabled}
|
|
139
|
-
aria-label={label ? undefined :
|
|
140
|
-
class={classes.input()}
|
|
172
|
+
aria-label={label ? undefined : t.oneTimeCode}
|
|
173
|
+
class={classes.input({ composing: state.isComposing })}
|
|
141
174
|
data-pin-input-input
|
|
142
175
|
data-pin-input-input-mss={state.selectionStart}
|
|
143
176
|
data-pin-input-input-mse={state.selectionEnd}
|
|
144
177
|
onpointerdown={state.handlePointerDown}
|
|
145
178
|
onkeydown={state.handleKeydown}
|
|
146
179
|
oninput={state.handleInput}
|
|
180
|
+
oncompositionstart={state.handleCompositionStart}
|
|
181
|
+
oncompositionend={state.handleCompositionEnd}
|
|
147
182
|
onpaste={state.handlePaste}
|
|
148
183
|
onfocus={state.handleFocus}
|
|
149
184
|
onblur={state.handleBlur}
|
|
@@ -151,6 +186,6 @@
|
|
|
151
186
|
onkeyup={state.normalizeSelection}
|
|
152
187
|
onclick={state.normalizeSelection}
|
|
153
188
|
/>
|
|
154
|
-
<PinInputCells {state} {classes} size={rest.size} disabled={field.disabled} {mask} />
|
|
189
|
+
<PinInputCells {state} {classes} size={rest.size} disabled={field.disabled} {mask} {groups} />
|
|
155
190
|
</div>
|
|
156
191
|
</Field>
|
|
@@ -10,15 +10,29 @@
|
|
|
10
10
|
classes,
|
|
11
11
|
size,
|
|
12
12
|
disabled,
|
|
13
|
-
mask = false
|
|
13
|
+
mask = false,
|
|
14
|
+
groups
|
|
14
15
|
}: {
|
|
15
16
|
state: PinInputState;
|
|
16
17
|
classes: PinInputClasses;
|
|
17
18
|
size?: Sizes;
|
|
18
19
|
disabled?: boolean;
|
|
19
20
|
mask?: boolean;
|
|
21
|
+
groups?: number[];
|
|
20
22
|
} = $props();
|
|
21
23
|
|
|
24
|
+
// Indexes of the cells a separator follows: the end of every group but the last cell's.
|
|
25
|
+
const separatorAfter = $derived.by(() => {
|
|
26
|
+
const after: number[] = [];
|
|
27
|
+
let end = 0;
|
|
28
|
+
for (const group of groups ?? []) {
|
|
29
|
+
if (!Number.isFinite(group) || group < 1) continue;
|
|
30
|
+
end += Math.floor(group);
|
|
31
|
+
if (end < state.length) after.push(end - 1);
|
|
32
|
+
}
|
|
33
|
+
return after;
|
|
34
|
+
});
|
|
35
|
+
|
|
22
36
|
const displayValue = (char: string | null) => (mask && char ? '•' : char);
|
|
23
37
|
</script>
|
|
24
38
|
|
|
@@ -42,4 +56,11 @@
|
|
|
42
56
|
</span>
|
|
43
57
|
{/if}
|
|
44
58
|
</div>
|
|
59
|
+
{#if separatorAfter.includes(cell.index)}
|
|
60
|
+
<div
|
|
61
|
+
data-slot="pin-input-separator"
|
|
62
|
+
aria-hidden="true"
|
|
63
|
+
class={classes.separator({ size })}
|
|
64
|
+
></div>
|
|
65
|
+
{/if}
|
|
45
66
|
{/each}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default as PinInput } from './PinInput.svelte';
|
|
2
2
|
export type { PinInputProps } from './pinInput.props.js';
|
|
3
|
-
export { PIN_INPUT_ALPHANUMERIC_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_DIGITS_PATTERN, type PinInputCell, type PinInputPattern } from './pinInput.state.svelte.js';
|
|
3
|
+
export { PIN_INPUT_ALPHANUMERIC_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_DIGITS_PATTERN, type PinInputCell, type PinInputPattern, type PinInputRejectDetail } from './pinInput.state.svelte.js';
|
|
4
4
|
export { pinInputTheme, setPinInputTheme, usePinInputTheme, type PinInputTheme, type PinInputThemeProps } from './pinInput.theme.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const pinInputDescription = "\n# PinInput Component\n\nPinInput is a one-time-code input built from one real text input plus visible cells. The real input owns focus, paste, autocomplete, form submission, and keyboard behavior; the cells are a derived display.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\tlet code = $state('');\n</script>\n\n<PinInput label=\"Verification code\" bind:value={code} />\n```\n\n## Props\n\n### Core Props\n- **value**: string | null (bindable)\n - Current code value.\n - Clamped to the configured length.\n\n- **length**: number (default: 6)\n - Number of visible cells and maximum input length.\n\n- **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)\n - Partial-value pattern
|
|
1
|
+
export declare const pinInputDescription = "\n# PinInput Component\n\nPinInput is a one-time-code input built from one real text input plus visible cells. The real input owns focus, paste, autocomplete, form submission, and keyboard behavior; the cells are a derived display.\n\n## Basic Usage\n\n```svelte\n<script lang=\"ts\">\n\tlet code = $state('');\n</script>\n\n<PinInput label=\"Verification code\" bind:value={code} />\n```\n\n## Props\n\n### Core Props\n- **value**: string | null (bindable)\n - Current code value.\n - Clamped to the configured length.\n\n- **length**: number (default: 6)\n - Number of visible cells and maximum input length.\n\n- **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)\n - Partial-value pattern the code must match after normalization.\n - Defaults to digits only.\n - Text that fails it is refused whole (nothing changes) and reported to onRejectInput.\n - Exported constants: PIN_INPUT_DIGITS_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_ALPHANUMERIC_PATTERN.\n\n- **normalizeValue**: (text: string) => string\n - Last step of the one normalization every typed, pasted, autofilled, composed and controlled code goes through. Before it: format controls and whitespace are removed, full-width characters and digits of other numeral systems (Arabic-Indic, Persian, Devanagari, Bengali, Thai, Han) become ASCII, and separators (dashes, dots, slashes, commas, colons) are removed unless the pattern accepts them. After it: the pattern check and the clamp to length.\n - So \"123-456\", \"123 456\" and \"\u0664\u0665\u0666\" fill the default digits code with no setup, and `normalizeValue={(text) => text.toUpperCase()}` accepts lowercase typing in an alphanumeric code.\n - Keep it idempotent: running it on its own output should change nothing.\n\n- **onRejectInput**: ({ text, source }) => void\n - Called when the pattern refuses text; text is as it arrived and source is 'paste' or 'input' (typed or autofilled).\n\n- **pasteTransformer**: (text: string) => string\n - A paste-only first step that runs before the shared normalization, for site-specific cleanup such as removing a prefix.\n - A cleaned paste at least `length` characters long replaces the whole value, wherever the caret is; a shorter one is inserted at the caret.\n\n- **onComplete**: (value: string) => void\n - Called when the value becomes complete, whether typed, pasted, autofilled, composed, or set by the parent.\n - A paste or autofill that leaves the code complete calls it again, even when the code was already complete or unchanged, so re-pasting a code retries verification.\n - Typing over one cell of a complete code does not call it.\n\n- **onValueChange**: (value: string) => void\n - Called when the value changes.\n\n- **submitOnComplete**: boolean (default: false)\n - Submits the owning form when the user types, pastes or autofills a complete code: through the surrounding Form (which validates first and focuses an earlier invalid field, so the code input does not take focus back), else the native form with requestSubmit(). A code set by the parent, a read-only input and a disabled input never submit.\n\n- **groups**: number[]\n - Splits the cells into groups with a decorative separator between them: [3, 3] shows 123-456. Sizes that overshoot the length are ignored. The separator is aria-hidden and styled with the `separator` theme part.\n\n### Input Props\n- **inputMode**: HTMLInputElement['inputMode'] (default: 'numeric')\n - Mobile keyboard hint.\n\n- **autocomplete**: string (default: 'one-time-code')\n - Enables OTP autofill where supported.\n\n- **mask**: boolean (default: false)\n - Renders filled cells as bullets while preserving the real input value.\n\n### Field Props\nPinInput extends the standard field props:\n- **label**, **description**, **helper**, **error**, **errors**\n- **name**, **required**, **disabled**, **visible**\n- **readOnly**: the code is focusable and announced as read-only; typing, paste, autofill and submitOnComplete are ignored, and the value still validates and submits\n- **size**: 'small' | 'normal' | 'large'\n- **theme** for field and pin input parts\n\n## Examples\n\n### Digits Only\n```svelte\n<PinInput\n\tlabel=\"Security code\"\n\tlength={6}\n\tbind:value={code}\n/>\n```\n\n### Alphanumeric\n```svelte\n<PinInput\n\tlabel=\"Invite code\"\n\tlength={8}\n\tinputMode=\"text\"\n\tpattern={PIN_INPUT_ALPHANUMERIC_PATTERN}\n/>\n```\n\n### Masked\n```svelte\n<PinInput label=\"Recovery code\" bind:value={code} mask />\n```\n\n## Structure\n\n```\n<Field>\n <InputContainer>\n <div data-slot=\"pin-input\">\n <input data-slot=\"pin-input-input\" />\n <div data-slot=\"pin-input-cell\">\n <span data-slot=\"pin-input-character\" />\n <span data-slot=\"pin-input-caret\" />\n </div>\n <div data-slot=\"pin-input-separator\" aria-hidden=\"true\" /> <!-- with groups -->\n </div>\n </InputContainer>\n</Field>\n```\n\n## Accessibility\n\n- The label from Field is associated with the real input through `for/id`.\n- The visible cells are `aria-hidden`; assistive tech interacts with one text input.\n- The real input uses `autocomplete=\"one-time-code\"` by default.\n- Without a label the input is named by the localized \"One-time code\" catalog message (`oneTimeCode`).\n- The cells and the input are `dir=\"ltr\"` in every document direction, so a code reads 123456 in right-to-left pages too and the caret agrees with the cells.\n- The component works inside a shadow root: focus and selection are read from the input's own root node.\n- Keyboard navigation, deletion, selection, and paste operate through the native input.\n- Input method (IME) composition, such as Japanese or Chinese input, is left to the input method: the cells show the in-progress text, and the text is checked and committed once when the composition ends. Full-width digits and letters (`\uFF11\uFF12\uFF13`) are committed as ASCII (`123`). While composing, the real input turns fully transparent (the `input` theme slot's `composing` variant, `opacity-0`), so the input method's underline or clause highlight does not cover the first cells.\n\n## Notes\n\n- The pattern should accept partial values, not only the final full code. Use `^\\\\d+$`, not `^\\\\d{6}$`.\n- Spaces, hyphens and other grouping separators in typed, pasted or autofilled codes are removed by the built-in normalization. Pass a `pasteTransformer` only for cleanup specific to your codes.\n- Composed text that the pattern rejects (for example hiragana in a digits-only field) is discarded, and the previous code and selection are restored.\n\n## State contract\n\n- **value**: current bindable editable value.\n- **defaultValue**: initial value used only when `value` is omitted.\n- **onValueChange**: called with the new value when the component changes it.\n\n";
|
|
@@ -24,20 +24,37 @@ PinInput is a one-time-code input built from one real text input plus visible ce
|
|
|
24
24
|
- Number of visible cells and maximum input length.
|
|
25
25
|
|
|
26
26
|
- **pattern**: string | RegExp (default: PIN_INPUT_DIGITS_PATTERN)
|
|
27
|
-
- Partial-value pattern
|
|
27
|
+
- Partial-value pattern the code must match after normalization.
|
|
28
28
|
- Defaults to digits only.
|
|
29
|
+
- Text that fails it is refused whole (nothing changes) and reported to onRejectInput.
|
|
29
30
|
- Exported constants: PIN_INPUT_DIGITS_PATTERN, PIN_INPUT_CHARS_PATTERN, PIN_INPUT_ALPHANUMERIC_PATTERN.
|
|
30
31
|
|
|
32
|
+
- **normalizeValue**: (text: string) => string
|
|
33
|
+
- Last step of the one normalization every typed, pasted, autofilled, composed and controlled code goes through. Before it: format controls and whitespace are removed, full-width characters and digits of other numeral systems (Arabic-Indic, Persian, Devanagari, Bengali, Thai, Han) become ASCII, and separators (dashes, dots, slashes, commas, colons) are removed unless the pattern accepts them. After it: the pattern check and the clamp to length.
|
|
34
|
+
- So "123-456", "123 456" and "٤٥٦" fill the default digits code with no setup, and \`normalizeValue={(text) => text.toUpperCase()}\` accepts lowercase typing in an alphanumeric code.
|
|
35
|
+
- Keep it idempotent: running it on its own output should change nothing.
|
|
36
|
+
|
|
37
|
+
- **onRejectInput**: ({ text, source }) => void
|
|
38
|
+
- Called when the pattern refuses text; text is as it arrived and source is 'paste' or 'input' (typed or autofilled).
|
|
39
|
+
|
|
31
40
|
- **pasteTransformer**: (text: string) => string
|
|
32
|
-
-
|
|
33
|
-
-
|
|
41
|
+
- A paste-only first step that runs before the shared normalization, for site-specific cleanup such as removing a prefix.
|
|
42
|
+
- A cleaned paste at least \`length\` characters long replaces the whole value, wherever the caret is; a shorter one is inserted at the caret.
|
|
34
43
|
|
|
35
44
|
- **onComplete**: (value: string) => void
|
|
36
|
-
- Called
|
|
45
|
+
- Called when the value becomes complete, whether typed, pasted, autofilled, composed, or set by the parent.
|
|
46
|
+
- A paste or autofill that leaves the code complete calls it again, even when the code was already complete or unchanged, so re-pasting a code retries verification.
|
|
47
|
+
- Typing over one cell of a complete code does not call it.
|
|
37
48
|
|
|
38
49
|
- **onValueChange**: (value: string) => void
|
|
39
50
|
- Called when the value changes.
|
|
40
51
|
|
|
52
|
+
- **submitOnComplete**: boolean (default: false)
|
|
53
|
+
- Submits the owning form when the user types, pastes or autofills a complete code: through the surrounding Form (which validates first and focuses an earlier invalid field, so the code input does not take focus back), else the native form with requestSubmit(). A code set by the parent, a read-only input and a disabled input never submit.
|
|
54
|
+
|
|
55
|
+
- **groups**: number[]
|
|
56
|
+
- Splits the cells into groups with a decorative separator between them: [3, 3] shows 123-456. Sizes that overshoot the length are ignored. The separator is aria-hidden and styled with the \`separator\` theme part.
|
|
57
|
+
|
|
41
58
|
### Input Props
|
|
42
59
|
- **inputMode**: HTMLInputElement['inputMode'] (default: 'numeric')
|
|
43
60
|
- Mobile keyboard hint.
|
|
@@ -52,6 +69,7 @@ PinInput is a one-time-code input built from one real text input plus visible ce
|
|
|
52
69
|
PinInput extends the standard field props:
|
|
53
70
|
- **label**, **description**, **helper**, **error**, **errors**
|
|
54
71
|
- **name**, **required**, **disabled**, **visible**
|
|
72
|
+
- **readOnly**: the code is focusable and announced as read-only; typing, paste, autofill and submitOnComplete are ignored, and the value still validates and submits
|
|
55
73
|
- **size**: 'small' | 'normal' | 'large'
|
|
56
74
|
- **theme** for field and pin input parts
|
|
57
75
|
|
|
@@ -63,7 +81,6 @@ PinInput extends the standard field props:
|
|
|
63
81
|
label="Security code"
|
|
64
82
|
length={6}
|
|
65
83
|
bind:value={code}
|
|
66
|
-
pasteTransformer={(text) => text.replace(/\\D/g, '')}
|
|
67
84
|
/>
|
|
68
85
|
\`\`\`
|
|
69
86
|
|
|
@@ -93,6 +110,7 @@ PinInput extends the standard field props:
|
|
|
93
110
|
<span data-slot="pin-input-character" />
|
|
94
111
|
<span data-slot="pin-input-caret" />
|
|
95
112
|
</div>
|
|
113
|
+
<div data-slot="pin-input-separator" aria-hidden="true" /> <!-- with groups -->
|
|
96
114
|
</div>
|
|
97
115
|
</InputContainer>
|
|
98
116
|
</Field>
|
|
@@ -103,12 +121,17 @@ PinInput extends the standard field props:
|
|
|
103
121
|
- The label from Field is associated with the real input through \`for/id\`.
|
|
104
122
|
- The visible cells are \`aria-hidden\`; assistive tech interacts with one text input.
|
|
105
123
|
- The real input uses \`autocomplete="one-time-code"\` by default.
|
|
124
|
+
- Without a label the input is named by the localized "One-time code" catalog message (\`oneTimeCode\`).
|
|
125
|
+
- The cells and the input are \`dir="ltr"\` in every document direction, so a code reads 123456 in right-to-left pages too and the caret agrees with the cells.
|
|
126
|
+
- The component works inside a shadow root: focus and selection are read from the input's own root node.
|
|
106
127
|
- Keyboard navigation, deletion, selection, and paste operate through the native input.
|
|
128
|
+
- Input method (IME) composition, such as Japanese or Chinese input, is left to the input method: the cells show the in-progress text, and the text is checked and committed once when the composition ends. Full-width digits and letters (\`123\`) are committed as ASCII (\`123\`). While composing, the real input turns fully transparent (the \`input\` theme slot's \`composing\` variant, \`opacity-0\`), so the input method's underline or clause highlight does not cover the first cells.
|
|
107
129
|
|
|
108
130
|
## Notes
|
|
109
131
|
|
|
110
132
|
- The pattern should accept partial values, not only the final full code. Use \`^\\\\d+$\`, not \`^\\\\d{6}$\`.
|
|
111
|
-
-
|
|
133
|
+
- Spaces, hyphens and other grouping separators in typed, pasted or autofilled codes are removed by the built-in normalization. Pass a \`pasteTransformer\` only for cleanup specific to your codes.
|
|
134
|
+
- Composed text that the pattern rejects (for example hiragana in a digits-only field) is discarded, and the previous code and selection are restored.
|
|
112
135
|
|
|
113
136
|
## State contract
|
|
114
137
|
|