@proyecto-viviana/solidaria 0.4.0 → 0.4.2
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/dist/_chunk/DragManager.js +627 -0
- package/dist/_chunk/DragManager.js.map +1 -0
- package/dist/_chunk/DragManager.jsx +627 -0
- package/dist/_chunk/DragManager.jsx.map +1 -0
- package/dist/_chunk/FocusScope.js +400 -0
- package/dist/_chunk/FocusScope.js.map +1 -0
- package/dist/_chunk/FocusScope.jsx +375 -0
- package/dist/_chunk/FocusScope.jsx.map +1 -0
- package/dist/_chunk/actiongroup.js +13 -79
- package/dist/_chunk/actiongroup.js.map +1 -1
- package/dist/_chunk/actiongroup.jsx +13 -79
- package/dist/_chunk/actiongroup.jsx.map +1 -1
- package/dist/_chunk/{live-announcer.js → announce.js} +1 -1
- package/dist/_chunk/announce.js.map +1 -0
- package/dist/_chunk/{live-announcer.jsx → announce.jsx} +1 -1
- package/dist/_chunk/announce.jsx.map +1 -0
- package/dist/_chunk/autocomplete.js +56 -8
- package/dist/_chunk/autocomplete.js.map +1 -1
- package/dist/_chunk/autocomplete.jsx +56 -8
- package/dist/_chunk/autocomplete.jsx.map +1 -1
- package/dist/_chunk/breadcrumbs.js +6 -4
- package/dist/_chunk/breadcrumbs.js.map +1 -1
- package/dist/_chunk/breadcrumbs.jsx +6 -4
- package/dist/_chunk/breadcrumbs.jsx.map +1 -1
- package/dist/_chunk/button.js +8 -9
- package/dist/_chunk/button.js.map +1 -1
- package/dist/_chunk/button.jsx +8 -9
- package/dist/_chunk/button.jsx.map +1 -1
- package/dist/_chunk/calendar.js +27 -26
- package/dist/_chunk/calendar.js.map +1 -1
- package/dist/_chunk/calendar.jsx +27 -26
- package/dist/_chunk/calendar.jsx.map +1 -1
- package/dist/_chunk/checkbox.js +5 -4
- package/dist/_chunk/checkbox.js.map +1 -1
- package/dist/_chunk/checkbox.jsx +5 -4
- package/dist/_chunk/checkbox.jsx.map +1 -1
- package/dist/_chunk/color.js +302 -18
- package/dist/_chunk/color.js.map +1 -1
- package/dist/_chunk/color.jsx +302 -18
- package/dist/_chunk/color.jsx.map +1 -1
- package/dist/_chunk/combobox.js +638 -12
- package/dist/_chunk/combobox.js.map +1 -1
- package/dist/_chunk/combobox.jsx +638 -12
- package/dist/_chunk/combobox.jsx.map +1 -1
- package/dist/_chunk/constants.js +19 -0
- package/dist/_chunk/constants.js.map +1 -0
- package/dist/_chunk/constants.jsx +19 -0
- package/dist/_chunk/constants.jsx.map +1 -0
- package/dist/_chunk/createCollator.js +3 -171
- package/dist/_chunk/createCollator.js.map +1 -1
- package/dist/_chunk/createCollator.jsx +3 -165
- package/dist/_chunk/createCollator.jsx.map +1 -1
- package/dist/_chunk/createField.js +2 -1
- package/dist/_chunk/createField.js.map +1 -1
- package/dist/_chunk/createField.jsx +2 -1
- package/dist/_chunk/createField.jsx.map +1 -1
- package/dist/_chunk/createFocus.js +12 -8
- package/dist/_chunk/createFocus.js.map +1 -1
- package/dist/_chunk/createFocus.jsx +12 -8
- package/dist/_chunk/createFocus.jsx.map +1 -1
- package/dist/_chunk/createFocusWithin.js +12 -13
- package/dist/_chunk/createFocusWithin.js.map +1 -1
- package/dist/_chunk/createFocusWithin.jsx +12 -13
- package/dist/_chunk/createFocusWithin.jsx.map +1 -1
- package/dist/_chunk/createFocusable.js +3 -3
- package/dist/_chunk/createFocusable.js.map +1 -1
- package/dist/_chunk/createFocusable.jsx +3 -3
- package/dist/_chunk/createFocusable.jsx.map +1 -1
- package/dist/_chunk/{form.js → createFormReset.js} +1 -1
- package/dist/_chunk/createFormReset.js.map +1 -0
- package/dist/_chunk/{form.jsx → createFormReset.jsx} +1 -1
- package/dist/_chunk/createFormReset.jsx.map +1 -0
- package/dist/_chunk/createHover.js +2 -1
- package/dist/_chunk/createHover.js.map +1 -1
- package/dist/_chunk/createHover.jsx +2 -1
- package/dist/_chunk/createHover.jsx.map +1 -1
- package/dist/_chunk/createInteractionModality.js +2 -3
- package/dist/_chunk/createInteractionModality.js.map +1 -1
- package/dist/_chunk/createInteractionModality.jsx +2 -3
- package/dist/_chunk/createInteractionModality.jsx.map +1 -1
- package/dist/_chunk/createLabel.js +2 -1
- package/dist/_chunk/createLabel.js.map +1 -1
- package/dist/_chunk/createLabel.jsx +2 -1
- package/dist/_chunk/createLabel.jsx.map +1 -1
- package/dist/_chunk/createLabels.js +3 -2
- package/dist/_chunk/createLabels.js.map +1 -1
- package/dist/_chunk/createLabels.jsx +3 -2
- package/dist/_chunk/createLabels.jsx.map +1 -1
- package/dist/_chunk/createLandmark.js +1 -1
- package/dist/_chunk/createLandmark.jsx +1 -1
- package/dist/_chunk/createProgressBar.js +2 -1
- package/dist/_chunk/createProgressBar.js.map +1 -1
- package/dist/_chunk/createProgressBar.jsx +2 -1
- package/dist/_chunk/createProgressBar.jsx.map +1 -1
- package/dist/_chunk/createSelectableItem.js +7 -3
- package/dist/_chunk/createSelectableItem.js.map +1 -1
- package/dist/_chunk/createSelectableItem.jsx +7 -3
- package/dist/_chunk/createSelectableItem.jsx.map +1 -1
- package/dist/_chunk/createStringFormatter.js +61 -0
- package/dist/_chunk/createStringFormatter.js.map +1 -0
- package/dist/_chunk/createStringFormatter.jsx +61 -0
- package/dist/_chunk/createStringFormatter.jsx.map +1 -0
- package/dist/_chunk/createToggle.js +5 -4
- package/dist/_chunk/createToggle.js.map +1 -1
- package/dist/_chunk/createToggle.jsx +5 -4
- package/dist/_chunk/createToggle.jsx.map +1 -1
- package/dist/_chunk/datepicker.js +1413 -1100
- package/dist/_chunk/datepicker.js.map +1 -1
- package/dist/_chunk/datepicker.jsx +1413 -1100
- package/dist/_chunk/datepicker.jsx.map +1 -1
- package/dist/_chunk/disclosure.js +2 -2
- package/dist/_chunk/disclosure.js.map +1 -1
- package/dist/_chunk/disclosure.jsx +2 -2
- package/dist/_chunk/disclosure.jsx.map +1 -1
- package/dist/_chunk/dnd.js +1586 -495
- package/dist/_chunk/dnd.js.map +1 -1
- package/dist/_chunk/dnd.jsx +1586 -495
- package/dist/_chunk/dnd.jsx.map +1 -1
- package/dist/_chunk/env.js +1 -19
- package/dist/_chunk/env.js.map +1 -1
- package/dist/_chunk/env.jsx +1 -19
- package/dist/_chunk/env.jsx.map +1 -1
- package/dist/_chunk/focus.js +1 -1
- package/dist/_chunk/focus.js.map +1 -1
- package/dist/_chunk/focus.jsx +1 -1
- package/dist/_chunk/focus.jsx.map +1 -1
- package/dist/_chunk/focus2.js +54 -318
- package/dist/_chunk/focus2.js.map +1 -1
- package/dist/_chunk/focus2.jsx +53 -292
- package/dist/_chunk/focus2.jsx.map +1 -1
- package/dist/_chunk/grid.js +1 -1
- package/dist/_chunk/grid.jsx +1 -1
- package/dist/_chunk/gridlist.js +14 -9
- package/dist/_chunk/gridlist.js.map +1 -1
- package/dist/_chunk/gridlist.jsx +14 -9
- package/dist/_chunk/gridlist.jsx.map +1 -1
- package/dist/_chunk/i18n.js +3 -58
- package/dist/_chunk/i18n.js.map +1 -1
- package/dist/_chunk/i18n.jsx +3 -58
- package/dist/_chunk/i18n.jsx.map +1 -1
- package/dist/_chunk/interactions.js +99 -9
- package/dist/_chunk/interactions.js.map +1 -1
- package/dist/_chunk/interactions.jsx +97 -9
- package/dist/_chunk/interactions.jsx.map +1 -1
- package/dist/_chunk/link.js +2 -1
- package/dist/_chunk/link.js.map +1 -1
- package/dist/_chunk/link.jsx +2 -1
- package/dist/_chunk/link.jsx.map +1 -1
- package/dist/_chunk/listbox.js +42 -10
- package/dist/_chunk/listbox.js.map +1 -1
- package/dist/_chunk/listbox.jsx +42 -10
- package/dist/_chunk/listbox.jsx.map +1 -1
- package/dist/_chunk/locale.js +173 -0
- package/dist/_chunk/locale.js.map +1 -0
- package/dist/_chunk/locale.jsx +167 -0
- package/dist/_chunk/locale.jsx.map +1 -0
- package/dist/_chunk/menu.js +5 -4
- package/dist/_chunk/menu.js.map +1 -1
- package/dist/_chunk/menu.jsx +5 -4
- package/dist/_chunk/menu.jsx.map +1 -1
- package/dist/_chunk/numberfield.js +3 -2
- package/dist/_chunk/numberfield.js.map +1 -1
- package/dist/_chunk/numberfield.jsx +3 -2
- package/dist/_chunk/numberfield.jsx.map +1 -1
- package/dist/_chunk/overlays.js +1 -1
- package/dist/_chunk/overlays.jsx +1 -1
- package/dist/_chunk/popover.js +3 -3
- package/dist/_chunk/popover.js.map +1 -1
- package/dist/_chunk/popover.jsx +3 -3
- package/dist/_chunk/popover.jsx.map +1 -1
- package/dist/_chunk/radio.js +7 -6
- package/dist/_chunk/radio.js.map +1 -1
- package/dist/_chunk/radio.jsx +7 -6
- package/dist/_chunk/radio.jsx.map +1 -1
- package/dist/_chunk/reactivity.js +21 -0
- package/dist/_chunk/reactivity.js.map +1 -0
- package/dist/_chunk/reactivity.jsx +21 -0
- package/dist/_chunk/reactivity.jsx.map +1 -0
- package/dist/_chunk/searchfield.js +2 -1
- package/dist/_chunk/searchfield.js.map +1 -1
- package/dist/_chunk/searchfield.jsx +2 -1
- package/dist/_chunk/searchfield.jsx.map +1 -1
- package/dist/_chunk/select.js +8 -5
- package/dist/_chunk/select.js.map +1 -1
- package/dist/_chunk/select.jsx +8 -5
- package/dist/_chunk/select.jsx.map +1 -1
- package/dist/_chunk/selection.js +8 -21
- package/dist/_chunk/selection.js.map +1 -1
- package/dist/_chunk/selection.jsx +8 -21
- package/dist/_chunk/selection.jsx.map +1 -1
- package/dist/_chunk/separator.js +1 -1
- package/dist/_chunk/separator.jsx +1 -1
- package/dist/_chunk/slider.js +5 -4
- package/dist/_chunk/slider.js.map +1 -1
- package/dist/_chunk/slider.jsx +5 -4
- package/dist/_chunk/slider.jsx.map +1 -1
- package/dist/_chunk/spinbutton.js +153 -0
- package/dist/_chunk/spinbutton.js.map +1 -0
- package/dist/_chunk/spinbutton.jsx +153 -0
- package/dist/_chunk/spinbutton.jsx.map +1 -0
- package/dist/_chunk/table.js +45 -8
- package/dist/_chunk/table.js.map +1 -1
- package/dist/_chunk/table.jsx +45 -8
- package/dist/_chunk/table.jsx.map +1 -1
- package/dist/_chunk/tabs.js +11 -8
- package/dist/_chunk/tabs.js.map +1 -1
- package/dist/_chunk/tabs.jsx +11 -8
- package/dist/_chunk/tabs.jsx.map +1 -1
- package/dist/_chunk/tag.js +54 -18
- package/dist/_chunk/tag.js.map +1 -1
- package/dist/_chunk/tag.jsx +54 -18
- package/dist/_chunk/tag.jsx.map +1 -1
- package/dist/_chunk/textfield.js +2 -1
- package/dist/_chunk/textfield.js.map +1 -1
- package/dist/_chunk/textfield.jsx +2 -1
- package/dist/_chunk/textfield.jsx.map +1 -1
- package/dist/_chunk/toolbar.js +4 -36
- package/dist/_chunk/toolbar.js.map +1 -1
- package/dist/_chunk/toolbar.jsx +4 -36
- package/dist/_chunk/toolbar.jsx.map +1 -1
- package/dist/_chunk/tooltip.js +2 -2
- package/dist/_chunk/tooltip.js.map +1 -1
- package/dist/_chunk/tooltip.jsx +2 -2
- package/dist/_chunk/tooltip.jsx.map +1 -1
- package/dist/_chunk/tree.js +42 -14
- package/dist/_chunk/tree.js.map +1 -1
- package/dist/_chunk/tree.jsx +42 -14
- package/dist/_chunk/tree.jsx.map +1 -1
- package/dist/_chunk/utils.js +59 -19
- package/dist/_chunk/utils.js.map +1 -1
- package/dist/_chunk/utils.jsx +59 -19
- package/dist/_chunk/utils.jsx.map +1 -1
- package/dist/_chunk/visually-hidden.js +3 -2
- package/dist/_chunk/visually-hidden.js.map +1 -1
- package/dist/_chunk/visually-hidden.jsx +3 -2
- package/dist/_chunk/visually-hidden.jsx.map +1 -1
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -1
- package/dist/autocomplete/createAutocomplete.d.ts +10 -7
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -1
- package/dist/calendar/createCalendar.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/calendar/intl/index.d.ts +1 -1
- package/dist/calendar/intl/index.d.ts.map +1 -1
- package/dist/collections/index.js +1 -1
- package/dist/collections/index.jsx +1 -1
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorField.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorSwatch.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/color/intl/index.d.ts +30 -0
- package/dist/color/intl/index.d.ts.map +1 -0
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/combobox/intl/generated-locales.d.ts +16 -0
- package/dist/combobox/intl/generated-locales.d.ts.map +1 -0
- package/dist/combobox/intl/index.d.ts +2 -2
- package/dist/combobox/intl/index.d.ts.map +1 -1
- package/dist/datepicker/createDateField.d.ts +45 -23
- package/dist/datepicker/createDateField.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +34 -6
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDatePickerGroup.d.ts +13 -13
- package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -1
- package/dist/datepicker/createDateRangePicker.d.ts +55 -7
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateSegment.d.ts +6 -15
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createDisplayNames.d.ts +17 -0
- package/dist/datepicker/createDisplayNames.d.ts.map +1 -0
- package/dist/datepicker/createTimeField.d.ts +12 -49
- package/dist/datepicker/createTimeField.d.ts.map +1 -1
- package/dist/datepicker/index.d.ts +3 -3
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/datepicker/index.js +2 -2
- package/dist/datepicker/index.jsx +2 -2
- package/dist/datepicker/intl.d.ts +12 -0
- package/dist/datepicker/intl.d.ts.map +1 -0
- package/dist/dnd/DragManager.d.ts +86 -0
- package/dist/dnd/DragManager.d.ts.map +1 -0
- package/dist/dnd/DropTargetKeyboardNavigation.d.ts +42 -0
- package/dist/dnd/DropTargetKeyboardNavigation.d.ts.map +1 -0
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts +12 -7
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +7 -15
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +5 -1
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/dnd/index.js +3 -2
- package/dist/dnd/index.jsx +3 -2
- package/dist/dnd/intl/index.d.ts +39 -0
- package/dist/dnd/intl/index.d.ts.map +1 -0
- package/dist/dnd/utils.d.ts +5 -0
- package/dist/dnd/utils.d.ts.map +1 -1
- package/dist/focus/FocusScope.d.ts +7 -0
- package/dist/focus/FocusScope.d.ts.map +1 -1
- package/dist/focus/index.d.ts +2 -1
- package/dist/focus/index.d.ts.map +1 -1
- package/dist/focus/index.js +3 -2
- package/dist/focus/index.jsx +3 -2
- package/dist/focus/virtualFocus.d.ts +26 -0
- package/dist/focus/virtualFocus.d.ts.map +1 -0
- package/dist/form/index.js +1 -1
- package/dist/form/index.jsx +1 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/i18n/index.js +4 -2
- package/dist/i18n/index.jsx +4 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -12
- package/dist/index.jsx +18 -12
- package/dist/interactions/FocusableProvider.d.ts.map +1 -1
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/interactions/createInteractionModality.d.ts.map +1 -1
- package/dist/interactions/index.js +1 -2
- package/dist/interactions/index.jsx +1 -2
- package/dist/label/createLabels.d.ts.map +1 -1
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts +1 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/live-announcer/index.js +1 -1
- package/dist/live-announcer/index.jsx +1 -1
- package/dist/select/createSelect.d.ts +2 -0
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/selection/createSelectableItem.d.ts.map +1 -1
- package/dist/selection/index.js +2 -1
- package/dist/selection/index.jsx +2 -1
- package/dist/spinbutton/createSpinButton.d.ts +41 -0
- package/dist/spinbutton/createSpinButton.d.ts.map +1 -0
- package/dist/spinbutton/index.d.ts +3 -0
- package/dist/spinbutton/index.d.ts.map +1 -0
- package/dist/spinbutton/index.js +2 -0
- package/dist/spinbutton/index.jsx +2 -0
- package/dist/spinbutton/intl.d.ts +5 -0
- package/dist/spinbutton/intl.d.ts.map +1 -0
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/table/createTableColumnHeader.d.ts.map +1 -1
- package/dist/table/createTableRow.d.ts.map +1 -1
- package/dist/table/createTableSelectionCheckbox.d.ts.map +1 -1
- package/dist/table/types.d.ts +8 -0
- package/dist/table/types.d.ts.map +1 -1
- package/dist/table/utils.d.ts +15 -0
- package/dist/table/utils.d.ts.map +1 -0
- package/dist/tabs/createTabs.d.ts +1 -0
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts +7 -0
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
- package/dist/utils/animation.d.ts.map +1 -1
- package/dist/utils/dom.d.ts +1 -0
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -3
- package/dist/utils/index.jsx +4 -3
- package/package.json +2 -2
- package/src/actiongroup/createActionGroup.ts +26 -109
- package/src/autocomplete/createAutocomplete.ts +136 -15
- package/src/breadcrumbs/createBreadcrumbs.ts +12 -4
- package/src/button/createToggleButtonGroup.ts +19 -14
- package/src/calendar/createCalendar.ts +3 -4
- package/src/calendar/createCalendarCell.ts +17 -3
- package/src/calendar/createCalendarGrid.ts +5 -4
- package/src/calendar/createRangeCalendar.ts +27 -17
- package/src/calendar/createRangeCalendarCell.ts +17 -3
- package/src/calendar/intl/index.ts +8 -0
- package/src/color/createColorArea.ts +17 -10
- package/src/color/createColorField.ts +8 -1
- package/src/color/createColorSlider.ts +1 -2
- package/src/color/createColorSwatch.ts +4 -2
- package/src/color/createColorWheel.ts +0 -6
- package/src/color/intl/index.ts +316 -0
- package/src/combobox/createComboBox.ts +35 -4
- package/src/combobox/intl/generated-locales.ts +635 -0
- package/src/combobox/intl/index.ts +8 -2
- package/src/datepicker/createDateField.ts +228 -213
- package/src/datepicker/createDatePicker.ts +157 -146
- package/src/datepicker/createDatePickerGroup.ts +88 -82
- package/src/datepicker/createDateRangePicker.ts +230 -179
- package/src/datepicker/createDateSegment.ts +386 -389
- package/src/datepicker/createDisplayNames.ts +45 -0
- package/src/datepicker/createTimeField.ts +36 -129
- package/src/datepicker/index.ts +13 -14
- package/src/datepicker/intl.ts +633 -0
- package/src/dnd/DragManager.ts +693 -0
- package/src/dnd/DropTargetKeyboardNavigation.ts +337 -0
- package/src/dnd/createDrag.ts +31 -5
- package/src/dnd/createDraggableCollection.ts +33 -15
- package/src/dnd/createDraggableItem.ts +92 -5
- package/src/dnd/createDroppableCollection.ts +487 -373
- package/src/dnd/index.ts +11 -0
- package/src/dnd/intl/ar-AE.json +29 -0
- package/src/dnd/intl/bg-BG.json +29 -0
- package/src/dnd/intl/cs-CZ.json +29 -0
- package/src/dnd/intl/da-DK.json +29 -0
- package/src/dnd/intl/de-DE.json +29 -0
- package/src/dnd/intl/el-GR.json +29 -0
- package/src/dnd/intl/en-US.json +29 -0
- package/src/dnd/intl/es-ES.json +29 -0
- package/src/dnd/intl/et-EE.json +29 -0
- package/src/dnd/intl/fi-FI.json +29 -0
- package/src/dnd/intl/fr-FR.json +29 -0
- package/src/dnd/intl/he-IL.json +29 -0
- package/src/dnd/intl/hr-HR.json +29 -0
- package/src/dnd/intl/hu-HU.json +29 -0
- package/src/dnd/intl/index.ts +139 -0
- package/src/dnd/intl/it-IT.json +29 -0
- package/src/dnd/intl/ja-JP.json +29 -0
- package/src/dnd/intl/ko-KR.json +29 -0
- package/src/dnd/intl/lt-LT.json +29 -0
- package/src/dnd/intl/lv-LV.json +29 -0
- package/src/dnd/intl/nb-NO.json +29 -0
- package/src/dnd/intl/nl-NL.json +29 -0
- package/src/dnd/intl/pl-PL.json +29 -0
- package/src/dnd/intl/pt-BR.json +29 -0
- package/src/dnd/intl/pt-PT.json +29 -0
- package/src/dnd/intl/ro-RO.json +29 -0
- package/src/dnd/intl/ru-RU.json +29 -0
- package/src/dnd/intl/sk-SK.json +29 -0
- package/src/dnd/intl/sl-SI.json +29 -0
- package/src/dnd/intl/sr-SP.json +29 -0
- package/src/dnd/intl/sv-SE.json +29 -0
- package/src/dnd/intl/tr-TR.json +29 -0
- package/src/dnd/intl/uk-UA.json +29 -0
- package/src/dnd/intl/zh-CN.json +29 -0
- package/src/dnd/intl/zh-TW.json +29 -0
- package/src/dnd/utils.ts +36 -0
- package/src/focus/FocusScope.tsx +120 -12
- package/src/focus/index.ts +8 -0
- package/src/focus/virtualFocus.ts +55 -0
- package/src/gridlist/createGridList.ts +52 -16
- package/src/index.ts +11 -3
- package/src/interactions/FocusableProvider.tsx +11 -6
- package/src/interactions/createFocus.ts +26 -21
- package/src/interactions/createFocusWithin.ts +23 -24
- package/src/interactions/createInteractionModality.ts +5 -3
- package/src/label/createLabels.ts +7 -4
- package/src/listbox/createListBox.ts +74 -2
- package/src/listbox/createOption.ts +16 -1
- package/src/select/createSelect.ts +23 -2
- package/src/selection/createSelectableItem.ts +14 -0
- package/src/spinbutton/createSpinButton.ts +163 -0
- package/src/spinbutton/index.ts +10 -0
- package/src/spinbutton/intl.ts +115 -0
- package/src/table/createTable.ts +26 -1
- package/src/table/createTableColumnHeader.ts +10 -0
- package/src/table/createTableRow.ts +10 -0
- package/src/table/createTableSelectionCheckbox.ts +24 -1
- package/src/table/types.ts +8 -0
- package/src/table/utils.ts +41 -0
- package/src/tabs/createTabs.ts +53 -12
- package/src/tag/createTag.ts +21 -32
- package/src/tag/createTagGroup.ts +92 -0
- package/src/toolbar/createToolbar.ts +6 -58
- package/src/tree/createTree.ts +69 -14
- package/src/tree/createTreeSelectionCheckbox.ts +14 -1
- package/src/utils/animation.ts +119 -27
- package/src/utils/dom.ts +3 -2
- package/src/utils/index.ts +2 -0
- package/dist/_chunk/createLongPress.js +0 -91
- package/dist/_chunk/createLongPress.js.map +0 -1
- package/dist/_chunk/createLongPress.jsx +0 -91
- package/dist/_chunk/createLongPress.jsx.map +0 -1
- package/dist/_chunk/form.js.map +0 -1
- package/dist/_chunk/form.jsx.map +0 -1
- package/dist/_chunk/live-announcer.js.map +0 -1
- package/dist/_chunk/live-announcer.jsx.map +0 -1
- package/dist/datepicker/createTimeSegment.d.ts +0 -29
- package/dist/datepicker/createTimeSegment.d.ts.map +0 -1
- package/src/datepicker/createTimeSegment.ts +0 -352
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.jsx","names":["enUS","esES"],"sources":["../../src/combobox/intl/en-US.json","../../src/combobox/intl/es-ES.json","../../src/combobox/intl/index.ts","../../src/combobox/createComboBox.ts"],"sourcesContent":["","","/**\n * ComboBox internationalization strings\n * Based on @react-aria/combobox/intl\n */\n\nimport type { LocalizedStrings } from \"@internationalized/string\";\n\n// Import locale files\nimport enUS from \"./en-US.json\" with { type: \"json\" };\nimport esES from \"./es-ES.json\" with { type: \"json\" };\n\nexport type ComboBoxIntlStrings = {\n focusAnnouncement: string;\n countAnnouncement: string;\n selectedAnnouncement: string;\n buttonLabel: string;\n listboxLabel: string;\n};\n\nexport const comboBoxIntlStrings: LocalizedStrings<keyof ComboBoxIntlStrings, string> = {\n \"en-US\": enUS,\n \"es-ES\": esES,\n};\n","/**\n * Provides the behavior and accessibility implementation for a combobox component.\n * A combobox combines a text input with a listbox, allowing users to filter a list of options.\n * Based on @react-aria/combobox useComboBox.\n */\n\nimport { type JSX, type Accessor, createEffect, onCleanup } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport { createPress } from \"../interactions/createPress\";\nimport { createFocusRing } from \"../interactions/createFocusRing\";\nimport { createLabel } from \"../label/createLabel\";\nimport { filterDOMProps } from \"../utils/filterDOMProps\";\nimport { mergeProps } from \"../utils/mergeProps\";\nimport { createId } from \"../ssr\";\nimport { access, type MaybeAccessor } from \"../utils/reactivity\";\nimport { isAppleDevice } from \"../utils/platform\";\nimport { openLink } from \"../utils/dom\";\nimport { ariaHideOutside } from \"../overlays/ariaHideOutside\";\nimport { announce } from \"../live-announcer\";\nimport { createStringFormatter } from \"../i18n\";\nimport { comboBoxIntlStrings } from \"./intl\";\nimport { isDevEnv } from \"../utils/env\";\nimport type { ComboBoxState, CollectionNode, Key } from \"@proyecto-viviana/solid-stately\";\n\n/**\n * Helper to count items in a collection\n */\nfunction getItemCount<T>(collection: { getKeys(): Iterable<Key> }): number {\n let count = 0;\n for (const _ of collection.getKeys()) {\n count++;\n }\n return count;\n}\n\nexport interface AriaComboBoxProps {\n /** An ID for the combobox. */\n id?: string;\n /** Whether the combobox is disabled. */\n isDisabled?: boolean;\n /** Whether the combobox is required. */\n isRequired?: boolean;\n /** Whether the combobox is read-only. */\n isReadOnly?: boolean;\n /** The label for the combobox. */\n label?: JSX.Element;\n /** An accessible label for the combobox when no visible label is provided. */\n \"aria-label\"?: string;\n /** The ID of an element that labels the combobox. */\n \"aria-labelledby\"?: string;\n /** The ID of an element that describes the combobox. */\n \"aria-describedby\"?: string;\n /** Description text for assistive technology and form help. */\n description?: string;\n /** Error message text for assistive technology and validation feedback. */\n errorMessage?: string;\n /** Whether the current value is invalid. */\n isInvalid?: boolean;\n /** Placeholder text for the input when no value is entered. */\n placeholder?: string;\n /** Whether the combobox should be auto-focused. */\n autoFocus?: boolean;\n /** Handler called when focus moves to the combobox input. */\n onFocus?: (e: FocusEvent) => void;\n /** Handler called when focus moves away from the combobox input. */\n onBlur?: (e: FocusEvent) => void;\n /** Handler called when the focus state changes. */\n onFocusChange?: (isFocused: boolean) => void;\n /** The name of the combobox, used when submitting an HTML form. */\n name?: string;\n /** The form owner for the combobox input. */\n form?: string;\n /**\n * Describes the type of autocomplete functionality the input should provide.\n * @default 'list'\n */\n autoComplete?: \"list\" | \"none\" | \"inline\" | \"both\";\n /** Whether focus should wrap from the last item to the first. */\n shouldFocusWrap?: boolean;\n}\n\nexport interface ComboBoxAria<T> {\n /** Props for the label element. */\n labelProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the input element. */\n inputProps: JSX.InputHTMLAttributes<HTMLInputElement>;\n /** Props for the trigger button element. */\n buttonProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the listbox popup. */\n listBoxProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the description element, if any. */\n descriptionProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the error message element, if any. */\n errorMessageProps: JSX.HTMLAttributes<HTMLElement>;\n /** Whether the input is currently focused. */\n isFocused: Accessor<boolean>;\n /** Whether the input has keyboard focus. */\n isFocusVisible: Accessor<boolean>;\n /** Whether the listbox is currently open. */\n isOpen: Accessor<boolean>;\n /** The currently selected item. */\n selectedItem: Accessor<CollectionNode<T> | null>;\n}\n\n// Shared data between combobox and options\nconst comboBoxData = new WeakMap<object, ComboBoxData>();\n\ninterface ComboBoxData {\n id: string;\n listBoxId: string;\n}\n\nexport function getComboBoxData(state: ComboBoxState<unknown>): ComboBoxData | undefined {\n return comboBoxData.get(state);\n}\n\n/**\n * Provides the behavior and accessibility implementation for a combobox component.\n */\nexport function createComboBox<T>(\n props: MaybeAccessor<AriaComboBoxProps>,\n state: ComboBoxState<T>,\n inputRef: () => HTMLInputElement | null,\n buttonRef?: () => HTMLElement | null,\n listBoxRef?: () => HTMLElement | null,\n): ComboBoxAria<T> {\n const getProps = () => access(props);\n const id = createId(getProps().id);\n\n // Development-time warning for missing accessibility labels\n if (isDevEnv()) {\n const p = getProps();\n if (!p.label && !p[\"aria-label\"] && !p[\"aria-labelledby\"]) {\n console.warn(\n \"[solidaria] A ComboBox requires a label, aria-label, or aria-labelledby attribute for accessibility.\",\n );\n }\n }\n\n // Track if a pointerdown happened inside the listbox to prevent blur from closing\n let isPointerDownInsideListBox = false;\n\n // Generate IDs for associated elements\n const inputId = `${id}-input`;\n const buttonId = `${id}-button`;\n const listBoxId = `${id}-listbox`;\n const descriptionId = `${id}-description`;\n const errorMessageId = `${id}-error`;\n\n const getAriaDescribedBy = () => {\n const p = getProps();\n const ids: string[] = [];\n if (p[\"aria-describedby\"]) {\n ids.push(p[\"aria-describedby\"]);\n }\n if (p.description) {\n ids.push(descriptionId);\n }\n if (p.isInvalid && p.errorMessage) {\n ids.push(errorMessageId);\n }\n return ids.length > 0 ? ids.join(\" \") : undefined;\n };\n\n // Set up global pointerdown listener to track clicks inside listbox\n // This is needed because the option's createPress stops propagation\n createEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const handleGlobalPointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n // Check if the click is inside the listbox\n if (target.closest(`[id=\"${listBoxId}\"]`)) {\n isPointerDownInsideListBox = true;\n }\n };\n\n document.addEventListener(\"pointerdown\", handleGlobalPointerDown, true);\n\n onCleanup(() => {\n document.removeEventListener(\"pointerdown\", handleGlobalPointerDown, true);\n });\n });\n\n // Filter DOM props\n const domProps = () =>\n filterDOMProps(getProps() as unknown as Record<string, unknown>, {\n labelable: true,\n propNames: new Set([\"form\"]),\n });\n\n // Share data with child options\n createEffect(() => {\n comboBoxData.set(state, { id, listBoxId });\n\n onCleanup(() => {\n comboBoxData.delete(state);\n });\n });\n\n // Label handling\n const { labelProps, fieldProps } = createLabel({\n get id() {\n return inputId;\n },\n get label() {\n return getProps().label;\n },\n get \"aria-label\"() {\n return getProps()[\"aria-label\"];\n },\n get \"aria-labelledby\"() {\n return getProps()[\"aria-labelledby\"];\n },\n labelElementType: \"label\",\n });\n\n // Focus ring for keyboard focus styling\n const { isFocusVisible, focusProps } = createFocusRing({\n get autoFocus() {\n return getProps().autoFocus;\n },\n });\n\n // Track focus state from state\n const isFocused = state.isFocused;\n\n // String formatter for VoiceOver announcements\n // Only create on client side\n const stringFormatter = !isServer ? createStringFormatter(comboBoxIntlStrings) : null;\n\n // Track previous values for announcements\n let lastFocusedKey: Key | null = null;\n let lastSelectedKey: Key | null = null;\n let lastOptionCount = 0;\n let lastIsOpen = false;\n\n // VoiceOver has issues with announcing aria-activedescendant properly on change\n // (especially on iOS). We use a live region announcer to announce focus changes\n // manually. This matches React Aria's behavior.\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const focusedKey = state.focusedKey();\n const isOpen = state.isOpen();\n const collection = state.collection();\n\n // Get the focused item\n const focusedItem = focusedKey != null && isOpen ? collection.getItem(focusedKey) : null;\n\n // Announce focus changes on Apple devices\n if (isAppleDevice() && focusedItem != null && focusedKey !== lastFocusedKey) {\n const isSelected = state.selectedKey() === focusedKey;\n const optionText = focusedItem.textValue || \"\";\n\n // For now, we don't support sections, so isGroupChange is always false\n const announcement = stringFormatter().format(\"focusAnnouncement\", {\n isGroupChange: false,\n groupTitle: \"\",\n groupCount: 0,\n optionText,\n isSelected,\n });\n\n announce(announcement, \"polite\");\n }\n\n lastFocusedKey = focusedKey;\n });\n\n // Announce the number of available suggestions when it changes\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const isOpen = state.isOpen();\n const collection = state.collection();\n const optionCount = getItemCount(collection);\n const focusedKey = state.focusedKey();\n\n // Only announce the number of options available when the menu opens if there is no\n // focused item, otherwise screen readers will typically read e.g. \"1 of 6\".\n // The exception is VoiceOver since this isn't included in the message above.\n const didOpenWithoutFocusedItem =\n isOpen !== lastIsOpen && (focusedKey == null || isAppleDevice());\n\n if (isOpen && (didOpenWithoutFocusedItem || optionCount !== lastOptionCount)) {\n const announcement = stringFormatter().format(\"countAnnouncement\", { optionCount });\n announce(announcement, \"polite\");\n }\n\n lastOptionCount = optionCount;\n lastIsOpen = isOpen;\n });\n\n // Announce when a selection occurs for VoiceOver. Other screen readers typically do this automatically.\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const selectedKey = state.selectedKey();\n const selectedItem = state.selectedItem();\n\n if (isAppleDevice() && state.isFocused() && selectedItem && selectedKey !== lastSelectedKey) {\n const optionText = selectedItem.textValue || \"\";\n const announcement = stringFormatter().format(\"selectedAnnouncement\", { optionText });\n announce(announcement, \"polite\");\n }\n\n lastSelectedKey = selectedKey;\n });\n\n // Hide other page content from screen readers when the listbox is open.\n // This requires both the input and listbox refs to be available.\n // Note: This feature is important for screen reader accessibility but\n // only works when a popoverRef/listBoxRef is provided.\n createEffect(() => {\n if (isServer) return;\n\n const isOpen = state.isOpen();\n const inputEl = inputRef();\n const listBoxEl = listBoxRef?.();\n\n // Only apply ariaHideOutside if we have both elements available\n // This ensures the listbox won't be accidentally hidden\n if (isOpen && inputEl && listBoxEl) {\n const cleanup = ariaHideOutside([inputEl, listBoxEl]);\n onCleanup(cleanup);\n }\n });\n\n // Handle press on button trigger\n let wasOpenOnButtonPressStart = false;\n const scheduleButtonOpenFallback = (startedOpen: boolean) => {\n if (startedOpen) {\n return;\n }\n\n setTimeout(() => {\n const p = getProps();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n if (!state.isOpen() && !isDisabled && !isReadOnly) {\n inputRef()?.focus();\n state.open(null, \"manual\");\n }\n }, 0);\n };\n\n const { pressProps } = createPress({\n get isDisabled() {\n return (\n (getProps().isDisabled ?? state.isDisabled) || (getProps().isReadOnly ?? state.isReadOnly)\n );\n },\n preventFocusOnPress: true,\n onPressStart(e) {\n if (e.pointerType === \"touch\") {\n return;\n }\n\n wasOpenOnButtonPressStart = state.isOpen();\n inputRef()?.focus();\n state.toggle(\n e.pointerType === \"keyboard\" || e.pointerType === \"virtual\" ? \"first\" : null,\n \"manual\",\n );\n scheduleButtonOpenFallback(wasOpenOnButtonPressStart);\n },\n onPress(e) {\n if (e.pointerType !== \"touch\") {\n return;\n }\n\n wasOpenOnButtonPressStart = state.isOpen();\n inputRef()?.focus();\n state.toggle(null, \"manual\");\n scheduleButtonOpenFallback(wasOpenOnButtonPressStart);\n },\n });\n\n // Handle input change\n const onInputChange: JSX.EventHandler<HTMLInputElement, InputEvent> = (e) => {\n const target = e.target as HTMLInputElement;\n state.setInputValue(target.value);\n };\n\n // Keyboard navigation for input\n const onInputKeyDown: JSX.EventHandler<HTMLInputElement, KeyboardEvent> = (e) => {\n const p = getProps();\n if (p.isDisabled || p.isReadOnly) return;\n\n const collection = state.collection();\n const focusedKey = state.focusedKey();\n const shouldWrap = p.shouldFocusWrap ?? false;\n\n switch (e.key) {\n case \"Enter\":\n if (state.isOpen() && focusedKey != null) {\n e.preventDefault();\n\n // Check if the focused item is a link\n // Link href can be in props (for components) or value (for dynamic items)\n const collectionItem = collection.getItem(focusedKey);\n const itemHref =\n collectionItem?.props?.href ??\n (collectionItem?.value as Record<string, unknown> | null)?.href;\n if (itemHref) {\n // Find the actual anchor element in the DOM and trigger navigation\n const listBox = listBoxRef?.();\n if (listBox) {\n const item = listBox.querySelector(`[data-key=\"${CSS.escape(String(focusedKey))}\"]`);\n if (item instanceof HTMLAnchorElement) {\n openLink(item, e);\n }\n }\n state.close();\n } else {\n state.commit();\n }\n }\n break;\n\n case \"Escape\":\n if (state.isOpen()) {\n e.preventDefault();\n e.stopPropagation();\n state.revert();\n }\n break;\n\n case \"ArrowDown\":\n e.preventDefault();\n if (!state.isOpen()) {\n state.open(\"first\", \"manual\");\n } else {\n // Move to next item\n if (focusedKey == null) {\n const firstKey = collection.getFirstKey();\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n } else {\n let nextKey = collection.getKeyAfter(focusedKey);\n // Skip disabled keys\n while (nextKey != null && state.isKeyDisabled(nextKey)) {\n nextKey = collection.getKeyAfter(nextKey);\n }\n if (nextKey != null) {\n state.setFocusedKey(nextKey);\n } else if (shouldWrap) {\n // Wrap to first\n let firstKey = collection.getFirstKey();\n while (firstKey != null && state.isKeyDisabled(firstKey)) {\n firstKey = collection.getKeyAfter(firstKey);\n }\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n }\n }\n }\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n if (!state.isOpen()) {\n state.open(\"last\", \"manual\");\n } else {\n // Move to previous item\n if (focusedKey == null) {\n const lastKey = collection.getLastKey();\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n } else {\n let prevKey = collection.getKeyBefore(focusedKey);\n // Skip disabled keys\n while (prevKey != null && state.isKeyDisabled(prevKey)) {\n prevKey = collection.getKeyBefore(prevKey);\n }\n if (prevKey != null) {\n state.setFocusedKey(prevKey);\n } else if (shouldWrap) {\n // Wrap to last\n let lastKey = collection.getLastKey();\n while (lastKey != null && state.isKeyDisabled(lastKey)) {\n lastKey = collection.getKeyBefore(lastKey);\n }\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n }\n }\n }\n break;\n\n case \"Home\":\n if (state.isOpen()) {\n e.preventDefault();\n let firstKey = collection.getFirstKey();\n while (firstKey != null && state.isKeyDisabled(firstKey)) {\n firstKey = collection.getKeyAfter(firstKey);\n }\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n }\n break;\n\n case \"End\":\n if (state.isOpen()) {\n e.preventDefault();\n let lastKey = collection.getLastKey();\n while (lastKey != null && state.isKeyDisabled(lastKey)) {\n lastKey = collection.getKeyBefore(lastKey);\n }\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n }\n break;\n\n case \"Backspace\":\n // In multiple mode, remove last selected key when input is empty\n if (state.selectionMode() === \"multiple\" && state.inputValue() === \"\") {\n const keys = state.selectedKeys();\n if (keys.size > 0) {\n const lastKey = Array.from(keys).pop()!;\n state.removeSelectedKey(lastKey);\n }\n }\n break;\n\n case \"Tab\":\n // Commit on Tab if menu is open\n if (state.isOpen() && focusedKey != null) {\n state.commit();\n }\n break;\n }\n };\n\n // Handle focus events\n const handleFocus = (e: FocusEvent) => {\n state.setFocused(true);\n getProps().onFocus?.(e);\n getProps().onFocusChange?.(true);\n };\n\n // Track the last touch event time for iPad VoiceOver double-tap debouncing\n let lastEventTime = 0;\n\n const handleBlur = (e: FocusEvent) => {\n // Use synchronous ref checks instead of requestAnimationFrame\n // This matches React Aria's implementation and is more reliable\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const button = buttonRef?.();\n const listBox = listBoxRef?.();\n\n // Don't blur if focus is moving to the button\n const blurFromButton = button && button === relatedTarget;\n\n // Don't blur if focus is moving into the listbox/popover\n const blurIntoPopover = listBox?.contains(relatedTarget);\n\n if (blurFromButton || blurIntoPopover) {\n return;\n }\n\n // If a pointerdown happened inside the listbox, don't close\n // This handles the case when clicking on a non-focusable option\n if (isPointerDownInsideListBox) {\n isPointerDownInsideListBox = false;\n return;\n }\n\n // Call user's onBlur handler\n getProps().onBlur?.(e);\n\n state.setFocused(false);\n getProps().onFocusChange?.(false);\n };\n\n // Handle touch events for iPad VoiceOver\n // VoiceOver on iOS fires a touchend at the center of the element on double-tap.\n // We detect this and toggle the combobox manually to avoid issues with focus management.\n const handleTouchEnd = (e: TouchEvent) => {\n const p = getProps();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n\n if (isDisabled || isReadOnly) {\n return;\n }\n\n // Debounce rapid consecutive touchend events (< 500ms)\n // This handles VoiceOver's double-tap behavior\n if (e.timeStamp - lastEventTime < 500) {\n e.preventDefault();\n inputRef()?.focus();\n return;\n }\n\n // Detect VoiceOver virtual click - it fires at the exact center of the element\n const rect = (e.target as Element).getBoundingClientRect();\n const touch = e.changedTouches[0];\n const centerX = Math.ceil(rect.left + 0.5 * rect.width);\n const centerY = Math.ceil(rect.top + 0.5 * rect.height);\n\n if (touch.clientX === centerX && touch.clientY === centerY) {\n e.preventDefault();\n inputRef()?.focus();\n state.toggle(null, \"manual\");\n lastEventTime = e.timeStamp;\n }\n };\n\n return {\n get labelProps() {\n return labelProps as JSX.HTMLAttributes<HTMLElement>;\n },\n get inputProps() {\n const p = getProps();\n const isOpen = state.isOpen();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n const focusedKey = state.focusedKey();\n\n return mergeProps(\n domProps(),\n focusProps as Record<string, unknown>,\n fieldProps as Record<string, unknown>,\n {\n id: inputId,\n type: \"text\",\n role: \"combobox\",\n get value() {\n return state.inputValue();\n },\n tabIndex: isDisabled ? undefined : 0,\n disabled: isDisabled || undefined,\n readOnly: isReadOnly || undefined,\n placeholder: p.placeholder,\n autoComplete: \"off\",\n \"aria-autocomplete\": p.autoComplete ?? \"list\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? listBoxId : undefined,\n \"aria-activedescendant\":\n isOpen && focusedKey != null ? `${listBoxId}-option-${focusedKey}` : undefined,\n \"aria-disabled\": isDisabled || undefined,\n \"aria-required\": p.isRequired || undefined,\n \"aria-invalid\": p.isInvalid || undefined,\n \"aria-describedby\": getAriaDescribedBy(),\n name: p.name,\n onInput: onInputChange,\n onKeyDown: onInputKeyDown,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onTouchEnd: handleTouchEnd,\n \"data-open\": isOpen || undefined,\n \"data-disabled\": isDisabled || undefined,\n \"data-readonly\": isReadOnly || undefined,\n \"data-focus-visible\": isFocusVisible() || undefined,\n } as Record<string, unknown>,\n ) as JSX.InputHTMLAttributes<HTMLInputElement>;\n },\n get buttonProps() {\n const p = getProps();\n const isOpen = state.isOpen();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n\n return mergeProps(\n pressProps as Record<string, unknown>,\n {\n id: buttonId,\n type: \"button\",\n tabIndex: -1,\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? listBoxId : undefined,\n \"aria-disabled\": isDisabled || isReadOnly || undefined,\n disabled: isDisabled || isReadOnly || undefined,\n \"aria-label\": stringFormatter?.().format(\"buttonLabel\") ?? \"Show suggestions\",\n \"data-open\": isOpen || undefined,\n \"data-disabled\": isDisabled || isReadOnly || undefined,\n } as Record<string, unknown>,\n ) as JSX.HTMLAttributes<HTMLElement>;\n },\n get listBoxProps() {\n const isMulti = state.selectionMode() === \"multiple\";\n return {\n id: listBoxId,\n role: \"listbox\",\n \"aria-labelledby\": inputId,\n \"aria-multiselectable\": isMulti || undefined,\n tabIndex: -1,\n shouldSelectOnPressUp: true,\n shouldFocusOnHover: true,\n // Track pointerdown inside listbox to prevent blur from closing\n // Use capture phase because createPress calls stopPropagation on pointerdown\n onPointerDownCapture: () => {\n isPointerDownInsideListBox = true;\n },\n onMouseDownCapture: () => {\n // Fallback for environments without PointerEvent\n isPointerDownInsideListBox = true;\n },\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n get descriptionProps() {\n return {\n id: descriptionId,\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n get errorMessageProps() {\n return {\n id: errorMessageId,\n role: \"alert\",\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n isFocused,\n isFocusVisible: () => isFocused() && isFocusVisible(),\n isOpen: state.isOpen,\n selectedItem: state.selectedItem,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox.jsx","names":["enUS","esES","mergeProps"],"sources":["../../src/combobox/intl/en-US.json","../../src/combobox/intl/es-ES.json","../../src/combobox/intl/generated-locales.ts","../../src/combobox/intl/index.ts","../../src/combobox/createComboBox.ts"],"sourcesContent":["","","// @ts-nocheck — generated verbatim from upstream compiled output.\n// The announcement functions call the formatter's protected plural/number/select\n// helpers (as upstream's own compiled bundle does), which strict TS rejects from\n// outside the class. This file is not hand-maintained; regenerate from upstream.\n/**\n * ComboBox internationalization strings — full upstream locale set.\n *\n * Generated verbatim from @react-aria/combobox/dist/<locale>.mjs (RAC 1.19 /\n * @react-aria/combobox 3.14.2). Do not hand-edit; regenerate from upstream.\n *\n * Announcement keys (focus/count/selected) are LocalizedString FUNCTIONS,\n * matching upstream's compiled form; the port's LocalizedStringFormatter (from\n * @internationalized/string) invokes them identically. Label keys are strings.\n *\n * en-US and es-ES are intentionally omitted here — index.ts sources those from\n * the hand-authored ICU-string JSON so their proven output/tests stay intact.\n */\n\nimport type { LocalizedString, LocalizedStrings } from \"@internationalized/string\";\n\n/* eslint-disable */\n/* prettier-ignore */\nexport const generatedComboBoxLocales: LocalizedStrings<\n \"focusAnnouncement\" | \"countAnnouncement\" | \"selectedAnnouncement\" | \"buttonLabel\" | \"listboxLabel\",\n LocalizedString\n> = {\n \"ar-AE\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{627}\\u{644}\\u{645}\\u{62C}\\u{645}\\u{648}\\u{639}\\u{629} \\u{627}\\u{644}\\u{645}\\u{62F}\\u{62E}\\u{644}\\u{629} ${args.groupTitle}, \\u{645}\\u{639} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{62E}\\u{64A}\\u{627}\\u{631}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{62E}\\u{64A}\\u{627}\\u{631}\\u{627}\\u{62A}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{645}\\u{62D}\\u{62F}\\u{62F}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{62E}\\u{64A}\\u{627}\\u{631}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{62E}\\u{64A}\\u{627}\\u{631}\\u{627}\\u{62A}`\n })} \\u{645}\\u{62A}\\u{627}\\u{62D}\\u{629}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}\\u{60C} \\u{645}\\u{62D}\\u{62F}\\u{62F}`,\n \"buttonLabel\": \"عرض المقترحات\",\n \"listboxLabel\": \"مقترحات\",\n },\n \"bg-BG\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{412}\\u{44A}\\u{432}\\u{435}\\u{434}\\u{435}\\u{43D}\\u{430} \\u{433}\\u{440}\\u{443}\\u{43F}\\u{430} ${args.groupTitle}, \\u{441} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{43E}\\u{43F}\\u{446}\\u{438}\\u{44F}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{43E}\\u{43F}\\u{446}\\u{438}\\u{438}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{438}\\u{437}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{438}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{43E}\\u{43F}\\u{446}\\u{438}\\u{44F}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{43E}\\u{43F}\\u{446}\\u{438}\\u{438}`\n })} \\u{43D}\\u{430} \\u{440}\\u{430}\\u{437}\\u{43F}\\u{43E}\\u{43B}\\u{43E}\\u{436}\\u{435}\\u{43D}\\u{438}\\u{435}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{438}\\u{437}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{438}`,\n \"buttonLabel\": \"Покажи предложения\",\n \"listboxLabel\": \"Предложения\",\n },\n \"cs-CZ\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Zadan\\xe1 skupina \\u{201E}${args.groupTitle}\\u{201C} ${formatter.plural(args.groupCount, {\n one: ()=>`s ${formatter.number(args.groupCount)} mo\\u{17E}nost\\xed`,\n other: ()=>`se ${formatter.number(args.groupCount)} mo\\u{17E}nostmi`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: ` (vybr\\xe1no)`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`K dispozici ${formatter.plural(args.optionCount, {\n one: ()=>`je ${formatter.number(args.optionCount)} mo\\u{17E}nost`,\n other: ()=>`jsou/je ${formatter.number(args.optionCount)} mo\\u{17E}nosti/-\\xed`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, vybr\\xe1no`,\n \"buttonLabel\": \"Zobrazit doporučení\",\n \"listboxLabel\": \"Návrhy\",\n },\n \"da-DK\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Angivet gruppe ${args.groupTitle}, med ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} mulighed`,\n other: ()=>`${formatter.number(args.groupCount)} muligheder`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, valgt`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} mulighed tilg\\xe6ngelig`,\n other: ()=>`${formatter.number(args.optionCount)} muligheder tilg\\xe6ngelige`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, valgt`,\n \"buttonLabel\": \"Vis forslag\",\n \"listboxLabel\": \"Forslag\",\n },\n \"de-DE\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Eingetretene Gruppe ${args.groupTitle}, mit ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} Option`,\n other: ()=>`${formatter.number(args.groupCount)} Optionen`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, ausgew\\xe4hlt`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} Option`,\n other: ()=>`${formatter.number(args.optionCount)} Optionen`\n })} verf\\xfcgbar.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, ausgew\\xe4hlt`,\n \"buttonLabel\": \"Empfehlungen anzeigen\",\n \"listboxLabel\": \"Empfehlungen\",\n },\n \"el-GR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{395}\\u{3B9}\\u{3C3}\\u{3B1}\\u{3B3}\\u{3BC}\\u{3AD}\\u{3BD}\\u{3B7} \\u{3BF}\\u{3BC}\\u{3AC}\\u{3B4}\\u{3B1} ${args.groupTitle}, \\u{3BC}\\u{3B5} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3BF}\\u{3B3}\\u{3AE}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3BF}\\u{3B3}\\u{3AD}\\u{3C2}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3B5}\\u{3B3}\\u{3BC}\\u{3AD}\\u{3BD}\\u{3BF}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3BF}\\u{3B3}\\u{3AE}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3BF}\\u{3B3}\\u{3AD}\\u{3C2} `\n })} \\u{3B4}\\u{3B9}\\u{3B1}\\u{3B8}\\u{3AD}\\u{3C3}\\u{3B9}\\u{3BC}\\u{3B5}\\u{3C2}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{3B5}\\u{3C0}\\u{3B9}\\u{3BB}\\u{3AD}\\u{3C7}\\u{3B8}\\u{3B7}\\u{3BA}\\u{3B5}`,\n \"buttonLabel\": \"Προβολή προτάσεων\",\n \"listboxLabel\": \"Προτάσεις\",\n },\n \"et-EE\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Sisestatud r\\xfchm ${args.groupTitle}, valikuga ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} valik`,\n other: ()=>`${formatter.number(args.groupCount)} valikud`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, valitud`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} valik`,\n other: ()=>`${formatter.number(args.optionCount)} valikud`\n })} saadaval.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, valitud`,\n \"buttonLabel\": \"Kuva soovitused\",\n \"listboxLabel\": \"Soovitused\",\n },\n \"fi-FI\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Mentiin ryhm\\xe4\\xe4n ${args.groupTitle}, ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} vaihtoehdon`,\n other: ()=>`${formatter.number(args.groupCount)} vaihtoehdon`\n })} kanssa.`,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, valittu`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} vaihtoehto`,\n other: ()=>`${formatter.number(args.optionCount)} vaihtoehdot`\n })} saatavilla.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, valittu`,\n \"buttonLabel\": \"Näytä ehdotukset\",\n \"listboxLabel\": \"Ehdotukset\",\n },\n \"fr-FR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Groupe ${args.groupTitle} rejoint, avec ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} option`,\n other: ()=>`${formatter.number(args.groupCount)} options`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, s\\xe9lectionn\\xe9(s)`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} option`,\n other: ()=>`${formatter.number(args.optionCount)} options`\n })} disponible(s).`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, s\\xe9lectionn\\xe9`,\n \"buttonLabel\": \"Afficher les suggestions\",\n \"listboxLabel\": \"Suggestions\",\n },\n \"he-IL\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{5E0}\\u{5DB}\\u{5E0}\\u{5E1} \\u{5DC}\\u{5E7}\\u{5D1}\\u{5D5}\\u{5E6}\\u{5D4} ${args.groupTitle}, \\u{5E2}\\u{5DD} ${formatter.plural(args.groupCount, {\n one: ()=>`\\u{5D0}\\u{5E4}\\u{5E9}\\u{5E8}\\u{5D5}\\u{5EA} ${formatter.number(args.groupCount)}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{5D0}\\u{5E4}\\u{5E9}\\u{5E8}\\u{5D5}\\u{5D9}\\u{5D5}\\u{5EA}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{5E0}\\u{5D1}\\u{5D7}\\u{5E8}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`\\u{5D0}\\u{5E4}\\u{5E9}\\u{5E8}\\u{5D5}\\u{5EA} ${formatter.number(args.optionCount)}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{5D0}\\u{5E4}\\u{5E9}\\u{5E8}\\u{5D5}\\u{5D9}\\u{5D5}\\u{5EA}`\n })} \\u{5D1}\\u{5DE}\\u{5E6}\\u{5D1} \\u{5D6}\\u{5DE}\\u{5D9}\\u{5DF}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{5E0}\\u{5D1}\\u{5D7}\\u{5E8}`,\n \"buttonLabel\": \"הצג הצעות\",\n \"listboxLabel\": \"הצעות\",\n },\n \"hr-HR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Unesena skupina ${args.groupTitle}, s ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opcijom`,\n other: ()=>`${formatter.number(args.groupCount)} opcije/a`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, odabranih`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`Dostupno jo\\u{161}: ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opcija`,\n other: ()=>`${formatter.number(args.optionCount)} opcije/a`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, odabrano`,\n \"buttonLabel\": \"Prikaži prijedloge\",\n \"listboxLabel\": \"Prijedlozi\",\n },\n \"hu-HU\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Bel\\xe9pett a(z) ${args.groupTitle} csoportba, amely ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} lehet\\u{151}s\\xe9get`,\n other: ()=>`${formatter.number(args.groupCount)} lehet\\u{151}s\\xe9get`\n })} tartalmaz. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, kijel\\xf6lve`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} lehet\\u{151}s\\xe9g`,\n other: ()=>`${formatter.number(args.optionCount)} lehet\\u{151}s\\xe9g`\n })} \\xe1ll rendelkez\\xe9sre.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, kijel\\xf6lve`,\n \"buttonLabel\": \"Javaslatok megjelenítése\",\n \"listboxLabel\": \"Javaslatok\",\n },\n \"it-IT\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Ingresso nel gruppo ${args.groupTitle}, con ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opzione`,\n other: ()=>`${formatter.number(args.groupCount)} opzioni`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, selezionato`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opzione disponibile`,\n other: ()=>`${formatter.number(args.optionCount)} opzioni disponibili`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, selezionato`,\n \"buttonLabel\": \"Mostra suggerimenti\",\n \"listboxLabel\": \"Suggerimenti\",\n },\n \"ja-JP\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{5165}\\u{529B}\\u{3055}\\u{308C}\\u{305F}\\u{30B0}\\u{30EB}\\u{30FC}\\u{30D7} ${args.groupTitle}\\u{3001}${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{500B}\\u{306E}\\u{30AA}\\u{30D7}\\u{30B7}\\u{30E7}\\u{30F3}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{500B}\\u{306E}\\u{30AA}\\u{30D7}\\u{30B7}\\u{30E7}\\u{30F3}`\n })}\\u{3092}\\u{542B}\\u{3080}\\u{3002}`,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `\\u{3001}\\u{9078}\\u{629E}\\u{6E08}\\u{307F}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{500B}\\u{306E}\\u{30AA}\\u{30D7}\\u{30B7}\\u{30E7}\\u{30F3}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{500B}\\u{306E}\\u{30AA}\\u{30D7}\\u{30B7}\\u{30E7}\\u{30F3}`\n })}\\u{3092}\\u{5229}\\u{7528}\\u{3067}\\u{304D}\\u{307E}\\u{3059}\\u{3002}`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}\\u{3001}\\u{9078}\\u{629E}\\u{6E08}\\u{307F}`,\n \"buttonLabel\": \"候補を表示\",\n \"listboxLabel\": \"候補\",\n },\n \"ko-KR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{C785}\\u{B825}\\u{D55C} \\u{ADF8}\\u{B8F9} ${args.groupTitle}, ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)}\\u{AC1C} \\u{C635}\\u{C158}`,\n other: ()=>`${formatter.number(args.groupCount)}\\u{AC1C} \\u{C635}\\u{C158}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{C120}\\u{D0DD}\\u{B428}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)}\\u{AC1C} \\u{C635}\\u{C158}`,\n other: ()=>`${formatter.number(args.optionCount)}\\u{AC1C} \\u{C635}\\u{C158}`\n })}\\u{C744} \\u{C0AC}\\u{C6A9}\\u{D560} \\u{C218} \\u{C788}\\u{C2B5}\\u{B2C8}\\u{B2E4}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{C120}\\u{D0DD}\\u{B428}`,\n \"buttonLabel\": \"제안 사항 표시\",\n \"listboxLabel\": \"제안\",\n },\n \"lt-LT\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{12E}vesta grup\\u{117} ${args.groupTitle}, su ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} parinktimi`,\n other: ()=>`${formatter.number(args.groupCount)} parinktimis (-i\\u{173})`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, pasirinkta`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`Yra ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} parinktis`,\n other: ()=>`${formatter.number(args.optionCount)} parinktys (-i\\u{173})`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, pasirinkta`,\n \"buttonLabel\": \"Rodyti pasiūlymus\",\n \"listboxLabel\": \"Pasiūlymai\",\n },\n \"lv-LV\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Ievad\\u{12B}ta grupa ${args.groupTitle}, ar ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opciju`,\n other: ()=>`${formatter.number(args.groupCount)} opcij\\u{101}m`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, atlas\\u{12B}ta`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`Pieejamo opciju skaits: ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opcija`,\n other: ()=>`${formatter.number(args.optionCount)} opcijas`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, atlas\\u{12B}ta`,\n \"buttonLabel\": \"Rādīt ieteikumus\",\n \"listboxLabel\": \"Ieteikumi\",\n },\n \"nb-NO\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Angitt gruppe ${args.groupTitle}, med ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} alternativ`,\n other: ()=>`${formatter.number(args.groupCount)} alternativer`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, valgt`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} alternativ`,\n other: ()=>`${formatter.number(args.optionCount)} alternativer`\n })} finnes.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, valgt`,\n \"buttonLabel\": \"Vis forslag\",\n \"listboxLabel\": \"Forslag\",\n },\n \"nl-NL\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Groep ${args.groupTitle} ingevoerd met ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} optie`,\n other: ()=>`${formatter.number(args.groupCount)} opties`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, geselecteerd`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} optie`,\n other: ()=>`${formatter.number(args.optionCount)} opties`\n })} beschikbaar.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, geselecteerd`,\n \"buttonLabel\": \"Suggesties weergeven\",\n \"listboxLabel\": \"Suggesties\",\n },\n \"pl-PL\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Do\\u{142}\\u{105}czono do grupy ${args.groupTitle}, z ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opcj\\u{105}`,\n other: ()=>`${formatter.number(args.groupCount)} opcjami`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, wybrano`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`dost\\u{119}pna/dost\\u{119}pne(-nych) ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opcja`,\n other: ()=>`${formatter.number(args.optionCount)} opcje(-i)`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, wybrano`,\n \"buttonLabel\": \"Wyświetlaj sugestie\",\n \"listboxLabel\": \"Sugestie\",\n },\n \"pt-BR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Grupo inserido ${args.groupTitle}, com ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} op\\xe7\\xe3o`,\n other: ()=>`${formatter.number(args.groupCount)} op\\xe7\\xf5es`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, selecionado`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} op\\xe7\\xe3o`,\n other: ()=>`${formatter.number(args.optionCount)} op\\xe7\\xf5es`\n })} dispon\\xedvel.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, selecionado`,\n \"buttonLabel\": \"Mostrar sugestões\",\n \"listboxLabel\": \"Sugestões\",\n },\n \"pt-PT\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Grupo introduzido ${args.groupTitle}, com ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} op\\xe7\\xe3o`,\n other: ()=>`${formatter.number(args.groupCount)} op\\xe7\\xf5es`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, selecionado`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} op\\xe7\\xe3o`,\n other: ()=>`${formatter.number(args.optionCount)} op\\xe7\\xf5es`\n })} dispon\\xedvel.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, selecionado`,\n \"buttonLabel\": \"Apresentar sugestões\",\n \"listboxLabel\": \"Sugestões\",\n },\n \"ro-RO\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Grup ${args.groupTitle} introdus, cu ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} op\\u{21B}iune`,\n other: ()=>`${formatter.number(args.groupCount)} op\\u{21B}iuni`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, selectat`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} op\\u{21B}iune`,\n other: ()=>`${formatter.number(args.optionCount)} op\\u{21B}iuni`\n })} disponibile.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, selectat`,\n \"buttonLabel\": \"Afișare sugestii\",\n \"listboxLabel\": \"Sugestii\",\n },\n \"ru-RU\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{412}\\u{432}\\u{435}\\u{434}\\u{435}\\u{43D}\\u{43D}\\u{430}\\u{44F} \\u{433}\\u{440}\\u{443}\\u{43F}\\u{43F}\\u{430} ${args.groupTitle}, \\u{441} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}\\u{43E}\\u{43C}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}\\u{430}\\u{43C}\\u{438}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{432}\\u{44B}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{43D}\\u{44B}\\u{43C}\\u{438}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}\\u{43E}\\u{432}`\n })} \\u{434}\\u{43E}\\u{441}\\u{442}\\u{443}\\u{43F}\\u{43D}\\u{43E}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{432}\\u{44B}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{43E}`,\n \"buttonLabel\": \"Показать предложения\",\n \"listboxLabel\": \"Предложения\",\n },\n \"sk-SK\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Zadan\\xe1 skupina ${args.groupTitle}, s ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} mo\\u{17E}nos\\u{165}ou`,\n other: ()=>`${formatter.number(args.groupCount)} mo\\u{17E}nos\\u{165}ami`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, vybrat\\xe9`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} mo\\u{17E}nos\\u{165}`,\n other: ()=>`${formatter.number(args.optionCount)} mo\\u{17E}nosti/-\\xed`\n })} k dispoz\\xedcii.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, vybrat\\xe9`,\n \"buttonLabel\": \"Zobraziť návrhy\",\n \"listboxLabel\": \"Návrhy\",\n },\n \"sl-SI\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Vnesena skupina ${args.groupTitle}, z ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opcija`,\n other: ()=>`${formatter.number(args.groupCount)} opcije`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, izbrano`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`Na voljo je ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opcija`,\n other: ()=>`${formatter.number(args.optionCount)} opcije`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, izbrano`,\n \"buttonLabel\": \"Prikaži predloge\",\n \"listboxLabel\": \"Predlogi\",\n },\n \"sr-SP\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Unesena grupa ${args.groupTitle}, s ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} opcijom`,\n other: ()=>`${formatter.number(args.groupCount)} optione/a`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, izabranih`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`Dostupno jo\\u{161}: ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} opcija`,\n other: ()=>`${formatter.number(args.optionCount)} opcije/a`\n })}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, izabrano`,\n \"buttonLabel\": \"Prikaži predloge\",\n \"listboxLabel\": \"Predlozi\",\n },\n \"sv-SE\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Ingick i gruppen ${args.groupTitle} med ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} alternativ`,\n other: ()=>`${formatter.number(args.groupCount)} alternativ`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, valda`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} alternativ`,\n other: ()=>`${formatter.number(args.optionCount)} alternativ`\n })} tillg\\xe4ngliga.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, valda`,\n \"buttonLabel\": \"Visa förslag\",\n \"listboxLabel\": \"Förslag\",\n },\n \"tr-TR\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`Girilen grup ${args.groupTitle}, ile ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} se\\xe7enek`,\n other: ()=>`${formatter.number(args.groupCount)} se\\xe7enekler`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, se\\xe7ildi`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} se\\xe7enek`,\n other: ()=>`${formatter.number(args.optionCount)} se\\xe7enekler`\n })} kullan\\u{131}labilir.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, se\\xe7ildi`,\n \"buttonLabel\": \"Önerileri göster\",\n \"listboxLabel\": \"Öneriler\",\n },\n \"uk-UA\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{412}\\u{432}\\u{435}\\u{434}\\u{435}\\u{43D}\\u{430} \\u{433}\\u{440}\\u{443}\\u{43F}\\u{430} ${args.groupTitle}, \\u{437} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}\\u{438}(-\\u{456}\\u{432})`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{432}\\u{438}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{43E}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{43F}\\u{430}\\u{440}\\u{430}\\u{43C}\\u{435}\\u{442}\\u{440}\\u{438}(-\\u{456}\\u{432})`\n })} \\u{434}\\u{43E}\\u{441}\\u{442}\\u{443}\\u{43F}\\u{43D}\\u{43E}.`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{432}\\u{438}\\u{431}\\u{440}\\u{430}\\u{43D}\\u{43E}`,\n \"buttonLabel\": \"Показати пропозиції\",\n \"listboxLabel\": \"Пропозиції\",\n },\n \"zh-CN\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{8FDB}\\u{5165}\\u{4E86} ${args.groupTitle} \\u{7EC4}\\u{FF0C}\\u{5176}\\u{4E2D}\\u{6709} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{4E2A}\\u{9009}\\u{9879}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{4E2A}\\u{9009}\\u{9879}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{5DF2}\\u{9009}\\u{62E9}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`\\u{6709} ${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{4E2A}\\u{9009}\\u{9879}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{4E2A}\\u{9009}\\u{9879}`\n })}\\u{53EF}\\u{7528}\\u{3002}`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{5DF2}\\u{9009}\\u{62E9}`,\n \"buttonLabel\": \"显示建议\",\n \"listboxLabel\": \"建议\",\n },\n \"zh-TW\": {\n \"focusAnnouncement\": (args, formatter)=>`${formatter.select({\n true: ()=>`\\u{8F38}\\u{5165}\\u{7684}\\u{7FA4}\\u{7D44} ${args.groupTitle}, \\u{6709} ${formatter.plural(args.groupCount, {\n one: ()=>`${formatter.number(args.groupCount)} \\u{9078}\\u{9805}`,\n other: ()=>`${formatter.number(args.groupCount)} \\u{9078}\\u{9805}`\n })}. `,\n other: ``\n }, args.isGroupChange)}${args.optionText}${formatter.select({\n true: `, \\u{5DF2}\\u{9078}\\u{53D6}`,\n other: ``\n }, args.isSelected)}`,\n \"countAnnouncement\": (args, formatter)=>`${formatter.plural(args.optionCount, {\n one: ()=>`${formatter.number(args.optionCount)} \\u{9078}\\u{9805}`,\n other: ()=>`${formatter.number(args.optionCount)} \\u{9078}\\u{9805}`\n })} \\u{53EF}\\u{7528}\\u{3002}`,\n \"selectedAnnouncement\": (args)=>`${args.optionText}, \\u{5DF2}\\u{9078}\\u{53D6}`,\n \"buttonLabel\": \"顯示建議\",\n \"listboxLabel\": \"建議\",\n },\n};\n","/**\n * ComboBox internationalization strings\n * Based on @react-aria/combobox/intl\n */\n\nimport type { LocalizedString, LocalizedStrings } from \"@internationalized/string\";\n\n// Import locale files\nimport enUS from \"./en-US.json\" with { type: \"json\" };\nimport esES from \"./es-ES.json\" with { type: \"json\" };\n// Full upstream locale set (32 locales; en-US/es-ES sourced from the JSON above).\nimport { generatedComboBoxLocales } from \"./generated-locales\";\n\nexport type ComboBoxIntlStrings = {\n focusAnnouncement: string;\n countAnnouncement: string;\n selectedAnnouncement: string;\n buttonLabel: string;\n listboxLabel: string;\n};\n\n// Announcement keys are LocalizedString functions in the generated locales\n// (matching upstream's compiled form), so the value type widens to\n// LocalizedString. The hand-authored en-US/es-ES stay as ICU strings and win.\nexport const comboBoxIntlStrings: LocalizedStrings<keyof ComboBoxIntlStrings, LocalizedString> = {\n ...generatedComboBoxLocales,\n \"en-US\": enUS,\n \"es-ES\": esES,\n};\n","/**\n * Provides the behavior and accessibility implementation for a combobox component.\n * A combobox combines a text input with a listbox, allowing users to filter a list of options.\n * Based on @react-aria/combobox useComboBox.\n */\n\nimport { type JSX, type Accessor, createEffect, onCleanup } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport { createPress } from \"../interactions/createPress\";\nimport { createFocusRing } from \"../interactions/createFocusRing\";\nimport { createLabel } from \"../label/createLabel\";\nimport { createLabels } from \"../label/createLabels\";\nimport { filterDOMProps } from \"../utils/filterDOMProps\";\nimport { mergeProps } from \"../utils/mergeProps\";\nimport { createId } from \"../ssr\";\nimport { access, type MaybeAccessor } from \"../utils/reactivity\";\nimport { isAppleDevice } from \"../utils/platform\";\nimport { openLink } from \"../utils/dom\";\nimport { ariaHideOutside } from \"../overlays/ariaHideOutside\";\nimport { announce } from \"../live-announcer\";\nimport { createStringFormatter } from \"../i18n\";\nimport { comboBoxIntlStrings } from \"./intl\";\nimport { isDevEnv } from \"../utils/env\";\nimport type { ComboBoxState, CollectionNode, Key } from \"@proyecto-viviana/solid-stately\";\n\n/**\n * Helper to count items in a collection\n */\nfunction getItemCount<T>(collection: { getKeys(): Iterable<Key> }): number {\n let count = 0;\n for (const _ of collection.getKeys()) {\n count++;\n }\n return count;\n}\n\nexport interface AriaComboBoxProps {\n /** An ID for the combobox. */\n id?: string;\n /** Whether the combobox is disabled. */\n isDisabled?: boolean;\n /** Whether the combobox is required. */\n isRequired?: boolean;\n /** Whether the combobox is read-only. */\n isReadOnly?: boolean;\n /** The label for the combobox. */\n label?: JSX.Element;\n /** An accessible label for the combobox when no visible label is provided. */\n \"aria-label\"?: string;\n /** The ID of an element that labels the combobox. */\n \"aria-labelledby\"?: string;\n /** The ID of an element that describes the combobox. */\n \"aria-describedby\"?: string;\n /** Description text for assistive technology and form help. */\n description?: string;\n /** Error message text for assistive technology and validation feedback. */\n errorMessage?: string;\n /** Whether the current value is invalid. */\n isInvalid?: boolean;\n /** Placeholder text for the input when no value is entered. */\n placeholder?: string;\n /** Whether the combobox should be auto-focused. */\n autoFocus?: boolean;\n /** Handler called when focus moves to the combobox input. */\n onFocus?: (e: FocusEvent) => void;\n /** Handler called when focus moves away from the combobox input. */\n onBlur?: (e: FocusEvent) => void;\n /** Handler called when the focus state changes. */\n onFocusChange?: (isFocused: boolean) => void;\n /** The name of the combobox, used when submitting an HTML form. */\n name?: string;\n /** The form owner for the combobox input. */\n form?: string;\n /**\n * Describes the type of autocomplete functionality the input should provide.\n * @default 'list'\n */\n autoComplete?: \"list\" | \"none\" | \"inline\" | \"both\";\n /** Whether focus should wrap from the last item to the first. */\n shouldFocusWrap?: boolean;\n}\n\nexport interface ComboBoxAria<T> {\n /** Props for the label element. */\n labelProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the input element. */\n inputProps: JSX.InputHTMLAttributes<HTMLInputElement>;\n /** Props for the trigger button element. */\n buttonProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the listbox popup. */\n listBoxProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the description element, if any. */\n descriptionProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the error message element, if any. */\n errorMessageProps: JSX.HTMLAttributes<HTMLElement>;\n /** Whether the input is currently focused. */\n isFocused: Accessor<boolean>;\n /** Whether the input has keyboard focus. */\n isFocusVisible: Accessor<boolean>;\n /** Whether the listbox is currently open. */\n isOpen: Accessor<boolean>;\n /** The currently selected item. */\n selectedItem: Accessor<CollectionNode<T> | null>;\n}\n\n// Shared data between combobox and options\nconst comboBoxData = new WeakMap<object, ComboBoxData>();\n\ninterface ComboBoxData {\n id: string;\n listBoxId: string;\n}\n\nexport function getComboBoxData(state: ComboBoxState<unknown>): ComboBoxData | undefined {\n return comboBoxData.get(state);\n}\n\n/**\n * Provides the behavior and accessibility implementation for a combobox component.\n */\nexport function createComboBox<T>(\n props: MaybeAccessor<AriaComboBoxProps>,\n state: ComboBoxState<T>,\n inputRef: () => HTMLInputElement | null,\n buttonRef?: () => HTMLElement | null,\n listBoxRef?: () => HTMLElement | null,\n): ComboBoxAria<T> {\n const getProps = () => access(props);\n const id = createId(getProps().id);\n\n // Development-time warning for missing accessibility labels\n if (isDevEnv()) {\n const p = getProps();\n if (!p.label && !p[\"aria-label\"] && !p[\"aria-labelledby\"]) {\n console.warn(\n \"[solidaria] A ComboBox requires a label, aria-label, or aria-labelledby attribute for accessibility.\",\n );\n }\n }\n\n // Track if a pointerdown happened inside the listbox to prevent blur from closing\n let isPointerDownInsideListBox = false;\n\n // Generate IDs for associated elements\n const inputId = `${id}-input`;\n const buttonId = `${id}-button`;\n const listBoxId = `${id}-listbox`;\n const descriptionId = `${id}-description`;\n const errorMessageId = `${id}-error`;\n\n const getAriaDescribedBy = () => {\n const p = getProps();\n const ids: string[] = [];\n if (p[\"aria-describedby\"]) {\n ids.push(p[\"aria-describedby\"]);\n }\n if (p.description) {\n ids.push(descriptionId);\n }\n if (p.isInvalid && p.errorMessage) {\n ids.push(errorMessageId);\n }\n return ids.length > 0 ? ids.join(\" \") : undefined;\n };\n\n // Set up global pointerdown listener to track clicks inside listbox\n // This is needed because the option's createPress stops propagation\n createEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const handleGlobalPointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n // Check if the click is inside the listbox\n if (target.closest(`[id=\"${listBoxId}\"]`)) {\n isPointerDownInsideListBox = true;\n }\n };\n\n document.addEventListener(\"pointerdown\", handleGlobalPointerDown, true);\n\n onCleanup(() => {\n document.removeEventListener(\"pointerdown\", handleGlobalPointerDown, true);\n });\n });\n\n // Filter DOM props\n const domProps = () =>\n filterDOMProps(getProps() as unknown as Record<string, unknown>, {\n labelable: true,\n propNames: new Set([\"form\"]),\n });\n\n // Share data with child options\n createEffect(() => {\n comboBoxData.set(state, { id, listBoxId });\n\n onCleanup(() => {\n comboBoxData.delete(state);\n });\n });\n\n // Label handling\n const { labelProps, fieldProps } = createLabel({\n get id() {\n return inputId;\n },\n get label() {\n return getProps().label;\n },\n get \"aria-label\"() {\n return getProps()[\"aria-label\"];\n },\n get \"aria-labelledby\"() {\n return getProps()[\"aria-labelledby\"];\n },\n labelElementType: \"label\",\n });\n\n // Focus ring for keyboard focus styling. `isTextInput: true` mirrors RAC's\n // `<Input>` (react-aria-components Input.tsx:84-85): a text input focused via\n // pointer (e.g. clicking the chevron to open) must NOT read as focus-visible,\n // and typing must not flash the ring. Without it the input — and, through the\n // option's activedescendant focus-visible inheritance, the highlighted option —\n // paints the brighter `:focused` neutral/accent tokens on a mouse open.\n const { isFocusVisible, focusProps } = createFocusRing({\n isTextInput: true,\n get autoFocus() {\n return getProps().autoFocus;\n },\n });\n\n // Track focus state from state\n const isFocused = state.isFocused;\n\n // String formatter for VoiceOver announcements\n // Only create on client side\n const stringFormatter = !isServer ? createStringFormatter(comboBoxIntlStrings) : null;\n\n // Track previous values for announcements\n let lastFocusedKey: Key | null = null;\n let lastSelectedKey: Key | null = null;\n let lastOptionCount = 0;\n let lastIsOpen = false;\n\n // VoiceOver has issues with announcing aria-activedescendant properly on change\n // (especially on iOS). We use a live region announcer to announce focus changes\n // manually. This matches React Aria's behavior.\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const focusedKey = state.focusedKey();\n const isOpen = state.isOpen();\n const collection = state.collection();\n\n // Get the focused item\n const focusedItem = focusedKey != null && isOpen ? collection.getItem(focusedKey) : null;\n\n // Announce focus changes on Apple devices\n if (isAppleDevice() && focusedItem != null && focusedKey !== lastFocusedKey) {\n const isSelected = state.selectedKey() === focusedKey;\n const optionText = focusedItem.textValue || \"\";\n\n // For now, we don't support sections, so isGroupChange is always false\n const announcement = stringFormatter().format(\"focusAnnouncement\", {\n isGroupChange: false,\n groupTitle: \"\",\n groupCount: 0,\n optionText,\n isSelected,\n });\n\n announce(announcement, \"polite\");\n }\n\n lastFocusedKey = focusedKey;\n });\n\n // Announce the number of available suggestions when it changes\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const isOpen = state.isOpen();\n const collection = state.collection();\n const optionCount = getItemCount(collection);\n const focusedKey = state.focusedKey();\n\n // Only announce the number of options available when the menu opens if there is no\n // focused item, otherwise screen readers will typically read e.g. \"1 of 6\".\n // The exception is VoiceOver since this isn't included in the message above.\n const didOpenWithoutFocusedItem =\n isOpen !== lastIsOpen && (focusedKey == null || isAppleDevice());\n\n if (isOpen && (didOpenWithoutFocusedItem || optionCount !== lastOptionCount)) {\n const announcement = stringFormatter().format(\"countAnnouncement\", { optionCount });\n announce(announcement, \"polite\");\n }\n\n lastOptionCount = optionCount;\n lastIsOpen = isOpen;\n });\n\n // Announce when a selection occurs for VoiceOver. Other screen readers typically do this automatically.\n createEffect(() => {\n if (isServer || !stringFormatter) return;\n\n const selectedKey = state.selectedKey();\n const selectedItem = state.selectedItem();\n\n if (isAppleDevice() && state.isFocused() && selectedItem && selectedKey !== lastSelectedKey) {\n const optionText = selectedItem.textValue || \"\";\n const announcement = stringFormatter().format(\"selectedAnnouncement\", { optionText });\n announce(announcement, \"polite\");\n }\n\n lastSelectedKey = selectedKey;\n });\n\n // Hide other page content from screen readers when the listbox is open.\n // This requires both the input and listbox refs to be available.\n // Note: This feature is important for screen reader accessibility but\n // only works when a popoverRef/listBoxRef is provided.\n createEffect(() => {\n if (isServer) return;\n\n const isOpen = state.isOpen();\n const inputEl = inputRef();\n const listBoxEl = listBoxRef?.();\n\n // Only apply ariaHideOutside if we have both elements available\n // This ensures the listbox won't be accidentally hidden\n if (isOpen && inputEl && listBoxEl) {\n const cleanup = ariaHideOutside([inputEl, listBoxEl]);\n onCleanup(cleanup);\n }\n });\n\n // Handle press on button trigger\n let wasOpenOnButtonPressStart = false;\n const scheduleButtonOpenFallback = (startedOpen: boolean) => {\n if (startedOpen) {\n return;\n }\n\n setTimeout(() => {\n const p = getProps();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n if (!state.isOpen() && !isDisabled && !isReadOnly) {\n inputRef()?.focus();\n state.open(null, \"manual\");\n }\n }, 0);\n };\n\n const { pressProps } = createPress({\n get isDisabled() {\n return (\n (getProps().isDisabled ?? state.isDisabled) || (getProps().isReadOnly ?? state.isReadOnly)\n );\n },\n preventFocusOnPress: true,\n onPressStart(e) {\n if (e.pointerType === \"touch\") {\n return;\n }\n\n wasOpenOnButtonPressStart = state.isOpen();\n inputRef()?.focus();\n state.toggle(\n e.pointerType === \"keyboard\" || e.pointerType === \"virtual\" ? \"first\" : null,\n \"manual\",\n );\n scheduleButtonOpenFallback(wasOpenOnButtonPressStart);\n },\n onPress(e) {\n if (e.pointerType !== \"touch\") {\n return;\n }\n\n wasOpenOnButtonPressStart = state.isOpen();\n inputRef()?.focus();\n state.toggle(null, \"manual\");\n scheduleButtonOpenFallback(wasOpenOnButtonPressStart);\n },\n });\n\n // Handle input change\n const onInputChange: JSX.EventHandler<HTMLInputElement, InputEvent> = (e) => {\n const target = e.target as HTMLInputElement;\n state.setInputValue(target.value);\n };\n\n // Keyboard navigation for input\n const onInputKeyDown: JSX.EventHandler<HTMLInputElement, KeyboardEvent> = (e) => {\n const p = getProps();\n if (p.isDisabled || p.isReadOnly) return;\n\n const collection = state.collection();\n const focusedKey = state.focusedKey();\n const shouldWrap = p.shouldFocusWrap ?? false;\n\n switch (e.key) {\n case \"Enter\":\n if (state.isOpen() && focusedKey != null) {\n e.preventDefault();\n\n // Check if the focused item is a link\n // Link href can be in props (for components) or value (for dynamic items)\n const collectionItem = collection.getItem(focusedKey);\n const itemHref =\n collectionItem?.props?.href ??\n (collectionItem?.value as Record<string, unknown> | null)?.href;\n if (itemHref) {\n // Find the actual anchor element in the DOM and trigger navigation\n const listBox = listBoxRef?.();\n if (listBox) {\n const item = listBox.querySelector(`[data-key=\"${CSS.escape(String(focusedKey))}\"]`);\n if (item instanceof HTMLAnchorElement) {\n openLink(item, e);\n }\n }\n state.close();\n } else {\n state.commit();\n }\n }\n break;\n\n case \"Escape\":\n if (state.isOpen()) {\n e.preventDefault();\n e.stopPropagation();\n state.revert();\n }\n break;\n\n case \"ArrowDown\":\n e.preventDefault();\n if (!state.isOpen()) {\n state.open(\"first\", \"manual\");\n } else {\n // Move to next item\n if (focusedKey == null) {\n const firstKey = collection.getFirstKey();\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n } else {\n let nextKey = collection.getKeyAfter(focusedKey);\n // Skip disabled keys\n while (nextKey != null && state.isKeyDisabled(nextKey)) {\n nextKey = collection.getKeyAfter(nextKey);\n }\n if (nextKey != null) {\n state.setFocusedKey(nextKey);\n } else if (shouldWrap) {\n // Wrap to first\n let firstKey = collection.getFirstKey();\n while (firstKey != null && state.isKeyDisabled(firstKey)) {\n firstKey = collection.getKeyAfter(firstKey);\n }\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n }\n }\n }\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n if (!state.isOpen()) {\n state.open(\"last\", \"manual\");\n } else {\n // Move to previous item\n if (focusedKey == null) {\n const lastKey = collection.getLastKey();\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n } else {\n let prevKey = collection.getKeyBefore(focusedKey);\n // Skip disabled keys\n while (prevKey != null && state.isKeyDisabled(prevKey)) {\n prevKey = collection.getKeyBefore(prevKey);\n }\n if (prevKey != null) {\n state.setFocusedKey(prevKey);\n } else if (shouldWrap) {\n // Wrap to last\n let lastKey = collection.getLastKey();\n while (lastKey != null && state.isKeyDisabled(lastKey)) {\n lastKey = collection.getKeyBefore(lastKey);\n }\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n }\n }\n }\n break;\n\n case \"Home\":\n if (state.isOpen()) {\n e.preventDefault();\n let firstKey = collection.getFirstKey();\n while (firstKey != null && state.isKeyDisabled(firstKey)) {\n firstKey = collection.getKeyAfter(firstKey);\n }\n if (firstKey != null) {\n state.setFocusedKey(firstKey);\n }\n }\n break;\n\n case \"End\":\n if (state.isOpen()) {\n e.preventDefault();\n let lastKey = collection.getLastKey();\n while (lastKey != null && state.isKeyDisabled(lastKey)) {\n lastKey = collection.getKeyBefore(lastKey);\n }\n if (lastKey != null) {\n state.setFocusedKey(lastKey);\n }\n }\n break;\n\n case \"Backspace\":\n // In multiple mode, remove last selected key when input is empty\n if (state.selectionMode() === \"multiple\" && state.inputValue() === \"\") {\n const keys = state.selectedKeys();\n if (keys.size > 0) {\n const lastKey = Array.from(keys).pop()!;\n state.removeSelectedKey(lastKey);\n }\n }\n break;\n\n case \"Tab\":\n // Commit on Tab if menu is open\n if (state.isOpen() && focusedKey != null) {\n state.commit();\n }\n break;\n }\n };\n\n // Handle focus events\n const handleFocus = (e: FocusEvent) => {\n state.setFocused(true);\n getProps().onFocus?.(e);\n getProps().onFocusChange?.(true);\n };\n\n // Track the last touch event time for iPad VoiceOver double-tap debouncing\n let lastEventTime = 0;\n\n const handleBlur = (e: FocusEvent) => {\n // Use synchronous ref checks instead of requestAnimationFrame\n // This matches React Aria's implementation and is more reliable\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const button = buttonRef?.();\n const listBox = listBoxRef?.();\n\n // Don't blur if focus is moving to the button\n const blurFromButton = button && button === relatedTarget;\n\n // Don't blur if focus is moving into the listbox/popover\n const blurIntoPopover = listBox?.contains(relatedTarget);\n\n if (blurFromButton || blurIntoPopover) {\n return;\n }\n\n // If a pointerdown happened inside the listbox, don't close\n // This handles the case when clicking on a non-focusable option\n if (isPointerDownInsideListBox) {\n isPointerDownInsideListBox = false;\n return;\n }\n\n // Call user's onBlur handler\n getProps().onBlur?.(e);\n\n state.setFocused(false);\n getProps().onFocusChange?.(false);\n };\n\n // Handle touch events for iPad VoiceOver\n // VoiceOver on iOS fires a touchend at the center of the element on double-tap.\n // We detect this and toggle the combobox manually to avoid issues with focus management.\n const handleTouchEnd = (e: TouchEvent) => {\n const p = getProps();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n\n if (isDisabled || isReadOnly) {\n return;\n }\n\n // Debounce rapid consecutive touchend events (< 500ms)\n // This handles VoiceOver's double-tap behavior\n if (e.timeStamp - lastEventTime < 500) {\n e.preventDefault();\n inputRef()?.focus();\n return;\n }\n\n // Detect VoiceOver virtual click - it fires at the exact center of the element\n const rect = (e.target as Element).getBoundingClientRect();\n const touch = e.changedTouches[0];\n const centerX = Math.ceil(rect.left + 0.5 * rect.width);\n const centerY = Math.ceil(rect.top + 0.5 * rect.height);\n\n if (touch.clientX === centerX && touch.clientY === centerY) {\n e.preventDefault();\n inputRef()?.focus();\n state.toggle(null, \"manual\");\n lastEventTime = e.timeStamp;\n }\n };\n\n return {\n get labelProps() {\n return labelProps as JSX.HTMLAttributes<HTMLElement>;\n },\n get inputProps() {\n const p = getProps();\n const isOpen = state.isOpen();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n const focusedKey = state.focusedKey();\n\n return mergeProps(\n domProps(),\n focusProps as Record<string, unknown>,\n fieldProps as Record<string, unknown>,\n {\n id: inputId,\n type: \"text\",\n role: \"combobox\",\n get value() {\n return state.inputValue();\n },\n tabIndex: isDisabled ? undefined : 0,\n disabled: isDisabled || undefined,\n readOnly: isReadOnly || undefined,\n placeholder: p.placeholder,\n autoComplete: \"off\",\n \"aria-autocomplete\": p.autoComplete ?? \"list\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? listBoxId : undefined,\n \"aria-activedescendant\":\n isOpen && focusedKey != null ? `${listBoxId}-option-${focusedKey}` : undefined,\n \"aria-disabled\": isDisabled || undefined,\n \"aria-required\": p.isRequired || undefined,\n \"aria-invalid\": p.isInvalid || undefined,\n \"aria-describedby\": getAriaDescribedBy(),\n name: p.name,\n onInput: onInputChange,\n onKeyDown: onInputKeyDown,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onTouchEnd: handleTouchEnd,\n \"data-open\": isOpen || undefined,\n \"data-disabled\": isDisabled || undefined,\n \"data-readonly\": isReadOnly || undefined,\n \"data-focus-visible\": isFocusVisible() || undefined,\n } as Record<string, unknown>,\n ) as JSX.InputHTMLAttributes<HTMLInputElement>;\n },\n get buttonProps() {\n const p = getProps();\n const isOpen = state.isOpen();\n const isDisabled = p.isDisabled ?? state.isDisabled;\n const isReadOnly = p.isReadOnly ?? state.isReadOnly;\n\n // Mirror useComboBox: fold the field label into the trigger's name via\n // useLabels — keeps aria-label (\"Show suggestions\") and self-references the\n // button so the accessible name resolves to \"<buttonLabel> <fieldLabel>\".\n const triggerLabels = createLabels({\n id: buttonId,\n \"aria-label\": stringFormatter?.().format(\"buttonLabel\") ?? \"Show suggestions\",\n \"aria-labelledby\": p[\"aria-labelledby\"] ?? labelProps.id,\n });\n\n return mergeProps(\n pressProps as Record<string, unknown>,\n {\n id: buttonId,\n type: \"button\",\n tabIndex: -1,\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? listBoxId : undefined,\n \"aria-disabled\": isDisabled || isReadOnly || undefined,\n disabled: isDisabled || isReadOnly || undefined,\n \"aria-label\": triggerLabels[\"aria-label\"],\n \"aria-labelledby\": triggerLabels[\"aria-labelledby\"],\n \"data-open\": isOpen || undefined,\n \"data-disabled\": isDisabled || isReadOnly || undefined,\n } as Record<string, unknown>,\n ) as JSX.HTMLAttributes<HTMLElement>;\n },\n get listBoxProps() {\n const p = getProps();\n const isMulti = state.selectionMode() === \"multiple\";\n // Mirror useComboBox: name the listbox via useLabels — aria-label\n // (\"Suggestions\") folded with the field label id (not the input id).\n const boxLabels = createLabels({\n id: listBoxId,\n \"aria-label\": stringFormatter?.().format(\"listboxLabel\") ?? \"Suggestions\",\n \"aria-labelledby\": p[\"aria-labelledby\"] ?? labelProps.id,\n });\n return {\n id: listBoxId,\n role: \"listbox\",\n \"aria-label\": boxLabels[\"aria-label\"],\n \"aria-labelledby\": boxLabels[\"aria-labelledby\"],\n \"aria-multiselectable\": isMulti || undefined,\n // No tabIndex here: useComboBox's listBoxProps never set one\n // (useComboBox.ts:488-496) — the popover listbox's tabIndex flows from\n // `useSelectableCollection`, which leaves it `undefined` under virtual\n // focus so the container never enters the roving-focus trail. createListBox\n // computes that (undefined for virtual focus); hardcoding -1 here made the\n // listbox a stray `[tabindex]` node in the D5 focus snapshot.\n shouldSelectOnPressUp: true,\n shouldFocusOnHover: true,\n // Track pointerdown inside listbox to prevent blur from closing\n // Use capture phase because createPress calls stopPropagation on pointerdown\n onPointerDownCapture: () => {\n isPointerDownInsideListBox = true;\n },\n onMouseDownCapture: () => {\n // Fallback for environments without PointerEvent\n isPointerDownInsideListBox = true;\n },\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n get descriptionProps() {\n return {\n id: descriptionId,\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n get errorMessageProps() {\n return {\n id: errorMessageId,\n role: \"alert\",\n } as JSX.HTMLAttributes<HTMLElement>;\n },\n isFocused,\n isFocusVisible: () => isFocused() && isFocusVisible(),\n isOpen: state.isOpen,\n selectedItem: state.selectedItem,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/selection/constants.ts
|
|
2
|
+
/**
|
|
3
|
+
* Custom DOM event names used to drive virtual focus into a selectable
|
|
4
|
+
* collection from an outside controller (e.g. an Autocomplete input). Mirrors
|
|
5
|
+
* @react-aria/selection's `utils/constants` (`FOCUS_EVENT` / `CLEAR_FOCUS_EVENT`).
|
|
6
|
+
*
|
|
7
|
+
* Canonical home is here, in the selection layer, because the collection is the
|
|
8
|
+
* consumer that listens for them. A controller that wants to move virtual focus
|
|
9
|
+
* (the deferred autocomplete-collection bridge) dispatches these onto the
|
|
10
|
+
* collection ref.
|
|
11
|
+
*/
|
|
12
|
+
/** Dispatched onto a collection to focus it (optionally its first item). */
|
|
13
|
+
const FOCUS_EVENT = "react-aria-focus";
|
|
14
|
+
/** Dispatched onto a collection to blur it (optionally clearing the focused key). */
|
|
15
|
+
const CLEAR_FOCUS_EVENT = "react-aria-clear-focus";
|
|
16
|
+
//#endregion
|
|
17
|
+
export { FOCUS_EVENT as n, CLEAR_FOCUS_EVENT as t };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../src/selection/constants.ts"],"sourcesContent":["/**\n * Custom DOM event names used to drive virtual focus into a selectable\n * collection from an outside controller (e.g. an Autocomplete input). Mirrors\n * @react-aria/selection's `utils/constants` (`FOCUS_EVENT` / `CLEAR_FOCUS_EVENT`).\n *\n * Canonical home is here, in the selection layer, because the collection is the\n * consumer that listens for them. A controller that wants to move virtual focus\n * (the deferred autocomplete-collection bridge) dispatches these onto the\n * collection ref.\n */\n\n/** Dispatched onto a collection to focus it (optionally its first item). */\nexport const FOCUS_EVENT = \"react-aria-focus\";\n\n/** Dispatched onto a collection to blur it (optionally clearing the focused key). */\nexport const CLEAR_FOCUS_EVENT = \"react-aria-clear-focus\";\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,cAAc;;AAG3B,MAAa,oBAAoB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/selection/constants.ts
|
|
2
|
+
/**
|
|
3
|
+
* Custom DOM event names used to drive virtual focus into a selectable
|
|
4
|
+
* collection from an outside controller (e.g. an Autocomplete input). Mirrors
|
|
5
|
+
* @react-aria/selection's `utils/constants` (`FOCUS_EVENT` / `CLEAR_FOCUS_EVENT`).
|
|
6
|
+
*
|
|
7
|
+
* Canonical home is here, in the selection layer, because the collection is the
|
|
8
|
+
* consumer that listens for them. A controller that wants to move virtual focus
|
|
9
|
+
* (the deferred autocomplete-collection bridge) dispatches these onto the
|
|
10
|
+
* collection ref.
|
|
11
|
+
*/
|
|
12
|
+
/** Dispatched onto a collection to focus it (optionally its first item). */
|
|
13
|
+
const FOCUS_EVENT = "react-aria-focus";
|
|
14
|
+
/** Dispatched onto a collection to blur it (optionally clearing the focused key). */
|
|
15
|
+
const CLEAR_FOCUS_EVENT = "react-aria-clear-focus";
|
|
16
|
+
//#endregion
|
|
17
|
+
export { FOCUS_EVENT as n, CLEAR_FOCUS_EVENT as t };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=constants.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.jsx","names":[],"sources":["../../src/selection/constants.ts"],"sourcesContent":["/**\n * Custom DOM event names used to drive virtual focus into a selectable\n * collection from an outside controller (e.g. an Autocomplete input). Mirrors\n * @react-aria/selection's `utils/constants` (`FOCUS_EVENT` / `CLEAR_FOCUS_EVENT`).\n *\n * Canonical home is here, in the selection layer, because the collection is the\n * consumer that listens for them. A controller that wants to move virtual focus\n * (the deferred autocomplete-collection bridge) dispatches these onto the\n * collection ref.\n */\n\n/** Dispatched onto a collection to focus it (optionally its first item). */\nexport const FOCUS_EVENT = \"react-aria-focus\";\n\n/** Dispatched onto a collection to blur it (optionally clearing the focused key). */\nexport const CLEAR_FOCUS_EVENT = \"react-aria-clear-focus\";\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,cAAc;;AAG3B,MAAa,oBAAoB"}
|
|
@@ -1,173 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
//#region src/i18n/utils.ts
|
|
4
|
-
/**
|
|
5
|
-
* i18n utilities for solidaria
|
|
6
|
-
*
|
|
7
|
-
* RTL detection and locale utilities.
|
|
8
|
-
*
|
|
9
|
-
* Port of @react-aria/i18n utils.
|
|
10
|
-
*/
|
|
11
|
-
const RTL_SCRIPTS = new Set([
|
|
12
|
-
"Arab",
|
|
13
|
-
"Syrc",
|
|
14
|
-
"Samr",
|
|
15
|
-
"Mand",
|
|
16
|
-
"Thaa",
|
|
17
|
-
"Mend",
|
|
18
|
-
"Nkoo",
|
|
19
|
-
"Adlm",
|
|
20
|
-
"Rohg",
|
|
21
|
-
"Hebr"
|
|
22
|
-
]);
|
|
23
|
-
const RTL_LANGS = new Set([
|
|
24
|
-
"ae",
|
|
25
|
-
"ar",
|
|
26
|
-
"arc",
|
|
27
|
-
"bcc",
|
|
28
|
-
"bqi",
|
|
29
|
-
"ckb",
|
|
30
|
-
"dv",
|
|
31
|
-
"fa",
|
|
32
|
-
"glk",
|
|
33
|
-
"he",
|
|
34
|
-
"ku",
|
|
35
|
-
"mzn",
|
|
36
|
-
"nqo",
|
|
37
|
-
"pnb",
|
|
38
|
-
"ps",
|
|
39
|
-
"sd",
|
|
40
|
-
"ug",
|
|
41
|
-
"ur",
|
|
42
|
-
"yi"
|
|
43
|
-
]);
|
|
44
|
-
/**
|
|
45
|
-
* Determines if a locale is read right to left.
|
|
46
|
-
* Uses Intl.Locale API when available for accurate detection.
|
|
47
|
-
*/
|
|
48
|
-
function isRTL(localeString) {
|
|
49
|
-
if (typeof Intl !== "undefined" && Intl.Locale) try {
|
|
50
|
-
const locale = new Intl.Locale(localeString).maximize();
|
|
51
|
-
const localeAny = locale;
|
|
52
|
-
const textInfo = typeof localeAny.getTextInfo === "function" ? localeAny.getTextInfo() : localeAny.textInfo;
|
|
53
|
-
if (textInfo) return textInfo.direction === "rtl";
|
|
54
|
-
if (locale.script) return RTL_SCRIPTS.has(locale.script);
|
|
55
|
-
} catch {}
|
|
56
|
-
const lang = localeString.split("-")[0];
|
|
57
|
-
return RTL_LANGS.has(lang);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Creates a cache key for formatter options.
|
|
61
|
-
*/
|
|
62
|
-
function createCacheKey(locale, options) {
|
|
63
|
-
if (!options) return locale;
|
|
64
|
-
return locale + Object.entries(options).sort((a, b) => a[0] < b[0] ? -1 : 1).join();
|
|
65
|
-
}
|
|
66
|
-
//#endregion
|
|
67
|
-
//#region src/i18n/locale.tsx
|
|
68
|
-
/**
|
|
69
|
-
* Locale context and provider for solidaria
|
|
70
|
-
*
|
|
71
|
-
* Provides locale and text direction to the component tree.
|
|
72
|
-
*
|
|
73
|
-
* Port of @react-aria/i18n context and useDefaultLocale.
|
|
74
|
-
*/
|
|
75
|
-
const localeSymbol = Symbol.for("solidaria.i18n.locale");
|
|
76
|
-
let currentLocale = null;
|
|
77
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
78
|
-
/**
|
|
79
|
-
* Gets the default locale from the browser/system.
|
|
80
|
-
*/
|
|
81
|
-
function getDefaultLocale() {
|
|
82
|
-
let locale = typeof window !== "undefined" && window[localeSymbol] || typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
|
|
83
|
-
try {
|
|
84
|
-
Intl.DateTimeFormat.supportedLocalesOf([locale]);
|
|
85
|
-
} catch {
|
|
86
|
-
locale = "en-US";
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
locale,
|
|
90
|
-
direction: isRTL(locale) ? "rtl" : "ltr"
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
function updateLocale() {
|
|
94
|
-
currentLocale = getDefaultLocale();
|
|
95
|
-
for (const listener of listeners) listener(currentLocale);
|
|
96
|
-
}
|
|
97
|
-
const I18nContext = createContext(null);
|
|
98
|
-
/**
|
|
99
|
-
* Returns the current browser/system locale, and updates when it changes.
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```tsx
|
|
103
|
-
* const locale = createDefaultLocale();
|
|
104
|
-
* console.log(locale().locale); // 'en-US'
|
|
105
|
-
* console.log(locale().direction); // 'ltr'
|
|
106
|
-
* ```
|
|
107
|
-
*/
|
|
108
|
-
function createDefaultLocale() {
|
|
109
|
-
if (!currentLocale) currentLocale = getDefaultLocale();
|
|
110
|
-
const [locale, setLocale] = createSignal(currentLocale);
|
|
111
|
-
createEffect(() => {
|
|
112
|
-
if (typeof window === "undefined") return;
|
|
113
|
-
if (listeners.size === 0) window.addEventListener("languagechange", updateLocale);
|
|
114
|
-
listeners.add(setLocale);
|
|
115
|
-
onCleanup(() => {
|
|
116
|
-
listeners.delete(setLocale);
|
|
117
|
-
if (listeners.size === 0) window.removeEventListener("languagechange", updateLocale);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
return locale;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Returns the current locale and layout direction from context or browser default.
|
|
124
|
-
*
|
|
125
|
-
* @example
|
|
126
|
-
* ```tsx
|
|
127
|
-
* function MyComponent() {
|
|
128
|
-
* const locale = useLocale();
|
|
129
|
-
* return <div dir={locale().direction}>{locale().locale}</div>;
|
|
130
|
-
* }
|
|
131
|
-
* ```
|
|
132
|
-
*/
|
|
133
|
-
function useLocale() {
|
|
134
|
-
const context = useContext(I18nContext);
|
|
135
|
-
const defaultLocale = createDefaultLocale();
|
|
136
|
-
return context || defaultLocale;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Provides the locale for the application to all child components.
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```tsx
|
|
143
|
-
* // Use browser default locale
|
|
144
|
-
* <I18nProvider>
|
|
145
|
-
* <App />
|
|
146
|
-
* </I18nProvider>
|
|
147
|
-
*
|
|
148
|
-
* // Override with specific locale
|
|
149
|
-
* <I18nProvider locale="ar-SA">
|
|
150
|
-
* <App /> // Will have RTL direction
|
|
151
|
-
* </I18nProvider>
|
|
152
|
-
* ```
|
|
153
|
-
*/
|
|
154
|
-
function I18nProvider(props) {
|
|
155
|
-
const defaultLocale = createDefaultLocale();
|
|
156
|
-
const locale = createMemo(() => {
|
|
157
|
-
if (props.locale) return {
|
|
158
|
-
locale: props.locale,
|
|
159
|
-
direction: isRTL(props.locale) ? "rtl" : "ltr"
|
|
160
|
-
};
|
|
161
|
-
return defaultLocale();
|
|
162
|
-
});
|
|
163
|
-
return createComponent(I18nContext.Provider, {
|
|
164
|
-
value: locale,
|
|
165
|
-
get children() {
|
|
166
|
-
return props.children;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
//#endregion
|
|
1
|
+
import { a as createCacheKey, i as useLocale } from "./locale.js";
|
|
2
|
+
import { createMemo } from "solid-js";
|
|
171
3
|
//#region src/i18n/createCollator.ts
|
|
172
4
|
/**
|
|
173
5
|
* createCollator hook for solidaria
|
|
@@ -224,6 +56,6 @@ function createCollator(options) {
|
|
|
224
56
|
return createMemo(() => getCachedCollator(locale().locale, options));
|
|
225
57
|
}
|
|
226
58
|
//#endregion
|
|
227
|
-
export {
|
|
59
|
+
export { createCollator as t };
|
|
228
60
|
|
|
229
61
|
//# sourceMappingURL=createCollator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createCollator.js","names":["Accessor","JSX","ParentProps","createContext","createEffect","createMemo","createSignal","onCleanup","useContext","isRTL","Direction","Locale","locale","direction","I18nProviderProps","localeSymbol","Symbol","for","currentLocale","listeners","Set","getDefaultLocale","window","Record","navigator","language","userLanguage","Intl","DateTimeFormat","supportedLocalesOf","updateLocale","listener","I18nContext","createDefaultLocale","setLocale","size","addEventListener","add","delete","removeEventListener","useLocale","context","defaultLocale","I18nProvider","props","Element","_$createComponent","Provider","value","children"],"sources":["../../src/i18n/utils.ts","../../src/i18n/locale.tsx","../../src/i18n/createCollator.ts"],"sourcesContent":["/**\n * i18n utilities for solidaria\n *\n * RTL detection and locale utilities.\n *\n * Port of @react-aria/i18n utils.\n */\n\n// https://en.wikipedia.org/wiki/Right-to-left\nconst RTL_SCRIPTS = new Set([\n \"Arab\",\n \"Syrc\",\n \"Samr\",\n \"Mand\",\n \"Thaa\",\n \"Mend\",\n \"Nkoo\",\n \"Adlm\",\n \"Rohg\",\n \"Hebr\",\n]);\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n]);\n\n/**\n * Determines if a locale is read right to left.\n * Uses Intl.Locale API when available for accurate detection.\n */\nexport function isRTL(localeString: string): boolean {\n // If the Intl.Locale API is available, use it to get the locale's text direction.\n if (typeof Intl !== \"undefined\" && Intl.Locale) {\n try {\n const locale = new Intl.Locale(localeString).maximize();\n\n // Use the text info object to get the direction if possible.\n // getTextInfo() was implemented as a property by some browsers before it was standardized as a function.\n const localeAny = locale as unknown as {\n getTextInfo?: () => { direction: string };\n textInfo?: { direction: string };\n };\n const textInfo =\n typeof localeAny.getTextInfo === \"function\" ? localeAny.getTextInfo() : localeAny.textInfo;\n\n if (textInfo) {\n return textInfo.direction === \"rtl\";\n }\n\n // Fallback: guess using the script.\n if (locale.script) {\n return RTL_SCRIPTS.has(locale.script);\n }\n } catch {\n // Fall through to language-based detection\n }\n }\n\n // If not, just guess by the language (first part of the locale)\n const lang = localeString.split(\"-\")[0];\n return RTL_LANGS.has(lang);\n}\n\n/**\n * Creates a cache key for formatter options.\n */\nexport function createCacheKey(locale: string, options?: Record<string, unknown>): string {\n if (!options) {\n return locale;\n }\n return (\n locale +\n Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n );\n}\n","/**\n * Locale context and provider for solidaria\n *\n * Provides locale and text direction to the component tree.\n *\n * Port of @react-aria/i18n context and useDefaultLocale.\n */\n\nimport {\n type Accessor,\n type JSX,\n type ParentProps,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n useContext,\n} from \"solid-js\";\nimport { isRTL } from \"./utils\";\n\n/** Text direction: left-to-right or right-to-left. */\nexport type Direction = \"ltr\" | \"rtl\";\n\n/** Locale information including language code and text direction. */\nexport interface Locale {\n /** The BCP47 language code for the locale (e.g., 'en-US', 'ar-SA'). */\n locale: string;\n /** The writing direction for the locale. */\n direction: Direction;\n}\n\nexport interface I18nProviderProps extends ParentProps {\n /** The locale to apply to the children. If not provided, uses browser default. */\n locale?: string;\n}\n\n// Symbol for server-provided locale\nconst localeSymbol = Symbol.for(\"solidaria.i18n.locale\");\n\nlet currentLocale: Locale | null = null;\nconst listeners = new Set<(locale: Locale) => void>();\n\n/**\n * Gets the default locale from the browser/system.\n */\nexport function getDefaultLocale(): Locale {\n let locale =\n (typeof window !== \"undefined\" &&\n (window as unknown as Record<symbol, string>)[localeSymbol]) ||\n (typeof navigator !== \"undefined\" &&\n (navigator.language || (navigator as unknown as { userLanguage?: string }).userLanguage)) ||\n \"en-US\";\n\n // Validate the locale is supported\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale]);\n } catch {\n locale = \"en-US\";\n }\n\n return {\n locale,\n direction: isRTL(locale) ? \"rtl\" : \"ltr\",\n };\n}\n\nfunction updateLocale(): void {\n currentLocale = getDefaultLocale();\n for (const listener of listeners) {\n listener(currentLocale);\n }\n}\n\nconst I18nContext = createContext<Accessor<Locale> | null>(null);\n\n/**\n * Returns the current browser/system locale, and updates when it changes.\n *\n * @example\n * ```tsx\n * const locale = createDefaultLocale();\n * console.log(locale().locale); // 'en-US'\n * console.log(locale().direction); // 'ltr'\n * ```\n */\nexport function createDefaultLocale(): Accessor<Locale> {\n if (!currentLocale) {\n currentLocale = getDefaultLocale();\n }\n\n const [locale, setLocale] = createSignal<Locale>(currentLocale);\n\n createEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (listeners.size === 0) {\n window.addEventListener(\"languagechange\", updateLocale);\n }\n\n listeners.add(setLocale);\n\n onCleanup(() => {\n listeners.delete(setLocale);\n if (listeners.size === 0) {\n window.removeEventListener(\"languagechange\", updateLocale);\n }\n });\n });\n\n return locale;\n}\n\n/**\n * Returns the current locale and layout direction from context or browser default.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const locale = useLocale();\n * return <div dir={locale().direction}>{locale().locale}</div>;\n * }\n * ```\n */\nexport function useLocale(): Accessor<Locale> {\n const context = useContext(I18nContext);\n const defaultLocale = createDefaultLocale();\n return context || defaultLocale;\n}\n\n/**\n * Provides the locale for the application to all child components.\n *\n * @example\n * ```tsx\n * // Use browser default locale\n * <I18nProvider>\n * <App />\n * </I18nProvider>\n *\n * // Override with specific locale\n * <I18nProvider locale=\"ar-SA\">\n * <App /> // Will have RTL direction\n * </I18nProvider>\n * ```\n */\nexport function I18nProvider(props: I18nProviderProps): JSX.Element {\n const defaultLocale = createDefaultLocale();\n\n const locale = createMemo<Locale>(() => {\n if (props.locale) {\n return {\n locale: props.locale,\n direction: isRTL(props.locale) ? \"rtl\" : \"ltr\",\n };\n }\n return defaultLocale();\n });\n\n return <I18nContext.Provider value={locale}>{props.children}</I18nContext.Provider>;\n}\n","/**\n * createCollator hook for solidaria\n *\n * Provides localized string comparison/collation with caching.\n *\n * Port of @react-aria/i18n useCollator.\n */\n\nimport { createMemo } from \"solid-js\";\nimport { useLocale } from \"./locale\";\nimport { createCacheKey } from \"./utils\";\n\nconst collatorCache = new Map<string, Intl.Collator>();\n\n/**\n * Gets or creates a cached collator.\n */\nfunction getCachedCollator(locale: string, options?: Intl.CollatorOptions): Intl.Collator {\n const cacheKey = createCacheKey(locale, options as Record<string, unknown>);\n\n if (collatorCache.has(cacheKey)) {\n return collatorCache.get(cacheKey)!;\n }\n\n const collator = new Intl.Collator(locale, options);\n collatorCache.set(cacheKey, collator);\n return collator;\n}\n\n/**\n * Provides localized string collation for the current locale.\n * Useful for sorting strings according to locale-specific rules.\n *\n * @example\n * ```tsx\n * function SortedList(props: { items: string[] }) {\n * const collator = createCollator();\n *\n * const sortedItems = () =>\n * [...props.items].sort((a, b) => collator().compare(a, b));\n *\n * return (\n * <ul>\n * <For each={sortedItems()}>\n * {(item) => <li>{item}</li>}\n * </For>\n * </ul>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Case-insensitive sorting\n * const collator = createCollator({ sensitivity: 'base' });\n *\n * // Numeric sorting\n * const numericCollator = createCollator({ numeric: true });\n * // ['a1', 'a10', 'a2'].sort(numericCollator().compare) -> ['a1', 'a2', 'a10']\n * ```\n */\nexport function createCollator(options?: Intl.CollatorOptions): () => Intl.Collator {\n const locale = useLocale();\n\n return createMemo(() => getCachedCollator(locale().locale, options));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createCollator.js","names":[],"sources":["../../src/i18n/createCollator.ts"],"sourcesContent":["/**\n * createCollator hook for solidaria\n *\n * Provides localized string comparison/collation with caching.\n *\n * Port of @react-aria/i18n useCollator.\n */\n\nimport { createMemo } from \"solid-js\";\nimport { useLocale } from \"./locale\";\nimport { createCacheKey } from \"./utils\";\n\nconst collatorCache = new Map<string, Intl.Collator>();\n\n/**\n * Gets or creates a cached collator.\n */\nfunction getCachedCollator(locale: string, options?: Intl.CollatorOptions): Intl.Collator {\n const cacheKey = createCacheKey(locale, options as Record<string, unknown>);\n\n if (collatorCache.has(cacheKey)) {\n return collatorCache.get(cacheKey)!;\n }\n\n const collator = new Intl.Collator(locale, options);\n collatorCache.set(cacheKey, collator);\n return collator;\n}\n\n/**\n * Provides localized string collation for the current locale.\n * Useful for sorting strings according to locale-specific rules.\n *\n * @example\n * ```tsx\n * function SortedList(props: { items: string[] }) {\n * const collator = createCollator();\n *\n * const sortedItems = () =>\n * [...props.items].sort((a, b) => collator().compare(a, b));\n *\n * return (\n * <ul>\n * <For each={sortedItems()}>\n * {(item) => <li>{item}</li>}\n * </For>\n * </ul>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Case-insensitive sorting\n * const collator = createCollator({ sensitivity: 'base' });\n *\n * // Numeric sorting\n * const numericCollator = createCollator({ numeric: true });\n * // ['a1', 'a10', 'a2'].sort(numericCollator().compare) -> ['a1', 'a2', 'a10']\n * ```\n */\nexport function createCollator(options?: Intl.CollatorOptions): () => Intl.Collator {\n const locale = useLocale();\n\n return createMemo(() => getCachedCollator(locale().locale, options));\n}\n"],"mappings":";;;;;;;;;;AAYA,MAAM,gCAAgB,IAAI,IAA2B;;;;AAKrD,SAAS,kBAAkB,QAAgB,SAA+C;CACxF,MAAM,WAAW,eAAe,QAAQ,OAAkC;CAE1E,IAAI,cAAc,IAAI,QAAQ,GAC5B,OAAO,cAAc,IAAI,QAAQ;CAGnC,MAAM,WAAW,IAAI,KAAK,SAAS,QAAQ,OAAO;CAClD,cAAc,IAAI,UAAU,QAAQ;CACpC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAgB,eAAe,SAAqD;CAClF,MAAM,SAAS,UAAU;CAEzB,OAAO,iBAAiB,kBAAkB,OAAO,CAAC,CAAC,QAAQ,OAAO,CAAC;AACrE"}
|