@proyecto-viviana/solidaria 0.3.0 → 0.4.1
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 +141 -0
- package/dist/_chunk/actiongroup.js.map +1 -0
- package/dist/_chunk/actiongroup.jsx +141 -0
- package/dist/_chunk/actiongroup.jsx.map +1 -0
- package/dist/_chunk/announce.js +207 -0
- package/dist/_chunk/announce.js.map +1 -0
- package/dist/_chunk/announce.jsx +207 -0
- package/dist/_chunk/announce.jsx.map +1 -0
- package/dist/_chunk/ariaHideOutside.js +122 -0
- package/dist/_chunk/ariaHideOutside.js.map +1 -0
- package/dist/_chunk/ariaHideOutside.jsx +122 -0
- package/dist/_chunk/ariaHideOutside.jsx.map +1 -0
- package/dist/_chunk/autocomplete.js +244 -0
- package/dist/_chunk/autocomplete.js.map +1 -0
- package/dist/_chunk/autocomplete.jsx +244 -0
- package/dist/_chunk/autocomplete.jsx.map +1 -0
- package/dist/_chunk/breadcrumbs.js +121 -0
- package/dist/_chunk/breadcrumbs.js.map +1 -0
- package/dist/_chunk/breadcrumbs.jsx +121 -0
- package/dist/_chunk/breadcrumbs.jsx.map +1 -0
- package/dist/_chunk/button.js +275 -0
- package/dist/_chunk/button.js.map +1 -0
- package/dist/_chunk/button.jsx +275 -0
- package/dist/_chunk/button.jsx.map +1 -0
- package/dist/_chunk/calendar.js +1037 -0
- package/dist/_chunk/calendar.js.map +1 -0
- package/dist/_chunk/calendar.jsx +1037 -0
- package/dist/_chunk/calendar.jsx.map +1 -0
- package/dist/_chunk/checkbox.js +235 -0
- package/dist/_chunk/checkbox.js.map +1 -0
- package/dist/_chunk/checkbox.jsx +235 -0
- package/dist/_chunk/checkbox.jsx.map +1 -0
- package/dist/_chunk/color.js +1458 -0
- package/dist/_chunk/color.js.map +1 -0
- package/dist/_chunk/color.jsx +1458 -0
- package/dist/_chunk/color.jsx.map +1 -0
- package/dist/_chunk/combobox.js +1062 -0
- package/dist/_chunk/combobox.js.map +1 -0
- package/dist/_chunk/combobox.jsx +1062 -0
- package/dist/_chunk/combobox.jsx.map +1 -0
- 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 +61 -0
- package/dist/_chunk/createCollator.js.map +1 -0
- package/dist/_chunk/createCollator.jsx +61 -0
- package/dist/_chunk/createCollator.jsx.map +1 -0
- package/dist/_chunk/createCollectionRowInteraction.js +133 -0
- package/dist/_chunk/createCollectionRowInteraction.js.map +1 -0
- package/dist/_chunk/createCollectionRowInteraction.jsx +133 -0
- package/dist/_chunk/createCollectionRowInteraction.jsx.map +1 -0
- package/dist/_chunk/createField.js +55 -0
- package/dist/_chunk/createField.js.map +1 -0
- package/dist/_chunk/createField.jsx +55 -0
- package/dist/_chunk/createField.jsx.map +1 -0
- package/dist/_chunk/createFocus.js +105 -0
- package/dist/_chunk/createFocus.js.map +1 -0
- package/dist/_chunk/createFocus.jsx +105 -0
- package/dist/_chunk/createFocus.jsx.map +1 -0
- package/dist/_chunk/createFocusRing.js +54 -0
- package/dist/_chunk/createFocusRing.js.map +1 -0
- package/dist/_chunk/createFocusRing.jsx +54 -0
- package/dist/_chunk/createFocusRing.jsx.map +1 -0
- package/dist/_chunk/createFocusWithin.js +120 -0
- package/dist/_chunk/createFocusWithin.js.map +1 -0
- package/dist/_chunk/createFocusWithin.jsx +120 -0
- package/dist/_chunk/createFocusWithin.jsx.map +1 -0
- package/dist/_chunk/createFocusable.js +131 -0
- package/dist/_chunk/createFocusable.js.map +1 -0
- package/dist/_chunk/createFocusable.jsx +131 -0
- package/dist/_chunk/createFocusable.jsx.map +1 -0
- package/dist/_chunk/createFormReset.js +39 -0
- package/dist/_chunk/createFormReset.js.map +1 -0
- package/dist/_chunk/createFormReset.jsx +39 -0
- package/dist/_chunk/createFormReset.jsx.map +1 -0
- package/dist/_chunk/createFormValidation.js +135 -0
- package/dist/_chunk/createFormValidation.js.map +1 -0
- package/dist/_chunk/createFormValidation.jsx +135 -0
- package/dist/_chunk/createFormValidation.jsx.map +1 -0
- package/dist/_chunk/createHover.js +131 -0
- package/dist/_chunk/createHover.js.map +1 -0
- package/dist/_chunk/createHover.jsx +131 -0
- package/dist/_chunk/createHover.jsx.map +1 -0
- package/dist/_chunk/createInteractionModality.js +268 -0
- package/dist/_chunk/createInteractionModality.js.map +1 -0
- package/dist/_chunk/createInteractionModality.jsx +268 -0
- package/dist/_chunk/createInteractionModality.jsx.map +1 -0
- package/dist/_chunk/createLabel.js +47 -0
- package/dist/_chunk/createLabel.js.map +1 -0
- package/dist/_chunk/createLabel.jsx +47 -0
- package/dist/_chunk/createLabel.jsx.map +1 -0
- package/dist/_chunk/createLabels.js +32 -0
- package/dist/_chunk/createLabels.js.map +1 -0
- package/dist/_chunk/createLabels.jsx +32 -0
- package/dist/_chunk/createLabels.jsx.map +1 -0
- package/dist/_chunk/createLandmark.js +198 -0
- package/dist/_chunk/createLandmark.js.map +1 -0
- package/dist/_chunk/createLandmark.jsx +198 -0
- package/dist/_chunk/createLandmark.jsx.map +1 -0
- package/dist/_chunk/createOverlay.js +327 -0
- package/dist/_chunk/createOverlay.js.map +1 -0
- package/dist/_chunk/createOverlay.jsx +327 -0
- package/dist/_chunk/createOverlay.jsx.map +1 -0
- package/dist/_chunk/createPress.js +526 -0
- package/dist/_chunk/createPress.js.map +1 -0
- package/dist/_chunk/createPress.jsx +526 -0
- package/dist/_chunk/createPress.jsx.map +1 -0
- package/dist/_chunk/createProgressBar.js +82 -0
- package/dist/_chunk/createProgressBar.js.map +1 -0
- package/dist/_chunk/createProgressBar.jsx +82 -0
- package/dist/_chunk/createProgressBar.jsx.map +1 -0
- package/dist/_chunk/createSelectableItem.js +302 -0
- package/dist/_chunk/createSelectableItem.js.map +1 -0
- package/dist/_chunk/createSelectableItem.jsx +302 -0
- package/dist/_chunk/createSelectableItem.jsx.map +1 -0
- 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 +159 -0
- package/dist/_chunk/createToggle.js.map +1 -0
- package/dist/_chunk/createToggle.jsx +159 -0
- package/dist/_chunk/createToggle.jsx.map +1 -0
- package/dist/_chunk/createTypeSelect.js +125 -0
- package/dist/_chunk/createTypeSelect.js.map +1 -0
- package/dist/_chunk/createTypeSelect.jsx +125 -0
- package/dist/_chunk/createTypeSelect.jsx.map +1 -0
- package/dist/_chunk/datepicker.js +1706 -0
- package/dist/_chunk/datepicker.js.map +1 -0
- package/dist/_chunk/datepicker.jsx +1706 -0
- package/dist/_chunk/datepicker.jsx.map +1 -0
- package/dist/_chunk/dialog.js +62 -0
- package/dist/_chunk/dialog.js.map +1 -0
- package/dist/_chunk/dialog.jsx +62 -0
- package/dist/_chunk/dialog.jsx.map +1 -0
- package/dist/_chunk/disclosure.js +185 -0
- package/dist/_chunk/disclosure.js.map +1 -0
- package/dist/_chunk/disclosure.jsx +185 -0
- package/dist/_chunk/disclosure.jsx.map +1 -0
- package/dist/_chunk/dnd.js +2395 -0
- package/dist/_chunk/dnd.js.map +1 -0
- package/dist/_chunk/dnd.jsx +2395 -0
- package/dist/_chunk/dnd.jsx.map +1 -0
- package/dist/_chunk/env.js +87 -0
- package/dist/_chunk/env.js.map +1 -0
- package/dist/_chunk/env.jsx +87 -0
- package/dist/_chunk/env.jsx.map +1 -0
- package/dist/_chunk/filterDOMProps.js +82 -0
- package/dist/_chunk/filterDOMProps.js.map +1 -0
- package/dist/_chunk/filterDOMProps.jsx +82 -0
- package/dist/_chunk/filterDOMProps.jsx.map +1 -0
- package/dist/_chunk/focus.js +399 -0
- package/dist/_chunk/focus.js.map +1 -0
- package/dist/_chunk/focus.jsx +399 -0
- package/dist/_chunk/focus.jsx.map +1 -0
- package/dist/_chunk/focus2.js +631 -0
- package/dist/_chunk/focus2.js.map +1 -0
- package/dist/_chunk/focus2.jsx +631 -0
- package/dist/_chunk/focus2.jsx.map +1 -0
- package/dist/_chunk/grid.js +623 -0
- package/dist/_chunk/grid.js.map +1 -0
- package/dist/_chunk/grid.jsx +623 -0
- package/dist/_chunk/grid.jsx.map +1 -0
- package/dist/_chunk/gridlist.js +369 -0
- package/dist/_chunk/gridlist.js.map +1 -0
- package/dist/_chunk/gridlist.jsx +369 -0
- package/dist/_chunk/gridlist.jsx.map +1 -0
- package/dist/_chunk/i18n.js +199 -0
- package/dist/_chunk/i18n.js.map +1 -0
- package/dist/_chunk/i18n.jsx +199 -0
- package/dist/_chunk/i18n.jsx.map +1 -0
- package/dist/_chunk/interactions.js +331 -0
- package/dist/_chunk/interactions.js.map +1 -0
- package/dist/_chunk/interactions.jsx +325 -0
- package/dist/_chunk/interactions.jsx.map +1 -0
- package/dist/_chunk/link.js +97 -0
- package/dist/_chunk/link.js.map +1 -0
- package/dist/_chunk/link.jsx +97 -0
- package/dist/_chunk/link.jsx.map +1 -0
- package/dist/_chunk/listbox.js +356 -0
- package/dist/_chunk/listbox.js.map +1 -0
- package/dist/_chunk/listbox.jsx +356 -0
- package/dist/_chunk/listbox.jsx.map +1 -0
- 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 +519 -0
- package/dist/_chunk/menu.js.map +1 -0
- package/dist/_chunk/menu.jsx +519 -0
- package/dist/_chunk/menu.jsx.map +1 -0
- package/dist/_chunk/meter.js +33 -0
- package/dist/_chunk/meter.js.map +1 -0
- package/dist/_chunk/meter.jsx +33 -0
- package/dist/_chunk/meter.jsx.map +1 -0
- package/dist/_chunk/numberfield.js +259 -0
- package/dist/_chunk/numberfield.js.map +1 -0
- package/dist/_chunk/numberfield.jsx +259 -0
- package/dist/_chunk/numberfield.jsx.map +1 -0
- package/dist/_chunk/overlays.js +186 -0
- package/dist/_chunk/overlays.js.map +1 -0
- package/dist/_chunk/overlays.jsx +162 -0
- package/dist/_chunk/overlays.jsx.map +1 -0
- package/dist/_chunk/popover.js +574 -0
- package/dist/_chunk/popover.js.map +1 -0
- package/dist/_chunk/popover.jsx +574 -0
- package/dist/_chunk/popover.jsx.map +1 -0
- package/dist/_chunk/radio.js +320 -0
- package/dist/_chunk/radio.js.map +1 -0
- package/dist/_chunk/radio.jsx +320 -0
- package/dist/_chunk/radio.jsx.map +1 -0
- 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 +210 -0
- package/dist/_chunk/searchfield.js.map +1 -0
- package/dist/_chunk/searchfield.jsx +210 -0
- package/dist/_chunk/searchfield.jsx.map +1 -0
- package/dist/_chunk/select.js +406 -0
- package/dist/_chunk/select.js.map +1 -0
- package/dist/_chunk/select.jsx +397 -0
- package/dist/_chunk/select.jsx.map +1 -0
- package/dist/_chunk/selection.js +666 -0
- package/dist/_chunk/selection.js.map +1 -0
- package/dist/_chunk/selection.jsx +666 -0
- package/dist/_chunk/selection.jsx.map +1 -0
- package/dist/_chunk/separator.js +29 -0
- package/dist/_chunk/separator.js.map +1 -0
- package/dist/_chunk/separator.jsx +29 -0
- package/dist/_chunk/separator.jsx.map +1 -0
- package/dist/_chunk/slider.js +256 -0
- package/dist/_chunk/slider.js.map +1 -0
- package/dist/_chunk/slider.jsx +256 -0
- package/dist/_chunk/slider.jsx.map +1 -0
- 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/steplist.js +66 -0
- package/dist/_chunk/steplist.js.map +1 -0
- package/dist/_chunk/steplist.jsx +66 -0
- package/dist/_chunk/steplist.jsx.map +1 -0
- package/dist/_chunk/switch.js +34 -0
- package/dist/_chunk/switch.js.map +1 -0
- package/dist/_chunk/switch.jsx +34 -0
- package/dist/_chunk/switch.jsx.map +1 -0
- package/dist/_chunk/table.js +1088 -0
- package/dist/_chunk/table.js.map +1 -0
- package/dist/_chunk/table.jsx +1088 -0
- package/dist/_chunk/table.jsx.map +1 -0
- package/dist/_chunk/tabs.js +263 -0
- package/dist/_chunk/tabs.js.map +1 -0
- package/dist/_chunk/tabs.jsx +263 -0
- package/dist/_chunk/tabs.jsx.map +1 -0
- package/dist/_chunk/tag.js +322 -0
- package/dist/_chunk/tag.js.map +1 -0
- package/dist/_chunk/tag.jsx +322 -0
- package/dist/_chunk/tag.jsx.map +1 -0
- package/dist/_chunk/textfield.js +110 -0
- package/dist/_chunk/textfield.js.map +1 -0
- package/dist/_chunk/textfield.jsx +110 -0
- package/dist/_chunk/textfield.jsx.map +1 -0
- package/dist/_chunk/toast.js +250 -0
- package/dist/_chunk/toast.js.map +1 -0
- package/dist/_chunk/toast.jsx +250 -0
- package/dist/_chunk/toast.jsx.map +1 -0
- package/dist/_chunk/toolbar.js +226 -0
- package/dist/_chunk/toolbar.js.map +1 -0
- package/dist/_chunk/toolbar.jsx +226 -0
- package/dist/_chunk/toolbar.jsx.map +1 -0
- package/dist/_chunk/tooltip.js +185 -0
- package/dist/_chunk/tooltip.js.map +1 -0
- package/dist/_chunk/tooltip.jsx +185 -0
- package/dist/_chunk/tooltip.jsx.map +1 -0
- package/dist/_chunk/tree.js +452 -0
- package/dist/_chunk/tree.js.map +1 -0
- package/dist/_chunk/tree.jsx +452 -0
- package/dist/_chunk/tree.jsx.map +1 -0
- package/dist/_chunk/utils.js +705 -0
- package/dist/_chunk/utils.js.map +1 -0
- package/dist/_chunk/utils.jsx +705 -0
- package/dist/_chunk/utils.jsx.map +1 -0
- package/dist/_chunk/visually-hidden.js +93 -0
- package/dist/_chunk/visually-hidden.js.map +1 -0
- package/dist/_chunk/visually-hidden.jsx +93 -0
- package/dist/_chunk/visually-hidden.jsx.map +1 -0
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -1
- package/dist/actiongroup/index.js +2 -0
- package/dist/actiongroup/index.jsx +2 -0
- package/dist/autocomplete/createAutocomplete.d.ts +12 -7
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/autocomplete/index.js +2 -0
- package/dist/autocomplete/index.jsx +2 -0
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/breadcrumbs/index.js +2 -0
- package/dist/breadcrumbs/index.jsx +2 -0
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -1
- package/dist/button/index.js +2 -0
- package/dist/button/index.jsx +2 -0
- 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/createCalendarMonthPicker.d.ts +41 -0
- package/dist/calendar/createCalendarMonthPicker.d.ts.map +1 -0
- package/dist/calendar/createCalendarYearPicker.d.ts +49 -0
- package/dist/calendar/createCalendarYearPicker.d.ts.map +1 -0
- package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/calendar/index.d.ts +2 -0
- package/dist/calendar/index.d.ts.map +1 -1
- package/dist/calendar/index.js +2 -0
- package/dist/calendar/index.jsx +2 -0
- package/dist/calendar/intl/index.d.ts +1 -1
- package/dist/calendar/intl/index.d.ts.map +1 -1
- package/dist/calendar/utils.d.ts +4 -0
- package/dist/calendar/utils.d.ts.map +1 -1
- package/dist/checkbox/createCheckbox.d.ts +4 -0
- package/dist/checkbox/createCheckbox.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
- package/dist/checkbox/index.js +2 -0
- package/dist/checkbox/index.jsx +2 -0
- package/dist/collections/index.js +160 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/index.jsx +160 -0
- package/dist/collections/index.jsx.map +1 -0
- 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/index.js +2 -0
- package/dist/color/index.jsx +2 -0
- 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/index.js +2 -0
- package/dist/combobox/index.jsx +2 -0
- 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 -0
- package/dist/datepicker/index.jsx +2 -0
- package/dist/datepicker/intl.d.ts +12 -0
- package/dist/datepicker/intl.d.ts.map +1 -0
- package/dist/dialog/index.js +2 -0
- package/dist/dialog/index.jsx +2 -0
- package/dist/disclosure/index.js +2 -0
- package/dist/disclosure/index.jsx +2 -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 -0
- package/dist/dnd/index.jsx +3 -0
- 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 +7 -2
- 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 -0
- package/dist/focus/index.jsx +3 -0
- package/dist/focus/virtualFocus.d.ts +26 -0
- package/dist/focus/virtualFocus.d.ts.map +1 -0
- package/dist/form/createFormValidation.d.ts.map +1 -1
- package/dist/form/index.js +3 -0
- package/dist/form/index.jsx +3 -0
- package/dist/grid/index.js +2 -0
- package/dist/grid/index.jsx +2 -0
- package/dist/gridlist/createGridList.d.ts +7 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/gridlist/createGridListItem.d.ts +1 -1
- package/dist/gridlist/createGridListItem.d.ts.map +1 -1
- package/dist/gridlist/createGridListSection.d.ts +15 -0
- package/dist/gridlist/createGridListSection.d.ts.map +1 -0
- package/dist/gridlist/index.d.ts +2 -1
- package/dist/gridlist/index.d.ts.map +1 -1
- package/dist/gridlist/index.js +2 -0
- package/dist/gridlist/index.jsx +2 -0
- package/dist/gridlist/types.d.ts +50 -0
- package/dist/gridlist/types.d.ts.map +1 -1
- package/dist/i18n/index.js +5 -0
- package/dist/i18n/index.jsx +5 -0
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -18311
- package/dist/index.jsx +77 -18242
- package/dist/interactions/FocusableProvider.d.ts.map +1 -1
- package/dist/interactions/PressEvent.d.ts +11 -0
- package/dist/interactions/PressEvent.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 +0 -1
- package/dist/interactions/createInteractionModality.d.ts.map +1 -1
- package/dist/interactions/createKeyboard.d.ts.map +1 -1
- package/dist/interactions/createPress.d.ts.map +1 -1
- package/dist/interactions/index.js +9 -0
- package/dist/interactions/index.jsx +9 -0
- package/dist/label/createLabels.d.ts.map +1 -1
- package/dist/label/index.js +4 -0
- package/dist/label/index.jsx +4 -0
- package/dist/landmark/index.js +2 -0
- package/dist/landmark/index.jsx +2 -0
- package/dist/link/index.js +2 -0
- package/dist/link/index.jsx +2 -0
- package/dist/listbox/createListBox.d.ts +37 -0
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts +7 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/listbox/index.js +2 -0
- package/dist/listbox/index.jsx +2 -0
- package/dist/live-announcer/index.js +2 -0
- package/dist/live-announcer/index.jsx +2 -0
- package/dist/menu/createMenu.d.ts +7 -4
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/menu/createMenuItem.d.ts +9 -1
- package/dist/menu/createMenuItem.d.ts.map +1 -1
- package/dist/menu/index.js +2 -0
- package/dist/menu/index.jsx +2 -0
- package/dist/meter/index.js +2 -0
- package/dist/meter/index.jsx +2 -0
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/numberfield/index.js +2 -0
- package/dist/numberfield/index.jsx +2 -0
- package/dist/overlays/index.js +4 -0
- package/dist/overlays/index.jsx +4 -0
- package/dist/popover/calculatePosition.d.ts +2 -0
- package/dist/popover/calculatePosition.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts +8 -0
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/index.js +2 -0
- package/dist/popover/index.jsx +2 -0
- package/dist/progress/index.js +2 -0
- package/dist/progress/index.jsx +2 -0
- package/dist/radio/createRadio.d.ts +2 -0
- package/dist/radio/createRadio.d.ts.map +1 -1
- package/dist/radio/index.js +2 -0
- package/dist/radio/index.jsx +2 -0
- package/dist/searchfield/index.js +2 -0
- package/dist/searchfield/index.jsx +2 -0
- package/dist/select/createSelect.d.ts +2 -0
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/select/index.js +2 -0
- package/dist/select/index.jsx +2 -0
- package/dist/selection/DOMLayoutDelegate.d.ts +58 -0
- package/dist/selection/DOMLayoutDelegate.d.ts.map +1 -0
- package/dist/selection/ListKeyboardDelegate.d.ts +95 -0
- package/dist/selection/ListKeyboardDelegate.d.ts.map +1 -0
- package/dist/selection/constants.d.ts +15 -0
- package/dist/selection/constants.d.ts.map +1 -0
- package/dist/selection/createCollectionRowInteraction.d.ts +13 -0
- package/dist/selection/createCollectionRowInteraction.d.ts.map +1 -0
- package/dist/selection/createScrollIntoViewOnFocus.d.ts +31 -0
- package/dist/selection/createScrollIntoViewOnFocus.d.ts.map +1 -0
- package/dist/selection/createSelectableCollection.d.ts +69 -0
- package/dist/selection/createSelectableCollection.d.ts.map +1 -0
- package/dist/selection/createSelectableItem.d.ts +154 -0
- package/dist/selection/createSelectableItem.d.ts.map +1 -0
- package/dist/selection/createSelectableList.d.ts +43 -0
- package/dist/selection/createSelectableList.d.ts.map +1 -0
- package/dist/selection/createTypeSelect.d.ts.map +1 -1
- package/dist/selection/index.d.ts +9 -0
- package/dist/selection/index.d.ts.map +1 -1
- package/dist/selection/index.js +5 -0
- package/dist/selection/index.jsx +5 -0
- package/dist/selection/selectItem.d.ts +29 -0
- package/dist/selection/selectItem.d.ts.map +1 -0
- package/dist/selection/utils.d.ts +40 -0
- package/dist/selection/utils.d.ts.map +1 -0
- package/dist/separator/index.js +2 -0
- package/dist/separator/index.jsx +2 -0
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/slider/index.js +2 -0
- package/dist/slider/index.jsx +2 -0
- 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/ssr/index.d.ts +17 -0
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +299 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/index.jsx +292 -0
- package/dist/ssr/index.jsx.map +1 -0
- package/dist/steplist/index.js +2 -0
- package/dist/steplist/index.jsx +2 -0
- package/dist/switch/createSwitch.d.ts +4 -0
- package/dist/switch/createSwitch.d.ts.map +1 -1
- package/dist/switch/index.js +2 -0
- package/dist/switch/index.jsx +2 -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 +1 -1
- package/dist/table/createTableRow.d.ts.map +1 -1
- package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
- package/dist/table/createTableSelectionCheckbox.d.ts.map +1 -1
- package/dist/table/index.js +2 -0
- package/dist/table/index.jsx +2 -0
- package/dist/table/types.d.ts +35 -1
- 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 +5 -3
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tabs/index.js +2 -0
- package/dist/tabs/index.jsx +2 -0
- package/dist/tag/createTag.d.ts +2 -0
- 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/tag/index.js +2 -0
- package/dist/tag/index.jsx +2 -0
- package/dist/textfield/index.js +2 -0
- package/dist/textfield/index.jsx +2 -0
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/index.js +2 -0
- package/dist/toast/index.jsx +2 -0
- package/dist/toggle/createToggle.d.ts +4 -0
- package/dist/toggle/createToggle.d.ts.map +1 -1
- package/dist/toggle/index.js +3 -0
- package/dist/toggle/index.jsx +3 -0
- package/dist/toolbar/createToolbar.d.ts +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/toolbar/index.js +2 -0
- package/dist/toolbar/index.jsx +2 -0
- package/dist/tooltip/index.js +2 -0
- package/dist/tooltip/index.jsx +2 -0
- package/dist/tree/createTree.d.ts +5 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts +1 -1
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
- package/dist/tree/index.js +2 -0
- package/dist/tree/index.jsx +2 -0
- package/dist/tree/types.d.ts +10 -0
- package/dist/tree/types.d.ts.map +1 -1
- package/dist/utils/animation.d.ts +60 -0
- package/dist/utils/animation.d.ts.map +1 -0
- package/dist/utils/dom.d.ts +49 -2
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.jsx +6 -0
- package/dist/utils/keyboard.d.ts +17 -0
- package/dist/utils/keyboard.d.ts.map +1 -0
- package/dist/utils/mergeProps.d.ts.map +1 -1
- package/dist/utils/scrollIntoView.d.ts +30 -0
- package/dist/utils/scrollIntoView.d.ts.map +1 -0
- package/dist/visually-hidden/index.js +2 -0
- package/dist/visually-hidden/index.jsx +2 -0
- package/package.json +304 -3
- package/src/actiongroup/createActionGroup.ts +26 -109
- package/src/autocomplete/createAutocomplete.ts +202 -35
- package/src/breadcrumbs/createBreadcrumbs.ts +12 -4
- package/src/button/createToggleButtonGroup.ts +19 -14
- package/src/calendar/createCalendar.ts +5 -4
- package/src/calendar/createCalendarCell.ts +36 -5
- package/src/calendar/createCalendarGrid.ts +47 -12
- package/src/calendar/createCalendarMonthPicker.ts +105 -0
- package/src/calendar/createCalendarYearPicker.ts +144 -0
- package/src/calendar/createRangeCalendar.ts +27 -15
- package/src/calendar/createRangeCalendarCell.ts +17 -3
- package/src/calendar/index.ts +17 -0
- package/src/calendar/intl/index.ts +8 -0
- package/src/calendar/utils.ts +4 -0
- package/src/checkbox/createCheckbox.ts +10 -0
- package/src/checkbox/createCheckboxGroupItem.ts +12 -16
- 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 -384
- 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 +488 -371
- 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 +63 -3
- package/src/focus/FocusScope.tsx +266 -24
- package/src/focus/index.ts +8 -0
- package/src/focus/virtualFocus.ts +55 -0
- package/src/form/createFormValidation.ts +8 -1
- package/src/gridlist/createGridList.ts +187 -48
- package/src/gridlist/createGridListItem.ts +87 -155
- package/src/gridlist/createGridListSection.ts +54 -0
- package/src/gridlist/index.ts +3 -0
- package/src/gridlist/types.ts +47 -0
- package/src/index.ts +51 -3
- package/src/interactions/FocusableProvider.tsx +11 -6
- package/src/interactions/PressEvent.ts +14 -0
- package/src/interactions/createFocus.ts +26 -21
- package/src/interactions/createFocusWithin.ts +23 -24
- package/src/interactions/createInteractionModality.ts +26 -15
- package/src/interactions/createKeyboard.ts +10 -0
- package/src/interactions/createPress.ts +29 -6
- package/src/label/createLabels.ts +7 -4
- package/src/listbox/createListBox.ts +203 -10
- package/src/listbox/createOption.ts +84 -74
- package/src/menu/createMenu.ts +93 -16
- package/src/menu/createMenuItem.ts +253 -41
- package/src/numberfield/createNumberField.ts +82 -14
- package/src/popover/calculatePosition.ts +19 -7
- package/src/popover/createOverlayPosition.ts +9 -0
- package/src/radio/createRadio.ts +19 -2
- package/src/select/createSelect.ts +41 -4
- package/src/selection/DOMLayoutDelegate.ts +102 -0
- package/src/selection/ListKeyboardDelegate.ts +398 -0
- package/src/selection/constants.ts +16 -0
- package/src/selection/createCollectionRowInteraction.ts +209 -0
- package/src/selection/createScrollIntoViewOnFocus.ts +65 -0
- package/src/selection/createSelectableCollection.ts +645 -0
- package/src/selection/createSelectableItem.ts +512 -0
- package/src/selection/createSelectableList.ts +93 -0
- package/src/selection/createTypeSelect.ts +112 -51
- package/src/selection/index.ts +31 -0
- package/src/selection/selectItem.ts +80 -0
- package/src/selection/utils.ts +82 -0
- package/src/slider/createSlider.ts +48 -1
- package/src/spinbutton/createSpinButton.ts +163 -0
- package/src/spinbutton/index.ts +10 -0
- package/src/spinbutton/intl.ts +115 -0
- package/src/ssr/index.tsx +31 -0
- package/src/switch/createSwitch.ts +10 -0
- package/src/table/createTable.ts +82 -27
- package/src/table/createTableColumnHeader.ts +10 -0
- package/src/table/createTableRow.ts +208 -203
- package/src/table/createTableSelectAllCheckbox.ts +3 -4
- package/src/table/createTableSelectionCheckbox.ts +24 -1
- package/src/table/types.ts +37 -1
- package/src/table/utils.ts +41 -0
- package/src/tabs/createTabs.ts +95 -24
- package/src/tag/createTag.ts +30 -36
- package/src/tag/createTagGroup.ts +92 -0
- package/src/toast/createToast.ts +1 -0
- package/src/toggle/createToggle.ts +20 -0
- package/src/toolbar/createToolbar.ts +43 -94
- package/src/tree/createTree.ts +165 -52
- package/src/tree/createTreeItem.ts +105 -120
- package/src/tree/createTreeSelectionCheckbox.ts +14 -1
- package/src/tree/types.ts +10 -0
- package/src/utils/animation.ts +243 -0
- package/src/utils/dom.ts +216 -25
- package/src/utils/index.ts +10 -0
- package/src/utils/keyboard.ts +25 -0
- package/src/utils/mergeProps.ts +8 -1
- package/src/utils/scrollIntoView.ts +181 -0
- package/dist/datepicker/createTimeSegment.d.ts +0 -29
- package/dist/datepicker/createTimeSegment.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.jsx.map +0 -1
- package/src/datepicker/createTimeSegment.ts +0 -352
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.jsx","names":[],"sources":["../../src/toast/createToast.ts","../../src/toast/createToastRegion.ts"],"sourcesContent":["/**\n * createToast hook for Solidaria\n *\n * Provides the accessibility implementation for a Toast component.\n *\n * Port of @react-aria/toast useToast.\n */\n\nimport { type JSX, createMemo } from \"solid-js\";\nimport { type QueuedToast, type ToastState } from \"@proyecto-viviana/solid-stately\";\nimport { createId } from \"../ssr\";\n\nexport interface AriaToastProps<T> {\n /** The toast to display. */\n toast: QueuedToast<T>;\n /** The toast state from createToastState. */\n state: ToastState<T>;\n /** Whether the rendered toast includes a title element. */\n hasTitle?: boolean;\n /** Whether the rendered toast includes a description element. */\n hasDescription?: boolean;\n}\n\nexport interface ToastAria {\n /** Props for the toast container element. */\n toastProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the toast content element (contains the message). */\n contentProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the toast title element. */\n titleProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the toast description element. */\n descriptionProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props for the close button. */\n closeButtonProps: JSX.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * Provides the accessibility implementation for a Toast component.\n *\n * The toast uses role=\"alertdialog\" to announce content to screen readers.\n * The content area uses role=\"alert\" for the actual message.\n *\n * @example\n * ```tsx\n * import { createToast } from 'solidaria';\n *\n * function Toast(props) {\n * const {\n * toastProps,\n * contentProps,\n * titleProps,\n * closeButtonProps\n * } = createToast({ toast: props.toast, state: props.state });\n *\n * return (\n * <div {...toastProps}>\n * <div {...contentProps}>\n * <div {...titleProps}>{props.toast.content.title}</div>\n * </div>\n * <button {...closeButtonProps}>×</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function createToast<T>(props: AriaToastProps<T>): ToastAria {\n const titleId = createId();\n const descriptionId = createId();\n const hasTitle = props.hasTitle ?? true;\n const hasDescription = props.hasDescription ?? true;\n\n const close = () => {\n props.state.close(props.toast.key);\n };\n\n // Toast container - role=\"alertdialog\" for screen readers\n const toastProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({\n role: \"alertdialog\",\n \"aria-modal\": \"false\",\n \"aria-labelledby\": hasTitle ? titleId : undefined,\n \"aria-describedby\": hasDescription ? descriptionId : undefined,\n tabIndex: 0,\n \"data-animation\": props.toast.animation,\n \"data-key\": props.toast.key,\n }));\n\n // Content area with role=\"alert\" for immediate announcement\n const contentProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({\n role: \"alert\",\n \"aria-atomic\": \"true\",\n \"aria-live\": \"assertive\",\n }));\n\n // Title props\n const titleProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({\n id: titleId,\n }));\n\n // Description props\n const descriptionProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({\n id: descriptionId,\n }));\n\n // Close button\n const closeButtonProps = createMemo<JSX.ButtonHTMLAttributes<HTMLButtonElement>>(() => ({\n \"aria-label\": \"Close\",\n onClick: close,\n }));\n\n return {\n get toastProps() {\n return toastProps();\n },\n get contentProps() {\n return contentProps();\n },\n get titleProps() {\n return titleProps();\n },\n get descriptionProps() {\n return descriptionProps();\n },\n get closeButtonProps() {\n return closeButtonProps();\n },\n };\n}\n","/**\n * createToastRegion hook for Solidaria\n *\n * Provides the accessibility implementation for a ToastRegion component.\n * The region is a landmark that contains all visible toasts.\n *\n * Port of @react-aria/toast useToastRegion.\n */\n\nimport { type Accessor, type JSX, createEffect, createMemo, onCleanup } from \"solid-js\";\nimport { type ToastState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { getInteractionModality } from \"../interactions/createInteractionModality\";\nimport { createLandmark } from \"../landmark/createLandmark\";\nimport { focusWithoutScrolling } from \"../utils/focus\";\n\nexport interface AriaToastRegionProps<T> {\n /** The toast state from createToastState. */\n state: ToastState<T>;\n /** The toast region element. Required for landmark navigation and focus recovery. */\n ref?: Accessor<HTMLElement | undefined>;\n /** An accessible label for the region. */\n \"aria-label\"?: string;\n}\n\nexport interface ToastRegionAria {\n /** Props for the toast region container element. */\n regionProps: JSX.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * Provides the accessibility implementation for a ToastRegion component.\n *\n * The region is a landmark (role=\"region\") that contains all visible toasts.\n * It pauses toast timers on hover or focus to give users time to read/interact.\n *\n * @example\n * ```tsx\n * import { createToastRegion } from 'solidaria';\n * import { For, Show } from 'solid-js';\n *\n * function ToastRegion(props) {\n * let ref;\n * const { regionProps } = createToastRegion({ state: props.state });\n *\n * return (\n * <Show when={props.state.visibleToasts().length > 0}>\n * <div {...regionProps} ref={ref}>\n * <For each={props.state.visibleToasts()}>\n * {(toast) => <Toast toast={toast} state={props.state} />}\n * </For>\n * </div>\n * </Show>\n * );\n * }\n * ```\n */\nexport function createToastRegion<T>(props: AriaToastRegionProps<T>): ToastRegionAria {\n const visibleToasts = () =>\n typeof props.state.visibleToasts === \"function\" ? props.state.visibleToasts() : [];\n const regionRef = () => props.ref?.();\n const activeRegionRef = () => (visibleToasts().length > 0 ? regionRef() : undefined);\n\n const { landmarkProps } = createLandmark(\n () => ({\n role: \"region\",\n \"aria-label\": props[\"aria-label\"] ?? \"Notifications\",\n }),\n activeRegionRef,\n );\n\n let isHovered = false;\n let isFocused = false;\n let toastElements: HTMLElement[] = [];\n let previousVisibleToasts = visibleToasts();\n let focusedToastIndex = -1;\n let lastFocused: HTMLElement | null = null;\n\n const updateTimers = () => {\n if (isHovered || isFocused) {\n props.state.pauseAll();\n } else {\n props.state.resumeAll();\n }\n };\n\n const { hoverProps } = createHover({\n onHoverStart: () => {\n isHovered = true;\n updateTimers();\n },\n onHoverEnd: () => {\n isHovered = false;\n updateTimers();\n },\n });\n\n const getToastElements = () => {\n const element = regionRef();\n return element ? [...element.querySelectorAll<HTMLElement>('[role=\"alertdialog\"]')] : [];\n };\n\n const restoreLastFocused = () => {\n if (!lastFocused?.isConnected) {\n lastFocused = null;\n return;\n }\n\n if (getInteractionModality() === \"pointer\") {\n focusWithoutScrolling(lastFocused);\n } else {\n lastFocused.focus();\n }\n\n lastFocused = null;\n };\n\n const handleFocusIn = (e: FocusEvent) => {\n const currentTarget = e.currentTarget as HTMLElement;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n\n if (!isFocused) {\n isFocused = true;\n if (relatedTarget && !currentTarget.contains(relatedTarget)) {\n lastFocused = relatedTarget;\n }\n updateTimers();\n }\n\n toastElements = getToastElements();\n const target =\n e.target instanceof Element ? e.target.closest<HTMLElement>('[role=\"alertdialog\"]') : null;\n focusedToastIndex = target ? toastElements.findIndex((toast) => toast === target) : -1;\n };\n\n const handleFocusOut = (e: FocusEvent) => {\n const target = e.relatedTarget as HTMLElement | null;\n const currentTarget = e.currentTarget as HTMLElement;\n if (!target || !currentTarget.contains(target)) {\n isFocused = false;\n focusedToastIndex = -1;\n updateTimers();\n }\n };\n\n createEffect(() => {\n const currentVisibleToasts = visibleToasts();\n const element = regionRef();\n\n if (focusedToastIndex === -1 || currentVisibleToasts.length === 0 || !element) {\n toastElements = [];\n previousVisibleToasts = currentVisibleToasts;\n return;\n }\n\n toastElements = getToastElements();\n\n const unchanged =\n previousVisibleToasts.length === currentVisibleToasts.length &&\n currentVisibleToasts.every((toast, index) => toast.key === previousVisibleToasts[index]?.key);\n\n if (unchanged) {\n previousVisibleToasts = currentVisibleToasts;\n return;\n }\n\n const allToasts = previousVisibleToasts.map((toast, index) => ({\n index,\n isRemoved: !currentVisibleToasts.some((currentToast) => currentToast.key === toast.key),\n }));\n const removedFocusedToastIndex = allToasts.findIndex(\n (toast) => toast.index === focusedToastIndex && toast.isRemoved,\n );\n\n if (removedFocusedToastIndex > -1) {\n if (getInteractionModality() === \"pointer\" && lastFocused?.isConnected) {\n focusWithoutScrolling(lastFocused);\n } else {\n let index = 0;\n let nextToast: number | undefined;\n let previousToast: number | undefined;\n\n while (index <= removedFocusedToastIndex) {\n if (!allToasts[index]?.isRemoved) {\n previousToast = Math.max(0, index - 1);\n }\n index++;\n }\n\n while (index < allToasts.length) {\n if (!allToasts[index]?.isRemoved) {\n nextToast = index - 1;\n break;\n }\n index++;\n }\n\n if (previousToast === undefined && nextToast === undefined) {\n previousToast = 0;\n }\n\n if (\n previousToast !== undefined &&\n previousToast >= 0 &&\n previousToast < toastElements.length\n ) {\n focusWithoutScrolling(toastElements[previousToast]);\n } else if (nextToast !== undefined && nextToast >= 0 && nextToast < toastElements.length) {\n focusWithoutScrolling(toastElements[nextToast]);\n }\n }\n }\n\n previousVisibleToasts = currentVisibleToasts;\n });\n\n createEffect(() => {\n if (visibleToasts().length === 0) {\n restoreLastFocused();\n }\n });\n\n onCleanup(() => {\n restoreLastFocused();\n });\n\n // Region props\n const regionProps = createMemo<JSX.HTMLAttributes<HTMLElement>>(() => ({\n ...landmarkProps,\n ...hoverProps,\n tabIndex: -1,\n \"data-solidaria-top-layer\": \"true\",\n onFocusIn: handleFocusIn,\n onFocusOut: handleFocusOut,\n }));\n\n return {\n get regionProps() {\n return regionProps();\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { t as access } from "./reactivity.js";
|
|
2
|
+
import { g as isTabbable, p as isFocusable, s as getOwnerDocument, t as focusSafely } from "./focus.js";
|
|
3
|
+
import { i as useLocale } from "./locale.js";
|
|
4
|
+
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
5
|
+
//#region src/toolbar/createToolbar.ts
|
|
6
|
+
/**
|
|
7
|
+
* createToolbar - Accessibility hook for toolbar elements
|
|
8
|
+
*
|
|
9
|
+
* Provides keyboard navigation between toolbar items using arrow keys.
|
|
10
|
+
* Based on @react-aria/toolbar useToolbar.
|
|
11
|
+
*/
|
|
12
|
+
function getFocusableElements(root, tabbable = false) {
|
|
13
|
+
const elements = [];
|
|
14
|
+
const filter = tabbable ? isTabbable : isFocusable;
|
|
15
|
+
if (filter(root)) elements.push(root);
|
|
16
|
+
const descendants = root.querySelectorAll("*");
|
|
17
|
+
for (let i = 0; i < descendants.length; i++) {
|
|
18
|
+
const el = descendants[i];
|
|
19
|
+
if (filter(el)) elements.push(el);
|
|
20
|
+
}
|
|
21
|
+
return elements;
|
|
22
|
+
}
|
|
23
|
+
function getActiveElement(doc) {
|
|
24
|
+
let activeElement = doc.activeElement;
|
|
25
|
+
while (activeElement?.shadowRoot?.activeElement) activeElement = activeElement.shadowRoot.activeElement;
|
|
26
|
+
return activeElement;
|
|
27
|
+
}
|
|
28
|
+
function createFocusManager(ref) {
|
|
29
|
+
return {
|
|
30
|
+
focusNext(opts = {}) {
|
|
31
|
+
const root = ref();
|
|
32
|
+
if (!root) return null;
|
|
33
|
+
const { from, tabbable = true, wrap = false, accept } = opts;
|
|
34
|
+
const doc = getOwnerDocument(root);
|
|
35
|
+
const current = from || getActiveElement(doc);
|
|
36
|
+
let elements = getFocusableElements(root, tabbable);
|
|
37
|
+
if (accept) elements = elements.filter(accept);
|
|
38
|
+
if (!current || elements.length === 0) return null;
|
|
39
|
+
let nextIndex = elements.indexOf(current) + 1;
|
|
40
|
+
if (nextIndex >= elements.length) if (wrap) nextIndex = 0;
|
|
41
|
+
else return null;
|
|
42
|
+
const nextElement = elements[nextIndex];
|
|
43
|
+
if (nextElement) {
|
|
44
|
+
focusSafely(nextElement);
|
|
45
|
+
return nextElement;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
focusPrevious(opts = {}) {
|
|
50
|
+
const root = ref();
|
|
51
|
+
if (!root) return null;
|
|
52
|
+
const { from, tabbable = true, wrap = false, accept } = opts;
|
|
53
|
+
const doc = getOwnerDocument(root);
|
|
54
|
+
const current = from || getActiveElement(doc);
|
|
55
|
+
let elements = getFocusableElements(root, tabbable);
|
|
56
|
+
if (accept) elements = elements.filter(accept);
|
|
57
|
+
if (!current || elements.length === 0) return null;
|
|
58
|
+
let prevIndex = elements.indexOf(current) - 1;
|
|
59
|
+
if (prevIndex < 0) if (wrap) prevIndex = elements.length - 1;
|
|
60
|
+
else return null;
|
|
61
|
+
const prevElement = elements[prevIndex];
|
|
62
|
+
if (prevElement) {
|
|
63
|
+
focusSafely(prevElement);
|
|
64
|
+
return prevElement;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
},
|
|
68
|
+
focusFirst(opts = {}) {
|
|
69
|
+
const root = ref();
|
|
70
|
+
if (!root) return null;
|
|
71
|
+
const { tabbable = true, accept } = opts;
|
|
72
|
+
let elements = getFocusableElements(root, tabbable);
|
|
73
|
+
if (accept) elements = elements.filter(accept);
|
|
74
|
+
if (elements.length > 0) {
|
|
75
|
+
focusSafely(elements[0]);
|
|
76
|
+
return elements[0];
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
},
|
|
80
|
+
focusLast(opts = {}) {
|
|
81
|
+
const root = ref();
|
|
82
|
+
if (!root) return null;
|
|
83
|
+
const { tabbable = true, accept } = opts;
|
|
84
|
+
let elements = getFocusableElements(root, tabbable);
|
|
85
|
+
if (accept) elements = elements.filter(accept);
|
|
86
|
+
if (elements.length > 0) {
|
|
87
|
+
const lastElement = elements[elements.length - 1];
|
|
88
|
+
focusSafely(lastElement);
|
|
89
|
+
return lastElement;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Provides the behavior and accessibility implementation for a toolbar.
|
|
97
|
+
* A toolbar is a container for a set of interactive controls with arrow key navigation.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* let ref;
|
|
102
|
+
* const { toolbarProps } = createToolbar({ orientation: 'horizontal' });
|
|
103
|
+
* return (
|
|
104
|
+
* <div {...toolbarProps}>
|
|
105
|
+
* <Button>Cut</Button>
|
|
106
|
+
* <Button>Copy</Button>
|
|
107
|
+
* <Button>Paste</Button>
|
|
108
|
+
* </div>
|
|
109
|
+
* );
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
function createToolbar(props = {}) {
|
|
113
|
+
let toolbarRef;
|
|
114
|
+
const [isInToolbar, setIsInToolbar] = createSignal(false);
|
|
115
|
+
let lastFocusedElement = null;
|
|
116
|
+
const locale = useLocale();
|
|
117
|
+
const orientation = () => access(props.orientation) ?? "horizontal";
|
|
118
|
+
const ariaLabel = () => access(props["aria-label"]);
|
|
119
|
+
const ariaLabelledby = () => access(props["aria-labelledby"]);
|
|
120
|
+
const focusManager = createFocusManager(() => toolbarRef);
|
|
121
|
+
onMount(() => {
|
|
122
|
+
if (toolbarRef) {
|
|
123
|
+
const parentToolbar = toolbarRef.parentElement?.closest("[role=\"toolbar\"]");
|
|
124
|
+
setIsInToolbar(!!parentToolbar);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const onKeyDown = (e) => {
|
|
128
|
+
const root = toolbarRef;
|
|
129
|
+
if (!root) return;
|
|
130
|
+
if (isInToolbar()) return;
|
|
131
|
+
const target = e.target;
|
|
132
|
+
if (!(target instanceof Element) || !root.contains(target)) return;
|
|
133
|
+
const doc = getOwnerDocument(root);
|
|
134
|
+
const isRTL = locale().direction === "rtl";
|
|
135
|
+
const isHorizontal = orientation() === "horizontal";
|
|
136
|
+
let handled = false;
|
|
137
|
+
switch (e.key) {
|
|
138
|
+
case "ArrowRight":
|
|
139
|
+
if (isHorizontal) {
|
|
140
|
+
if (isRTL) focusManager.focusPrevious({ tabbable: true });
|
|
141
|
+
else focusManager.focusNext({ tabbable: true });
|
|
142
|
+
handled = true;
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
case "ArrowLeft":
|
|
146
|
+
if (isHorizontal) {
|
|
147
|
+
if (isRTL) focusManager.focusNext({ tabbable: true });
|
|
148
|
+
else focusManager.focusPrevious({ tabbable: true });
|
|
149
|
+
handled = true;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case "ArrowDown":
|
|
153
|
+
if (!isHorizontal) {
|
|
154
|
+
focusManager.focusNext({ tabbable: true });
|
|
155
|
+
handled = true;
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
case "ArrowUp":
|
|
159
|
+
if (!isHorizontal) {
|
|
160
|
+
focusManager.focusPrevious({ tabbable: true });
|
|
161
|
+
handled = true;
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
case "Tab":
|
|
165
|
+
lastFocusedElement = getActiveElement(doc);
|
|
166
|
+
if (e.shiftKey) focusManager.focusFirst({ tabbable: true });
|
|
167
|
+
else focusManager.focusLast({ tabbable: true });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (handled) {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
e.stopPropagation();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const onBlur = (e) => {
|
|
176
|
+
const root = toolbarRef;
|
|
177
|
+
if (!root) return;
|
|
178
|
+
if (isInToolbar()) return;
|
|
179
|
+
const relatedTarget = e.relatedTarget;
|
|
180
|
+
if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) lastFocusedElement = e.target;
|
|
181
|
+
};
|
|
182
|
+
const onFocus = (e) => {
|
|
183
|
+
const root = toolbarRef;
|
|
184
|
+
if (!root) return;
|
|
185
|
+
if (isInToolbar()) return;
|
|
186
|
+
const relatedTarget = e.relatedTarget;
|
|
187
|
+
const target = e.target;
|
|
188
|
+
if (lastFocusedElement && !(relatedTarget && root.contains(relatedTarget)) && target instanceof Node && root.contains(target)) {
|
|
189
|
+
focusSafely(lastFocusedElement);
|
|
190
|
+
lastFocusedElement = null;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const setRef = (el) => {
|
|
194
|
+
toolbarRef = el;
|
|
195
|
+
el.addEventListener("keydown", onKeyDown, true);
|
|
196
|
+
el.addEventListener("focus", onFocus, true);
|
|
197
|
+
el.addEventListener("blur", onBlur, true);
|
|
198
|
+
onCleanup(() => {
|
|
199
|
+
el.removeEventListener("keydown", onKeyDown, true);
|
|
200
|
+
el.removeEventListener("focus", onFocus, true);
|
|
201
|
+
el.removeEventListener("blur", onBlur, true);
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
return {
|
|
205
|
+
toolbarProps: {
|
|
206
|
+
get role() {
|
|
207
|
+
return isInToolbar() ? "group" : "toolbar";
|
|
208
|
+
},
|
|
209
|
+
get "aria-orientation"() {
|
|
210
|
+
return orientation();
|
|
211
|
+
},
|
|
212
|
+
get "aria-label"() {
|
|
213
|
+
return ariaLabel();
|
|
214
|
+
},
|
|
215
|
+
get "aria-labelledby"() {
|
|
216
|
+
return ariaLabel() == null ? ariaLabelledby() : void 0;
|
|
217
|
+
},
|
|
218
|
+
ref: setRef
|
|
219
|
+
},
|
|
220
|
+
orientation
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
export { createToolbar as t };
|
|
225
|
+
|
|
226
|
+
//# sourceMappingURL=toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.js","names":[],"sources":["../../src/toolbar/createToolbar.ts"],"sourcesContent":["/**\n * createToolbar - Accessibility hook for toolbar elements\n *\n * Provides keyboard navigation between toolbar items using arrow keys.\n * Based on @react-aria/toolbar useToolbar.\n */\n\nimport { createSignal, onMount, onCleanup, type Accessor } from \"solid-js\";\nimport { type MaybeAccessor, access } from \"../utils\";\nimport { useLocale } from \"../i18n\";\nimport { getOwnerDocument, isFocusable, isTabbable } from \"../utils\";\nimport { focusSafely } from \"../utils/focus\";\n\nexport type Orientation = \"horizontal\" | \"vertical\";\n\nexport interface AriaToolbarProps {\n /** The orientation of the toolbar. @default 'horizontal' */\n orientation?: MaybeAccessor<Orientation>;\n /** An accessibility label for the toolbar. */\n \"aria-label\"?: MaybeAccessor<string>;\n /** Identifies the element (or elements) that labels the toolbar. */\n \"aria-labelledby\"?: MaybeAccessor<string>;\n}\n\nexport interface ToolbarAria {\n /** Props for the toolbar container element. */\n toolbarProps: {\n role: \"toolbar\" | \"group\";\n \"aria-orientation\"?: Orientation;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n tabIndex?: number;\n ref: (el: HTMLElement) => void;\n };\n /** The orientation of the toolbar. */\n orientation: Accessor<Orientation>;\n}\n\ninterface FocusManagerOptions {\n from?: Element;\n tabbable?: boolean;\n wrap?: boolean;\n accept?: (node: Element) => boolean;\n}\n\ninterface FocusManager {\n focusNext(opts?: FocusManagerOptions): HTMLElement | null;\n focusPrevious(opts?: FocusManagerOptions): HTMLElement | null;\n focusFirst(opts?: FocusManagerOptions): HTMLElement | null;\n focusLast(opts?: FocusManagerOptions): HTMLElement | null;\n}\n\nfunction getFocusableElements(root: Element, tabbable = false): HTMLElement[] {\n const elements: HTMLElement[] = [];\n const filter = tabbable ? isTabbable : isFocusable;\n\n // Check the root element itself\n if (filter(root)) {\n elements.push(root as HTMLElement);\n }\n\n // Check all descendants\n const descendants = root.querySelectorAll(\"*\");\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i];\n if (filter(el)) {\n elements.push(el as HTMLElement);\n }\n }\n\n return elements;\n}\n\nfunction getActiveElement(doc: Document): Element | null {\n let activeElement = doc.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\n\nfunction createFocusManager(ref: Accessor<HTMLElement | undefined>): FocusManager {\n return {\n focusNext(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let nextIndex = currentIndex + 1;\n\n if (nextIndex >= elements.length) {\n if (wrap) {\n nextIndex = 0;\n } else {\n return null;\n }\n }\n\n const nextElement = elements[nextIndex];\n if (nextElement) {\n focusSafely(nextElement);\n return nextElement;\n }\n\n return null;\n },\n\n focusPrevious(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let prevIndex = currentIndex - 1;\n\n if (prevIndex < 0) {\n if (wrap) {\n prevIndex = elements.length - 1;\n } else {\n return null;\n }\n }\n\n const prevElement = elements[prevIndex];\n if (prevElement) {\n focusSafely(prevElement);\n return prevElement;\n }\n\n return null;\n },\n\n focusFirst(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n focusSafely(elements[0]);\n return elements[0];\n }\n\n return null;\n },\n\n focusLast(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n const lastElement = elements[elements.length - 1];\n focusSafely(lastElement);\n return lastElement;\n }\n\n return null;\n },\n };\n}\n\n/**\n * Provides the behavior and accessibility implementation for a toolbar.\n * A toolbar is a container for a set of interactive controls with arrow key navigation.\n *\n * @example\n * ```tsx\n * let ref;\n * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });\n * return (\n * <div {...toolbarProps}>\n * <Button>Cut</Button>\n * <Button>Copy</Button>\n * <Button>Paste</Button>\n * </div>\n * );\n * ```\n */\nexport function createToolbar(props: AriaToolbarProps = {}): ToolbarAria {\n let toolbarRef: HTMLElement | undefined;\n const [isInToolbar, setIsInToolbar] = createSignal(false);\n let lastFocusedElement: Element | null = null;\n\n const locale = useLocale();\n const orientation = () => access(props.orientation) ?? \"horizontal\";\n const ariaLabel = () => access(props[\"aria-label\"]);\n const ariaLabelledby = () => access(props[\"aria-labelledby\"]);\n\n const focusManager = createFocusManager(() => toolbarRef);\n\n // Check if this toolbar is nested inside another toolbar\n onMount(() => {\n if (toolbarRef) {\n const parentToolbar = toolbarRef.parentElement?.closest('[role=\"toolbar\"]');\n setIsInToolbar(!!parentToolbar);\n }\n });\n\n // Keyboard event handler\n const onKeyDown = (e: KeyboardEvent) => {\n const root = toolbarRef;\n if (!root) return;\n\n // Don't handle if nested toolbar (parent handles navigation)\n if (isInToolbar()) return;\n\n const target = e.target;\n if (!(target instanceof Element) || !root.contains(target)) {\n return;\n }\n\n const doc = getOwnerDocument(root);\n\n const dir = locale().direction;\n const isRTL = dir === \"rtl\";\n const isHorizontal = orientation() === \"horizontal\";\n\n let handled = false;\n\n switch (e.key) {\n case \"ArrowRight\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusPrevious({ tabbable: true });\n } else {\n focusManager.focusNext({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowLeft\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusNext({ tabbable: true });\n } else {\n focusManager.focusPrevious({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowDown\":\n if (!isHorizontal) {\n focusManager.focusNext({ tabbable: true });\n handled = true;\n }\n break;\n case \"ArrowUp\":\n if (!isHorizontal) {\n focusManager.focusPrevious({ tabbable: true });\n handled = true;\n }\n break;\n case \"Tab\":\n // Move focus to the first/last child so the browser's own Tab handling\n // then carries focus OUT of the whole toolbar. Faithful to upstream\n // useToolbar: there is no roving tabindex — every item stays tabbable,\n // so a bare Tab would otherwise step to the next item instead of leaving.\n lastFocusedElement = getActiveElement(doc);\n if (e.shiftKey) {\n focusManager.focusFirst({ tabbable: true });\n } else {\n focusManager.focusLast({ tabbable: true });\n }\n return;\n }\n\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // Record the last focused child when focus moves out of the toolbar.\n const onBlur = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) {\n lastFocusedElement = e.target as Element;\n }\n };\n\n // Restore focus to the last focused child when focus returns into the toolbar.\n // If that element was removed, focus() is a no-op and the browser lands on the\n // first/last child per direction — matching upstream useToolbar.\n const onFocus = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n const target = e.target;\n if (\n lastFocusedElement &&\n !(relatedTarget && root.contains(relatedTarget)) &&\n target instanceof Node &&\n root.contains(target)\n ) {\n focusSafely(lastFocusedElement as HTMLElement);\n lastFocusedElement = null;\n }\n };\n\n // Set up capture event listeners\n const setRef = (el: HTMLElement) => {\n toolbarRef = el;\n\n // Use capture phase so container handlers run before the focused child's.\n el.addEventListener(\"keydown\", onKeyDown, true);\n el.addEventListener(\"focus\", onFocus, true);\n el.addEventListener(\"blur\", onBlur, true);\n\n onCleanup(() => {\n el.removeEventListener(\"keydown\", onKeyDown, true);\n el.removeEventListener(\"focus\", onFocus, true);\n el.removeEventListener(\"blur\", onBlur, true);\n });\n };\n\n return {\n toolbarProps: {\n get role() {\n return isInToolbar() ? \"group\" : \"toolbar\";\n },\n get \"aria-orientation\"() {\n // Upstream useToolbar emits aria-orientation unconditionally, on the\n // nested role=\"group\" too — not only on the root role=\"toolbar\".\n return orientation();\n },\n get \"aria-label\"() {\n return ariaLabel();\n },\n get \"aria-labelledby\"() {\n // Mirror useToolbar: `aria-label == null ? aria-labelledby : undefined`.\n // An explicit empty-string aria-label still suppresses labelledby.\n return ariaLabel() == null ? ariaLabelledby() : undefined;\n },\n ref: setRef,\n },\n orientation,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { t as access } from "./reactivity.jsx";
|
|
2
|
+
import { g as isTabbable, p as isFocusable, s as getOwnerDocument, t as focusSafely } from "./focus.jsx";
|
|
3
|
+
import { i as useLocale } from "./locale.jsx";
|
|
4
|
+
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
5
|
+
//#region src/toolbar/createToolbar.ts
|
|
6
|
+
/**
|
|
7
|
+
* createToolbar - Accessibility hook for toolbar elements
|
|
8
|
+
*
|
|
9
|
+
* Provides keyboard navigation between toolbar items using arrow keys.
|
|
10
|
+
* Based on @react-aria/toolbar useToolbar.
|
|
11
|
+
*/
|
|
12
|
+
function getFocusableElements(root, tabbable = false) {
|
|
13
|
+
const elements = [];
|
|
14
|
+
const filter = tabbable ? isTabbable : isFocusable;
|
|
15
|
+
if (filter(root)) elements.push(root);
|
|
16
|
+
const descendants = root.querySelectorAll("*");
|
|
17
|
+
for (let i = 0; i < descendants.length; i++) {
|
|
18
|
+
const el = descendants[i];
|
|
19
|
+
if (filter(el)) elements.push(el);
|
|
20
|
+
}
|
|
21
|
+
return elements;
|
|
22
|
+
}
|
|
23
|
+
function getActiveElement(doc) {
|
|
24
|
+
let activeElement = doc.activeElement;
|
|
25
|
+
while (activeElement?.shadowRoot?.activeElement) activeElement = activeElement.shadowRoot.activeElement;
|
|
26
|
+
return activeElement;
|
|
27
|
+
}
|
|
28
|
+
function createFocusManager(ref) {
|
|
29
|
+
return {
|
|
30
|
+
focusNext(opts = {}) {
|
|
31
|
+
const root = ref();
|
|
32
|
+
if (!root) return null;
|
|
33
|
+
const { from, tabbable = true, wrap = false, accept } = opts;
|
|
34
|
+
const doc = getOwnerDocument(root);
|
|
35
|
+
const current = from || getActiveElement(doc);
|
|
36
|
+
let elements = getFocusableElements(root, tabbable);
|
|
37
|
+
if (accept) elements = elements.filter(accept);
|
|
38
|
+
if (!current || elements.length === 0) return null;
|
|
39
|
+
let nextIndex = elements.indexOf(current) + 1;
|
|
40
|
+
if (nextIndex >= elements.length) if (wrap) nextIndex = 0;
|
|
41
|
+
else return null;
|
|
42
|
+
const nextElement = elements[nextIndex];
|
|
43
|
+
if (nextElement) {
|
|
44
|
+
focusSafely(nextElement);
|
|
45
|
+
return nextElement;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
focusPrevious(opts = {}) {
|
|
50
|
+
const root = ref();
|
|
51
|
+
if (!root) return null;
|
|
52
|
+
const { from, tabbable = true, wrap = false, accept } = opts;
|
|
53
|
+
const doc = getOwnerDocument(root);
|
|
54
|
+
const current = from || getActiveElement(doc);
|
|
55
|
+
let elements = getFocusableElements(root, tabbable);
|
|
56
|
+
if (accept) elements = elements.filter(accept);
|
|
57
|
+
if (!current || elements.length === 0) return null;
|
|
58
|
+
let prevIndex = elements.indexOf(current) - 1;
|
|
59
|
+
if (prevIndex < 0) if (wrap) prevIndex = elements.length - 1;
|
|
60
|
+
else return null;
|
|
61
|
+
const prevElement = elements[prevIndex];
|
|
62
|
+
if (prevElement) {
|
|
63
|
+
focusSafely(prevElement);
|
|
64
|
+
return prevElement;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
},
|
|
68
|
+
focusFirst(opts = {}) {
|
|
69
|
+
const root = ref();
|
|
70
|
+
if (!root) return null;
|
|
71
|
+
const { tabbable = true, accept } = opts;
|
|
72
|
+
let elements = getFocusableElements(root, tabbable);
|
|
73
|
+
if (accept) elements = elements.filter(accept);
|
|
74
|
+
if (elements.length > 0) {
|
|
75
|
+
focusSafely(elements[0]);
|
|
76
|
+
return elements[0];
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
},
|
|
80
|
+
focusLast(opts = {}) {
|
|
81
|
+
const root = ref();
|
|
82
|
+
if (!root) return null;
|
|
83
|
+
const { tabbable = true, accept } = opts;
|
|
84
|
+
let elements = getFocusableElements(root, tabbable);
|
|
85
|
+
if (accept) elements = elements.filter(accept);
|
|
86
|
+
if (elements.length > 0) {
|
|
87
|
+
const lastElement = elements[elements.length - 1];
|
|
88
|
+
focusSafely(lastElement);
|
|
89
|
+
return lastElement;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Provides the behavior and accessibility implementation for a toolbar.
|
|
97
|
+
* A toolbar is a container for a set of interactive controls with arrow key navigation.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* let ref;
|
|
102
|
+
* const { toolbarProps } = createToolbar({ orientation: 'horizontal' });
|
|
103
|
+
* return (
|
|
104
|
+
* <div {...toolbarProps}>
|
|
105
|
+
* <Button>Cut</Button>
|
|
106
|
+
* <Button>Copy</Button>
|
|
107
|
+
* <Button>Paste</Button>
|
|
108
|
+
* </div>
|
|
109
|
+
* );
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
function createToolbar(props = {}) {
|
|
113
|
+
let toolbarRef;
|
|
114
|
+
const [isInToolbar, setIsInToolbar] = createSignal(false);
|
|
115
|
+
let lastFocusedElement = null;
|
|
116
|
+
const locale = useLocale();
|
|
117
|
+
const orientation = () => access(props.orientation) ?? "horizontal";
|
|
118
|
+
const ariaLabel = () => access(props["aria-label"]);
|
|
119
|
+
const ariaLabelledby = () => access(props["aria-labelledby"]);
|
|
120
|
+
const focusManager = createFocusManager(() => toolbarRef);
|
|
121
|
+
onMount(() => {
|
|
122
|
+
if (toolbarRef) {
|
|
123
|
+
const parentToolbar = toolbarRef.parentElement?.closest("[role=\"toolbar\"]");
|
|
124
|
+
setIsInToolbar(!!parentToolbar);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const onKeyDown = (e) => {
|
|
128
|
+
const root = toolbarRef;
|
|
129
|
+
if (!root) return;
|
|
130
|
+
if (isInToolbar()) return;
|
|
131
|
+
const target = e.target;
|
|
132
|
+
if (!(target instanceof Element) || !root.contains(target)) return;
|
|
133
|
+
const doc = getOwnerDocument(root);
|
|
134
|
+
const isRTL = locale().direction === "rtl";
|
|
135
|
+
const isHorizontal = orientation() === "horizontal";
|
|
136
|
+
let handled = false;
|
|
137
|
+
switch (e.key) {
|
|
138
|
+
case "ArrowRight":
|
|
139
|
+
if (isHorizontal) {
|
|
140
|
+
if (isRTL) focusManager.focusPrevious({ tabbable: true });
|
|
141
|
+
else focusManager.focusNext({ tabbable: true });
|
|
142
|
+
handled = true;
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
case "ArrowLeft":
|
|
146
|
+
if (isHorizontal) {
|
|
147
|
+
if (isRTL) focusManager.focusNext({ tabbable: true });
|
|
148
|
+
else focusManager.focusPrevious({ tabbable: true });
|
|
149
|
+
handled = true;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case "ArrowDown":
|
|
153
|
+
if (!isHorizontal) {
|
|
154
|
+
focusManager.focusNext({ tabbable: true });
|
|
155
|
+
handled = true;
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
case "ArrowUp":
|
|
159
|
+
if (!isHorizontal) {
|
|
160
|
+
focusManager.focusPrevious({ tabbable: true });
|
|
161
|
+
handled = true;
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
case "Tab":
|
|
165
|
+
lastFocusedElement = getActiveElement(doc);
|
|
166
|
+
if (e.shiftKey) focusManager.focusFirst({ tabbable: true });
|
|
167
|
+
else focusManager.focusLast({ tabbable: true });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (handled) {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
e.stopPropagation();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const onBlur = (e) => {
|
|
176
|
+
const root = toolbarRef;
|
|
177
|
+
if (!root) return;
|
|
178
|
+
if (isInToolbar()) return;
|
|
179
|
+
const relatedTarget = e.relatedTarget;
|
|
180
|
+
if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) lastFocusedElement = e.target;
|
|
181
|
+
};
|
|
182
|
+
const onFocus = (e) => {
|
|
183
|
+
const root = toolbarRef;
|
|
184
|
+
if (!root) return;
|
|
185
|
+
if (isInToolbar()) return;
|
|
186
|
+
const relatedTarget = e.relatedTarget;
|
|
187
|
+
const target = e.target;
|
|
188
|
+
if (lastFocusedElement && !(relatedTarget && root.contains(relatedTarget)) && target instanceof Node && root.contains(target)) {
|
|
189
|
+
focusSafely(lastFocusedElement);
|
|
190
|
+
lastFocusedElement = null;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const setRef = (el) => {
|
|
194
|
+
toolbarRef = el;
|
|
195
|
+
el.addEventListener("keydown", onKeyDown, true);
|
|
196
|
+
el.addEventListener("focus", onFocus, true);
|
|
197
|
+
el.addEventListener("blur", onBlur, true);
|
|
198
|
+
onCleanup(() => {
|
|
199
|
+
el.removeEventListener("keydown", onKeyDown, true);
|
|
200
|
+
el.removeEventListener("focus", onFocus, true);
|
|
201
|
+
el.removeEventListener("blur", onBlur, true);
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
return {
|
|
205
|
+
toolbarProps: {
|
|
206
|
+
get role() {
|
|
207
|
+
return isInToolbar() ? "group" : "toolbar";
|
|
208
|
+
},
|
|
209
|
+
get "aria-orientation"() {
|
|
210
|
+
return orientation();
|
|
211
|
+
},
|
|
212
|
+
get "aria-label"() {
|
|
213
|
+
return ariaLabel();
|
|
214
|
+
},
|
|
215
|
+
get "aria-labelledby"() {
|
|
216
|
+
return ariaLabel() == null ? ariaLabelledby() : void 0;
|
|
217
|
+
},
|
|
218
|
+
ref: setRef
|
|
219
|
+
},
|
|
220
|
+
orientation
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
export { createToolbar as t };
|
|
225
|
+
|
|
226
|
+
//# sourceMappingURL=toolbar.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.jsx","names":[],"sources":["../../src/toolbar/createToolbar.ts"],"sourcesContent":["/**\n * createToolbar - Accessibility hook for toolbar elements\n *\n * Provides keyboard navigation between toolbar items using arrow keys.\n * Based on @react-aria/toolbar useToolbar.\n */\n\nimport { createSignal, onMount, onCleanup, type Accessor } from \"solid-js\";\nimport { type MaybeAccessor, access } from \"../utils\";\nimport { useLocale } from \"../i18n\";\nimport { getOwnerDocument, isFocusable, isTabbable } from \"../utils\";\nimport { focusSafely } from \"../utils/focus\";\n\nexport type Orientation = \"horizontal\" | \"vertical\";\n\nexport interface AriaToolbarProps {\n /** The orientation of the toolbar. @default 'horizontal' */\n orientation?: MaybeAccessor<Orientation>;\n /** An accessibility label for the toolbar. */\n \"aria-label\"?: MaybeAccessor<string>;\n /** Identifies the element (or elements) that labels the toolbar. */\n \"aria-labelledby\"?: MaybeAccessor<string>;\n}\n\nexport interface ToolbarAria {\n /** Props for the toolbar container element. */\n toolbarProps: {\n role: \"toolbar\" | \"group\";\n \"aria-orientation\"?: Orientation;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n tabIndex?: number;\n ref: (el: HTMLElement) => void;\n };\n /** The orientation of the toolbar. */\n orientation: Accessor<Orientation>;\n}\n\ninterface FocusManagerOptions {\n from?: Element;\n tabbable?: boolean;\n wrap?: boolean;\n accept?: (node: Element) => boolean;\n}\n\ninterface FocusManager {\n focusNext(opts?: FocusManagerOptions): HTMLElement | null;\n focusPrevious(opts?: FocusManagerOptions): HTMLElement | null;\n focusFirst(opts?: FocusManagerOptions): HTMLElement | null;\n focusLast(opts?: FocusManagerOptions): HTMLElement | null;\n}\n\nfunction getFocusableElements(root: Element, tabbable = false): HTMLElement[] {\n const elements: HTMLElement[] = [];\n const filter = tabbable ? isTabbable : isFocusable;\n\n // Check the root element itself\n if (filter(root)) {\n elements.push(root as HTMLElement);\n }\n\n // Check all descendants\n const descendants = root.querySelectorAll(\"*\");\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i];\n if (filter(el)) {\n elements.push(el as HTMLElement);\n }\n }\n\n return elements;\n}\n\nfunction getActiveElement(doc: Document): Element | null {\n let activeElement = doc.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\n\nfunction createFocusManager(ref: Accessor<HTMLElement | undefined>): FocusManager {\n return {\n focusNext(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let nextIndex = currentIndex + 1;\n\n if (nextIndex >= elements.length) {\n if (wrap) {\n nextIndex = 0;\n } else {\n return null;\n }\n }\n\n const nextElement = elements[nextIndex];\n if (nextElement) {\n focusSafely(nextElement);\n return nextElement;\n }\n\n return null;\n },\n\n focusPrevious(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let prevIndex = currentIndex - 1;\n\n if (prevIndex < 0) {\n if (wrap) {\n prevIndex = elements.length - 1;\n } else {\n return null;\n }\n }\n\n const prevElement = elements[prevIndex];\n if (prevElement) {\n focusSafely(prevElement);\n return prevElement;\n }\n\n return null;\n },\n\n focusFirst(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n focusSafely(elements[0]);\n return elements[0];\n }\n\n return null;\n },\n\n focusLast(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n const lastElement = elements[elements.length - 1];\n focusSafely(lastElement);\n return lastElement;\n }\n\n return null;\n },\n };\n}\n\n/**\n * Provides the behavior and accessibility implementation for a toolbar.\n * A toolbar is a container for a set of interactive controls with arrow key navigation.\n *\n * @example\n * ```tsx\n * let ref;\n * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });\n * return (\n * <div {...toolbarProps}>\n * <Button>Cut</Button>\n * <Button>Copy</Button>\n * <Button>Paste</Button>\n * </div>\n * );\n * ```\n */\nexport function createToolbar(props: AriaToolbarProps = {}): ToolbarAria {\n let toolbarRef: HTMLElement | undefined;\n const [isInToolbar, setIsInToolbar] = createSignal(false);\n let lastFocusedElement: Element | null = null;\n\n const locale = useLocale();\n const orientation = () => access(props.orientation) ?? \"horizontal\";\n const ariaLabel = () => access(props[\"aria-label\"]);\n const ariaLabelledby = () => access(props[\"aria-labelledby\"]);\n\n const focusManager = createFocusManager(() => toolbarRef);\n\n // Check if this toolbar is nested inside another toolbar\n onMount(() => {\n if (toolbarRef) {\n const parentToolbar = toolbarRef.parentElement?.closest('[role=\"toolbar\"]');\n setIsInToolbar(!!parentToolbar);\n }\n });\n\n // Keyboard event handler\n const onKeyDown = (e: KeyboardEvent) => {\n const root = toolbarRef;\n if (!root) return;\n\n // Don't handle if nested toolbar (parent handles navigation)\n if (isInToolbar()) return;\n\n const target = e.target;\n if (!(target instanceof Element) || !root.contains(target)) {\n return;\n }\n\n const doc = getOwnerDocument(root);\n\n const dir = locale().direction;\n const isRTL = dir === \"rtl\";\n const isHorizontal = orientation() === \"horizontal\";\n\n let handled = false;\n\n switch (e.key) {\n case \"ArrowRight\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusPrevious({ tabbable: true });\n } else {\n focusManager.focusNext({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowLeft\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusNext({ tabbable: true });\n } else {\n focusManager.focusPrevious({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowDown\":\n if (!isHorizontal) {\n focusManager.focusNext({ tabbable: true });\n handled = true;\n }\n break;\n case \"ArrowUp\":\n if (!isHorizontal) {\n focusManager.focusPrevious({ tabbable: true });\n handled = true;\n }\n break;\n case \"Tab\":\n // Move focus to the first/last child so the browser's own Tab handling\n // then carries focus OUT of the whole toolbar. Faithful to upstream\n // useToolbar: there is no roving tabindex — every item stays tabbable,\n // so a bare Tab would otherwise step to the next item instead of leaving.\n lastFocusedElement = getActiveElement(doc);\n if (e.shiftKey) {\n focusManager.focusFirst({ tabbable: true });\n } else {\n focusManager.focusLast({ tabbable: true });\n }\n return;\n }\n\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // Record the last focused child when focus moves out of the toolbar.\n const onBlur = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) {\n lastFocusedElement = e.target as Element;\n }\n };\n\n // Restore focus to the last focused child when focus returns into the toolbar.\n // If that element was removed, focus() is a no-op and the browser lands on the\n // first/last child per direction — matching upstream useToolbar.\n const onFocus = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n const target = e.target;\n if (\n lastFocusedElement &&\n !(relatedTarget && root.contains(relatedTarget)) &&\n target instanceof Node &&\n root.contains(target)\n ) {\n focusSafely(lastFocusedElement as HTMLElement);\n lastFocusedElement = null;\n }\n };\n\n // Set up capture event listeners\n const setRef = (el: HTMLElement) => {\n toolbarRef = el;\n\n // Use capture phase so container handlers run before the focused child's.\n el.addEventListener(\"keydown\", onKeyDown, true);\n el.addEventListener(\"focus\", onFocus, true);\n el.addEventListener(\"blur\", onBlur, true);\n\n onCleanup(() => {\n el.removeEventListener(\"keydown\", onKeyDown, true);\n el.removeEventListener(\"focus\", onFocus, true);\n el.removeEventListener(\"blur\", onBlur, true);\n });\n };\n\n return {\n toolbarProps: {\n get role() {\n return isInToolbar() ? \"group\" : \"toolbar\";\n },\n get \"aria-orientation\"() {\n // Upstream useToolbar emits aria-orientation unconditionally, on the\n // nested role=\"group\" too — not only on the root role=\"toolbar\".\n return orientation();\n },\n get \"aria-label\"() {\n return ariaLabel();\n },\n get \"aria-labelledby\"() {\n // Mirror useToolbar: `aria-label == null ? aria-labelledby : undefined`.\n // An explicit empty-string aria-label still suppresses labelledby.\n return ariaLabel() == null ? ariaLabelledby() : undefined;\n },\n ref: setRef,\n },\n orientation,\n };\n}\n"],"mappings":"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"}
|