@proyecto-viviana/solidaria 0.2.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -236
- package/dist/_chunk/actiongroup.js +207 -0
- package/dist/_chunk/actiongroup.js.map +1 -0
- package/dist/_chunk/actiongroup.jsx +207 -0
- package/dist/_chunk/actiongroup.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 +196 -0
- package/dist/_chunk/autocomplete.js.map +1 -0
- package/dist/_chunk/autocomplete.jsx +196 -0
- package/dist/_chunk/autocomplete.jsx.map +1 -0
- package/dist/_chunk/breadcrumbs.js +119 -0
- package/dist/_chunk/breadcrumbs.js.map +1 -0
- package/dist/_chunk/breadcrumbs.jsx +119 -0
- package/dist/_chunk/breadcrumbs.jsx.map +1 -0
- package/dist/_chunk/button.js +276 -0
- package/dist/_chunk/button.js.map +1 -0
- package/dist/_chunk/button.jsx +276 -0
- package/dist/_chunk/button.jsx.map +1 -0
- package/dist/_chunk/calendar.js +1036 -0
- package/dist/_chunk/calendar.js.map +1 -0
- package/dist/_chunk/calendar.jsx +1036 -0
- package/dist/_chunk/calendar.jsx.map +1 -0
- package/dist/_chunk/checkbox.js +234 -0
- package/dist/_chunk/checkbox.js.map +1 -0
- package/dist/_chunk/checkbox.jsx +234 -0
- package/dist/_chunk/checkbox.jsx.map +1 -0
- package/dist/_chunk/color.js +1174 -0
- package/dist/_chunk/color.js.map +1 -0
- package/dist/_chunk/color.jsx +1174 -0
- package/dist/_chunk/color.jsx.map +1 -0
- package/dist/_chunk/combobox.js +436 -0
- package/dist/_chunk/combobox.js.map +1 -0
- package/dist/_chunk/combobox.jsx +436 -0
- package/dist/_chunk/combobox.jsx.map +1 -0
- package/dist/_chunk/createCollator.js +229 -0
- package/dist/_chunk/createCollator.js.map +1 -0
- package/dist/_chunk/createCollator.jsx +223 -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 +54 -0
- package/dist/_chunk/createField.js.map +1 -0
- package/dist/_chunk/createField.jsx +54 -0
- package/dist/_chunk/createField.jsx.map +1 -0
- package/dist/_chunk/createFocus.js +101 -0
- package/dist/_chunk/createFocus.js.map +1 -0
- package/dist/_chunk/createFocus.jsx +101 -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 +121 -0
- package/dist/_chunk/createFocusWithin.js.map +1 -0
- package/dist/_chunk/createFocusWithin.jsx +121 -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/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 +130 -0
- package/dist/_chunk/createHover.js.map +1 -0
- package/dist/_chunk/createHover.jsx +130 -0
- package/dist/_chunk/createHover.jsx.map +1 -0
- package/dist/_chunk/createInteractionModality.js +269 -0
- package/dist/_chunk/createInteractionModality.js.map +1 -0
- package/dist/_chunk/createInteractionModality.jsx +269 -0
- package/dist/_chunk/createInteractionModality.jsx.map +1 -0
- package/dist/_chunk/createLabel.js +46 -0
- package/dist/_chunk/createLabel.js.map +1 -0
- package/dist/_chunk/createLabel.jsx +46 -0
- package/dist/_chunk/createLabel.jsx.map +1 -0
- package/dist/_chunk/createLabels.js +31 -0
- package/dist/_chunk/createLabels.js.map +1 -0
- package/dist/_chunk/createLabels.jsx +31 -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/createLongPress.js +91 -0
- package/dist/_chunk/createLongPress.js.map +1 -0
- package/dist/_chunk/createLongPress.jsx +91 -0
- package/dist/_chunk/createLongPress.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 +81 -0
- package/dist/_chunk/createProgressBar.js.map +1 -0
- package/dist/_chunk/createProgressBar.jsx +81 -0
- package/dist/_chunk/createProgressBar.jsx.map +1 -0
- package/dist/_chunk/createSelectableItem.js +298 -0
- package/dist/_chunk/createSelectableItem.js.map +1 -0
- package/dist/_chunk/createSelectableItem.jsx +298 -0
- package/dist/_chunk/createSelectableItem.jsx.map +1 -0
- package/dist/_chunk/createToggle.js +158 -0
- package/dist/_chunk/createToggle.js.map +1 -0
- package/dist/_chunk/createToggle.jsx +158 -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 +1393 -0
- package/dist/_chunk/datepicker.js.map +1 -0
- package/dist/_chunk/datepicker.jsx +1393 -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 +1304 -0
- package/dist/_chunk/dnd.js.map +1 -0
- package/dist/_chunk/dnd.jsx +1304 -0
- package/dist/_chunk/dnd.jsx.map +1 -0
- package/dist/_chunk/env.js +105 -0
- package/dist/_chunk/env.js.map +1 -0
- package/dist/_chunk/env.jsx +105 -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 +895 -0
- package/dist/_chunk/focus2.js.map +1 -0
- package/dist/_chunk/focus2.jsx +870 -0
- package/dist/_chunk/focus2.jsx.map +1 -0
- package/dist/_chunk/form.js +39 -0
- package/dist/_chunk/form.js.map +1 -0
- package/dist/_chunk/form.jsx +39 -0
- package/dist/_chunk/form.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 +364 -0
- package/dist/_chunk/gridlist.js.map +1 -0
- package/dist/_chunk/gridlist.jsx +364 -0
- package/dist/_chunk/gridlist.jsx.map +1 -0
- package/dist/_chunk/i18n.js +254 -0
- package/dist/_chunk/i18n.js.map +1 -0
- package/dist/_chunk/i18n.jsx +254 -0
- package/dist/_chunk/i18n.jsx.map +1 -0
- package/dist/_chunk/interactions.js +241 -0
- package/dist/_chunk/interactions.js.map +1 -0
- package/dist/_chunk/interactions.jsx +237 -0
- package/dist/_chunk/interactions.jsx.map +1 -0
- package/dist/_chunk/link.js +96 -0
- package/dist/_chunk/link.js.map +1 -0
- package/dist/_chunk/link.jsx +96 -0
- package/dist/_chunk/link.jsx.map +1 -0
- package/dist/_chunk/listbox.js +324 -0
- package/dist/_chunk/listbox.js.map +1 -0
- package/dist/_chunk/listbox.jsx +324 -0
- package/dist/_chunk/listbox.jsx.map +1 -0
- package/dist/_chunk/live-announcer.js +207 -0
- package/dist/_chunk/live-announcer.js.map +1 -0
- package/dist/_chunk/live-announcer.jsx +207 -0
- package/dist/_chunk/live-announcer.jsx.map +1 -0
- package/dist/_chunk/menu.js +518 -0
- package/dist/_chunk/menu.js.map +1 -0
- package/dist/_chunk/menu.jsx +518 -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 +258 -0
- package/dist/_chunk/numberfield.js.map +1 -0
- package/dist/_chunk/numberfield.jsx +258 -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 +319 -0
- package/dist/_chunk/radio.js.map +1 -0
- package/dist/_chunk/radio.jsx +319 -0
- package/dist/_chunk/radio.jsx.map +1 -0
- package/dist/_chunk/searchfield.js +209 -0
- package/dist/_chunk/searchfield.js.map +1 -0
- package/dist/_chunk/searchfield.jsx +209 -0
- package/dist/_chunk/searchfield.jsx.map +1 -0
- package/dist/_chunk/select.js +403 -0
- package/dist/_chunk/select.js.map +1 -0
- package/dist/_chunk/select.jsx +394 -0
- package/dist/_chunk/select.jsx.map +1 -0
- package/dist/_chunk/selection.js +679 -0
- package/dist/_chunk/selection.js.map +1 -0
- package/dist/_chunk/selection.jsx +679 -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 +255 -0
- package/dist/_chunk/slider.js.map +1 -0
- package/dist/_chunk/slider.jsx +255 -0
- package/dist/_chunk/slider.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 +1051 -0
- package/dist/_chunk/table.js.map +1 -0
- package/dist/_chunk/table.jsx +1051 -0
- package/dist/_chunk/table.jsx.map +1 -0
- package/dist/_chunk/tabs.js +260 -0
- package/dist/_chunk/tabs.js.map +1 -0
- package/dist/_chunk/tabs.jsx +260 -0
- package/dist/_chunk/tabs.jsx.map +1 -0
- package/dist/_chunk/tag.js +286 -0
- package/dist/_chunk/tag.js.map +1 -0
- package/dist/_chunk/tag.jsx +286 -0
- package/dist/_chunk/tag.jsx.map +1 -0
- package/dist/_chunk/textfield.js +109 -0
- package/dist/_chunk/textfield.js.map +1 -0
- package/dist/_chunk/textfield.jsx +109 -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 +258 -0
- package/dist/_chunk/toolbar.js.map +1 -0
- package/dist/_chunk/toolbar.jsx +258 -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 +424 -0
- package/dist/_chunk/tree.js.map +1 -0
- package/dist/_chunk/tree.jsx +424 -0
- package/dist/_chunk/tree.jsx.map +1 -0
- package/dist/_chunk/utils.js +665 -0
- package/dist/_chunk/utils.js.map +1 -0
- package/dist/_chunk/utils.jsx +665 -0
- package/dist/_chunk/utils.jsx.map +1 -0
- package/dist/_chunk/visually-hidden.js +92 -0
- package/dist/_chunk/visually-hidden.js.map +1 -0
- package/dist/_chunk/visually-hidden.jsx +92 -0
- package/dist/_chunk/visually-hidden.jsx.map +1 -0
- package/dist/actiongroup/createActionGroup.d.ts +5 -5
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -1
- package/dist/actiongroup/index.d.ts +1 -1
- package/dist/actiongroup/index.js +2 -0
- package/dist/actiongroup/index.jsx +2 -0
- package/dist/autocomplete/createAutocomplete.d.ts +12 -10
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/autocomplete/index.d.ts +1 -1
- package/dist/autocomplete/index.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 +9 -7
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/breadcrumbs/index.d.ts +1 -1
- package/dist/breadcrumbs/index.js +2 -0
- package/dist/breadcrumbs/index.jsx +2 -0
- package/dist/button/createButton.d.ts +1 -1
- package/dist/button/createButton.d.ts.map +1 -1
- package/dist/button/createToggleButton.d.ts +3 -3
- package/dist/button/createToggleButtonGroup.d.ts +7 -7
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -1
- package/dist/button/index.d.ts +6 -6
- package/dist/button/index.d.ts.map +1 -1
- package/dist/button/index.js +2 -0
- package/dist/button/index.jsx +2 -0
- package/dist/button/types.d.ts +18 -12
- package/dist/button/types.d.ts.map +1 -1
- package/dist/calendar/createCalendar.d.ts +15 -5
- package/dist/calendar/createCalendar.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts +6 -2
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts +4 -4
- 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 +15 -5
- package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts +4 -2
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/calendar/index.d.ts +7 -5
- 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 +12 -0
- package/dist/calendar/intl/index.d.ts.map +1 -0
- package/dist/calendar/utils.d.ts +16 -0
- package/dist/calendar/utils.d.ts.map +1 -0
- package/dist/checkbox/createCheckbox.d.ts +10 -6
- package/dist/checkbox/createCheckbox.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroup.d.ts +7 -7
- package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroupItem.d.ts +4 -4
- package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroupState.d.ts +2 -2
- package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -1
- package/dist/checkbox/index.d.ts +8 -8
- package/dist/checkbox/index.d.ts.map +1 -1
- package/dist/checkbox/index.js +2 -0
- package/dist/checkbox/index.jsx +2 -0
- package/dist/collections/index.d.ts +3 -3
- package/dist/collections/index.d.ts.map +1 -1
- 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 +3 -3
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorField.d.ts +4 -4
- package/dist/color/createColorField.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts +4 -4
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorSwatch.d.ts +2 -2
- package/dist/color/createColorSwatch.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts +3 -3
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/color/index.d.ts +6 -6
- package/dist/color/index.js +2 -0
- package/dist/color/index.jsx +2 -0
- package/dist/color/types.d.ts +98 -16
- package/dist/color/types.d.ts.map +1 -1
- package/dist/combobox/createComboBox.d.ts +10 -7
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/combobox/index.d.ts +1 -1
- package/dist/combobox/index.js +2 -0
- package/dist/combobox/index.jsx +2 -0
- package/dist/combobox/intl/index.d.ts +1 -1
- package/dist/datepicker/createDateField.d.ts +18 -6
- package/dist/datepicker/createDateField.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +51 -5
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDatePickerGroup.d.ts +19 -0
- package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -0
- package/dist/datepicker/createDateRangePicker.d.ts +8 -6
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateSegment.d.ts +10 -2
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createTimeField.d.ts +11 -5
- package/dist/datepicker/createTimeField.d.ts.map +1 -1
- package/dist/datepicker/createTimeSegment.d.ts +2 -2
- package/dist/datepicker/createTimeSegment.d.ts.map +1 -1
- package/dist/datepicker/index.d.ts +7 -6
- 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/dialog/createDialog.d.ts +5 -5
- package/dist/dialog/createDialog.d.ts.map +1 -1
- package/dist/dialog/index.d.ts +2 -2
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/dialog/index.js +2 -0
- package/dist/dialog/index.jsx +2 -0
- package/dist/dialog/types.d.ts +4 -4
- package/dist/disclosure/createDisclosure.d.ts +5 -2
- package/dist/disclosure/createDisclosure.d.ts.map +1 -1
- package/dist/disclosure/createDisclosureGroup.d.ts +4 -4
- package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
- package/dist/disclosure/index.d.ts +2 -2
- package/dist/disclosure/index.js +2 -0
- package/dist/disclosure/index.jsx +2 -0
- package/dist/dnd/createDrag.d.ts +2 -2
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts +2 -2
- package/dist/dnd/createDraggableItem.d.ts +3 -3
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDrop.d.ts +2 -2
- package/dist/dnd/createDrop.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +26 -6
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/createDroppableItem.d.ts +3 -3
- package/dist/dnd/index.d.ts +12 -12
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/dnd/index.js +2 -0
- package/dist/dnd/index.jsx +2 -0
- package/dist/dnd/types.d.ts +2 -2
- package/dist/dnd/types.d.ts.map +1 -1
- package/dist/dnd/utils.d.ts +2 -2
- package/dist/dnd/utils.d.ts.map +1 -1
- package/dist/focus/FocusScope.d.ts +1 -1
- package/dist/focus/FocusScope.d.ts.map +1 -1
- package/dist/focus/createAutoFocus.d.ts.map +1 -1
- package/dist/focus/createFocusRestore.d.ts.map +1 -1
- package/dist/focus/createVirtualFocus.d.ts +4 -4
- package/dist/focus/createVirtualFocus.d.ts.map +1 -1
- package/dist/focus/index.d.ts +4 -4
- package/dist/focus/index.d.ts.map +1 -1
- package/dist/focus/index.js +2 -0
- package/dist/focus/index.jsx +2 -0
- package/dist/form/createFormReset.d.ts +1 -1
- package/dist/form/createFormValidation.d.ts +3 -3
- package/dist/form/createFormValidation.d.ts.map +1 -1
- package/dist/form/index.d.ts +2 -2
- package/dist/form/index.d.ts.map +1 -1
- package/dist/form/index.js +3 -0
- package/dist/form/index.jsx +3 -0
- package/dist/grid/GridKeyboardDelegate.d.ts +5 -5
- package/dist/grid/createGrid.d.ts +3 -3
- package/dist/grid/createGridCell.d.ts +3 -3
- package/dist/grid/createGridRow.d.ts +3 -3
- package/dist/grid/index.d.ts +5 -5
- package/dist/grid/index.js +2 -0
- package/dist/grid/index.jsx +2 -0
- package/dist/grid/types.d.ts +8 -8
- package/dist/gridlist/createGridList.d.ts +12 -4
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/gridlist/createGridListItem.d.ts +4 -4
- 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/createGridListSelectionCheckbox.d.ts +3 -3
- package/dist/gridlist/createGridListSelectionCheckbox.d.ts.map +1 -1
- package/dist/gridlist/index.d.ts +5 -4
- 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 +61 -7
- package/dist/gridlist/types.d.ts.map +1 -1
- package/dist/i18n/createCollator.d.ts.map +1 -1
- package/dist/i18n/createDateFormatter.d.ts.map +1 -1
- package/dist/i18n/createFilter.d.ts.map +1 -1
- package/dist/i18n/createNumberFormatter.d.ts +1 -1
- package/dist/i18n/createNumberFormatter.d.ts.map +1 -1
- package/dist/i18n/createStringFormatter.d.ts +2 -2
- package/dist/i18n/createStringFormatter.d.ts.map +1 -1
- package/dist/i18n/index.d.ts +8 -8
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/index.jsx +3 -0
- package/dist/i18n/locale.d.ts +2 -2
- package/dist/i18n/locale.d.ts.map +1 -1
- package/dist/i18n/utils.d.ts.map +1 -1
- package/dist/index.d.ts +56 -51
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -17119
- package/dist/index.jsx +71 -0
- package/dist/interactions/FocusableProvider.d.ts +2 -2
- package/dist/interactions/FocusableProvider.d.ts.map +1 -1
- package/dist/interactions/PressEvent.d.ts +13 -2
- package/dist/interactions/PressEvent.d.ts.map +1 -1
- package/dist/interactions/createFocus.d.ts +1 -1
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusRing.d.ts +1 -1
- package/dist/interactions/createFocusRing.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/interactions/createFocusable.d.ts +3 -3
- package/dist/interactions/createFocusable.d.ts.map +1 -1
- package/dist/interactions/createHover.d.ts +5 -5
- package/dist/interactions/createHover.d.ts.map +1 -1
- package/dist/interactions/createInteractionModality.d.ts +3 -4
- package/dist/interactions/createInteractionModality.d.ts.map +1 -1
- package/dist/interactions/createKeyboard.d.ts +1 -1
- package/dist/interactions/createKeyboard.d.ts.map +1 -1
- package/dist/interactions/createLongPress.d.ts +5 -5
- package/dist/interactions/createMove.d.ts +5 -5
- package/dist/interactions/createMove.d.ts.map +1 -1
- package/dist/interactions/createPress.d.ts +4 -4
- package/dist/interactions/createPress.d.ts.map +1 -1
- package/dist/interactions/index.d.ts +12 -12
- package/dist/interactions/index.d.ts.map +1 -1
- package/dist/interactions/index.js +10 -0
- package/dist/interactions/index.jsx +10 -0
- package/dist/label/createField.d.ts +4 -4
- package/dist/label/createField.d.ts.map +1 -1
- package/dist/label/createLabel.d.ts +7 -7
- package/dist/label/createLabel.d.ts.map +1 -1
- package/dist/label/createLabels.d.ts +1 -1
- package/dist/label/createLabels.d.ts.map +1 -1
- package/dist/label/index.d.ts +5 -5
- package/dist/label/index.js +4 -0
- package/dist/label/index.jsx +4 -0
- package/dist/landmark/createLandmark.d.ts +5 -5
- package/dist/landmark/createLandmark.d.ts.map +1 -1
- package/dist/landmark/index.d.ts +1 -1
- package/dist/landmark/index.js +2 -0
- package/dist/landmark/index.jsx +2 -0
- package/dist/link/createLink.d.ts +14 -8
- package/dist/link/createLink.d.ts.map +1 -1
- package/dist/link/index.d.ts +1 -1
- package/dist/link/index.js +2 -0
- package/dist/link/index.jsx +2 -0
- package/dist/listbox/createListBox.d.ts +48 -6
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts +27 -4
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/listbox/index.d.ts +2 -2
- package/dist/listbox/index.d.ts.map +1 -1
- package/dist/listbox/index.js +2 -0
- package/dist/listbox/index.jsx +2 -0
- package/dist/live-announcer/announce.d.ts +2 -2
- package/dist/live-announcer/announce.d.ts.map +1 -1
- package/dist/live-announcer/index.d.ts +1 -1
- package/dist/live-announcer/index.js +2 -0
- package/dist/live-announcer/index.jsx +2 -0
- package/dist/menu/createMenu.d.ts +14 -11
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/menu/createMenuItem.d.ts +25 -5
- package/dist/menu/createMenuItem.d.ts.map +1 -1
- package/dist/menu/createMenuTrigger.d.ts +4 -4
- package/dist/menu/index.d.ts +3 -3
- package/dist/menu/index.d.ts.map +1 -1
- package/dist/menu/index.js +2 -0
- package/dist/menu/index.jsx +2 -0
- package/dist/meter/createMeter.d.ts +6 -6
- package/dist/meter/createMeter.d.ts.map +1 -1
- package/dist/meter/index.d.ts +1 -1
- package/dist/meter/index.js +2 -0
- package/dist/meter/index.jsx +2 -0
- package/dist/numberfield/createNumberField.d.ts +9 -8
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/numberfield/index.d.ts +1 -1
- package/dist/numberfield/index.js +2 -0
- package/dist/numberfield/index.jsx +2 -0
- package/dist/overlays/ariaHideOutside.d.ts.map +1 -1
- package/dist/overlays/createModal.d.ts +3 -3
- package/dist/overlays/createModal.d.ts.map +1 -1
- package/dist/overlays/createOverlay.d.ts +1 -1
- package/dist/overlays/createOverlay.d.ts.map +1 -1
- package/dist/overlays/createOverlayTrigger.d.ts +6 -6
- package/dist/overlays/index.d.ts +6 -6
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/overlays/index.js +4 -0
- package/dist/overlays/index.jsx +4 -0
- package/dist/popover/calculatePosition.d.ts +6 -4
- package/dist/popover/calculatePosition.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts +11 -3
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/createPopover.d.ts +4 -4
- package/dist/popover/createPopover.d.ts.map +1 -1
- package/dist/popover/index.d.ts +3 -3
- package/dist/popover/index.js +2 -0
- package/dist/popover/index.jsx +2 -0
- package/dist/progress/createProgressBar.d.ts +7 -5
- package/dist/progress/createProgressBar.d.ts.map +1 -1
- package/dist/progress/index.d.ts +1 -1
- package/dist/progress/index.js +2 -0
- package/dist/progress/index.jsx +2 -0
- package/dist/radio/createRadio.d.ts +9 -7
- package/dist/radio/createRadio.d.ts.map +1 -1
- package/dist/radio/createRadioGroup.d.ts +10 -10
- package/dist/radio/createRadioGroup.d.ts.map +1 -1
- package/dist/radio/createRadioGroupState.d.ts +3 -3
- package/dist/radio/createRadioGroupState.d.ts.map +1 -1
- package/dist/radio/index.d.ts +3 -3
- package/dist/radio/index.d.ts.map +1 -1
- package/dist/radio/index.js +2 -0
- package/dist/radio/index.jsx +2 -0
- package/dist/searchfield/createSearchField.d.ts +7 -7
- package/dist/searchfield/createSearchField.d.ts.map +1 -1
- package/dist/searchfield/index.d.ts +2 -2
- package/dist/searchfield/index.js +2 -0
- package/dist/searchfield/index.jsx +2 -0
- package/dist/select/createHiddenSelect.d.ts +4 -4
- package/dist/select/createHiddenSelect.d.ts.map +1 -1
- package/dist/select/createSelect.d.ts +14 -6
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/select/index.d.ts +2 -2
- package/dist/select/index.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 +2 -2
- package/dist/selection/createTypeSelect.d.ts.map +1 -1
- package/dist/selection/index.d.ts +10 -1
- package/dist/selection/index.d.ts.map +1 -1
- package/dist/selection/index.js +4 -0
- package/dist/selection/index.jsx +4 -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/createSeparator.d.ts +9 -5
- package/dist/separator/createSeparator.d.ts.map +1 -1
- package/dist/separator/index.d.ts +1 -1
- package/dist/separator/index.js +2 -0
- package/dist/separator/index.jsx +2 -0
- package/dist/slider/createSlider.d.ts +11 -7
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/slider/index.d.ts +2 -2
- package/dist/slider/index.js +2 -0
- package/dist/slider/index.jsx +2 -0
- package/dist/ssr/index.d.ts +18 -1
- 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/createStepList.d.ts +36 -0
- package/dist/steplist/createStepList.d.ts.map +1 -0
- package/dist/steplist/index.d.ts +2 -0
- package/dist/steplist/index.d.ts.map +1 -0
- package/dist/steplist/index.js +2 -0
- package/dist/steplist/index.jsx +2 -0
- package/dist/switch/createSwitch.d.ts +10 -4
- package/dist/switch/createSwitch.d.ts.map +1 -1
- package/dist/switch/index.d.ts +1 -1
- package/dist/switch/index.js +2 -0
- package/dist/switch/index.jsx +2 -0
- package/dist/table/createTable.d.ts +3 -3
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/table/createTableCell.d.ts +3 -3
- package/dist/table/createTableCell.d.ts.map +1 -1
- package/dist/table/createTableColumnHeader.d.ts +3 -3
- package/dist/table/createTableColumnHeader.d.ts.map +1 -1
- package/dist/table/createTableColumnResize.d.ts +41 -0
- package/dist/table/createTableColumnResize.d.ts.map +1 -0
- package/dist/table/createTableHeaderRow.d.ts +3 -3
- package/dist/table/createTableRow.d.ts +4 -4
- package/dist/table/createTableRow.d.ts.map +1 -1
- package/dist/table/createTableRowGroup.d.ts +2 -2
- package/dist/table/createTableRowGroup.d.ts.map +1 -1
- package/dist/table/createTableSelectAllCheckbox.d.ts +3 -3
- package/dist/table/createTableSelectionCheckbox.d.ts +3 -3
- package/dist/table/index.d.ts +11 -9
- package/dist/table/index.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 +41 -7
- package/dist/table/types.d.ts.map +1 -1
- package/dist/tabs/createTabs.d.ts +32 -28
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tabs/index.d.ts +1 -1
- package/dist/tabs/index.js +2 -0
- package/dist/tabs/index.jsx +2 -0
- package/dist/tag/createTag.d.ts +4 -2
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts +5 -5
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/tag/index.d.ts +2 -2
- package/dist/tag/index.d.ts.map +1 -1
- package/dist/tag/index.js +2 -0
- package/dist/tag/index.jsx +2 -0
- package/dist/textfield/createTextField.d.ts +17 -11
- package/dist/textfield/createTextField.d.ts.map +1 -1
- package/dist/textfield/index.d.ts +1 -1
- package/dist/textfield/index.d.ts.map +1 -1
- package/dist/textfield/index.js +2 -0
- package/dist/textfield/index.jsx +2 -0
- package/dist/toast/createToast.d.ts +2 -2
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/createToastRegion.d.ts +5 -3
- package/dist/toast/createToastRegion.d.ts.map +1 -1
- package/dist/toast/index.d.ts +2 -2
- package/dist/toast/index.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 +13 -9
- package/dist/toggle/createToggle.d.ts.map +1 -1
- package/dist/toggle/createToggleState.d.ts +2 -2
- package/dist/toggle/createToggleState.d.ts.map +1 -1
- package/dist/toggle/index.d.ts +4 -4
- package/dist/toggle/index.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 +9 -9
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/toolbar/index.d.ts +1 -1
- package/dist/toolbar/index.d.ts.map +1 -1
- package/dist/toolbar/index.js +2 -0
- package/dist/toolbar/index.jsx +2 -0
- package/dist/tooltip/createTooltip.d.ts +5 -5
- package/dist/tooltip/createTooltip.d.ts.map +1 -1
- package/dist/tooltip/createTooltipTrigger.d.ts +10 -5
- package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
- package/dist/tooltip/index.d.ts +2 -2
- package/dist/tooltip/index.js +2 -0
- package/dist/tooltip/index.jsx +2 -0
- package/dist/tree/createTree.d.ts +8 -4
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts +4 -4
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/createTreeSelectionCheckbox.d.ts +3 -3
- package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
- package/dist/tree/index.d.ts +4 -4
- package/dist/tree/index.js +2 -0
- package/dist/tree/index.jsx +2 -0
- package/dist/tree/types.d.ts +20 -6
- 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/createDescription.d.ts +2 -2
- package/dist/utils/createDescription.d.ts.map +1 -1
- package/dist/utils/dom.d.ts +48 -2
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/focus.d.ts +1 -1
- package/dist/utils/focus.d.ts.map +1 -1
- package/dist/utils/geometry.d.ts.map +1 -1
- package/dist/utils/index.d.ts +15 -12
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.jsx +5 -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/reactivity.d.ts +1 -1
- package/dist/utils/scrollIntoView.d.ts +30 -0
- package/dist/utils/scrollIntoView.d.ts.map +1 -0
- package/dist/visually-hidden/createVisuallyHidden.d.ts +2 -2
- package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
- package/dist/visually-hidden/index.d.ts +1 -1
- package/dist/visually-hidden/index.js +2 -0
- package/dist/visually-hidden/index.jsx +2 -0
- package/package.json +334 -33
- package/src/actiongroup/createActionGroup.ts +101 -91
- package/src/actiongroup/index.ts +1 -1
- package/src/autocomplete/createAutocomplete.ts +177 -148
- package/src/autocomplete/index.ts +1 -1
- package/src/breadcrumbs/createBreadcrumbs.ts +33 -42
- package/src/breadcrumbs/index.ts +1 -1
- package/src/button/createButton.ts +102 -73
- package/src/button/createToggleButton.ts +10 -10
- package/src/button/createToggleButtonGroup.ts +25 -32
- package/src/button/index.ts +6 -9
- package/src/button/types.ts +18 -12
- package/src/calendar/createCalendar.ts +64 -29
- package/src/calendar/createCalendarCell.ts +115 -46
- package/src/calendar/createCalendarGrid.ts +97 -41
- package/src/calendar/createCalendarMonthPicker.ts +105 -0
- package/src/calendar/createCalendarYearPicker.ts +144 -0
- package/src/calendar/createRangeCalendar.ts +68 -31
- package/src/calendar/createRangeCalendarCell.ts +92 -31
- package/src/calendar/index.ts +21 -8
- package/src/calendar/intl/index.ts +210 -0
- package/src/calendar/utils.ts +231 -0
- package/src/checkbox/createCheckbox.ts +23 -21
- package/src/checkbox/createCheckboxGroup.ts +68 -44
- package/src/checkbox/createCheckboxGroupItem.ts +26 -41
- package/src/checkbox/createCheckboxGroupState.ts +3 -22
- package/src/checkbox/index.ts +8 -10
- package/src/collections/index.ts +33 -29
- package/src/color/createColorArea.ts +232 -154
- package/src/color/createColorField.ts +107 -58
- package/src/color/createColorSlider.ts +231 -73
- package/src/color/createColorSwatch.ts +38 -13
- package/src/color/createColorWheel.ts +208 -83
- package/src/color/index.ts +6 -6
- package/src/color/types.ts +98 -16
- package/src/combobox/createComboBox.ts +157 -100
- package/src/combobox/index.ts +1 -1
- package/src/combobox/intl/index.ts +5 -5
- package/src/datepicker/createDateField.ts +192 -39
- package/src/datepicker/createDatePicker.ts +260 -67
- package/src/datepicker/createDatePickerGroup.ts +149 -0
- package/src/datepicker/createDateRangePicker.ts +105 -57
- package/src/datepicker/createDateSegment.ts +188 -96
- package/src/datepicker/createTimeField.ts +38 -34
- package/src/datepicker/createTimeSegment.ts +67 -85
- package/src/datepicker/index.ts +13 -14
- package/src/dialog/createDialog.ts +45 -38
- package/src/dialog/index.ts +2 -2
- package/src/dialog/types.ts +4 -4
- package/src/disclosure/createDisclosure.ts +138 -33
- package/src/disclosure/createDisclosureGroup.ts +8 -21
- package/src/disclosure/index.ts +2 -2
- package/src/dnd/createDrag.ts +19 -25
- package/src/dnd/createDraggableCollection.ts +4 -4
- package/src/dnd/createDraggableItem.ts +20 -19
- package/src/dnd/createDrop.ts +42 -51
- package/src/dnd/createDroppableCollection.ts +293 -173
- package/src/dnd/createDroppableItem.ts +34 -34
- package/src/dnd/index.ts +23 -12
- package/src/dnd/types.ts +4 -7
- package/src/dnd/utils.ts +58 -47
- package/src/focus/FocusScope.tsx +301 -176
- package/src/focus/createAutoFocus.ts +4 -20
- package/src/focus/createFocusRestore.ts +15 -28
- package/src/focus/createVirtualFocus.ts +20 -36
- package/src/focus/index.ts +4 -8
- package/src/form/createFormReset.ts +4 -4
- package/src/form/createFormValidation.ts +23 -39
- package/src/form/index.ts +2 -5
- package/src/grid/GridKeyboardDelegate.ts +30 -30
- package/src/grid/createGrid.ts +36 -36
- package/src/grid/createGridCell.ts +18 -18
- package/src/grid/createGridRow.ts +14 -14
- package/src/grid/index.ts +5 -5
- package/src/grid/types.ts +8 -8
- package/src/gridlist/createGridList.ts +172 -64
- package/src/gridlist/createGridListItem.ts +98 -121
- package/src/gridlist/createGridListSection.ts +54 -0
- package/src/gridlist/createGridListSelectionCheckbox.ts +12 -9
- package/src/gridlist/index.ts +7 -4
- package/src/gridlist/types.ts +58 -7
- package/src/i18n/createCollator.ts +5 -18
- package/src/i18n/createDateFormatter.ts +5 -13
- package/src/i18n/createFilter.ts +11 -24
- package/src/i18n/createNumberFormatter.ts +4 -6
- package/src/i18n/createStringFormatter.ts +19 -15
- package/src/i18n/index.ts +8 -11
- package/src/i18n/locale.tsx +15 -40
- package/src/i18n/utils.ts +35 -39
- package/src/index.ts +111 -172
- package/src/interactions/FocusableProvider.tsx +3 -7
- package/src/interactions/PressEvent.ts +18 -4
- package/src/interactions/createFocus.ts +12 -8
- package/src/interactions/createFocusRing.ts +21 -19
- package/src/interactions/createFocusWithin.ts +20 -13
- package/src/interactions/createFocusable.ts +15 -16
- package/src/interactions/createHover.ts +70 -55
- package/src/interactions/createInteractionModality.ts +96 -94
- package/src/interactions/createKeyboard.ts +12 -2
- package/src/interactions/createLongPress.ts +23 -23
- package/src/interactions/createMove.ts +72 -62
- package/src/interactions/createPress.ts +192 -92
- package/src/interactions/index.ts +24 -16
- package/src/label/createField.ts +18 -19
- package/src/label/createLabel.ts +18 -30
- package/src/label/createLabels.ts +8 -12
- package/src/label/index.ts +5 -5
- package/src/landmark/createLandmark.ts +30 -51
- package/src/landmark/index.ts +1 -1
- package/src/link/createLink.ts +83 -56
- package/src/link/index.ts +1 -1
- package/src/listbox/createListBox.ts +198 -66
- package/src/listbox/createOption.ts +112 -71
- package/src/listbox/index.ts +2 -6
- package/src/live-announcer/announce.ts +44 -71
- package/src/live-announcer/index.ts +1 -1
- package/src/menu/createMenu.ts +171 -65
- package/src/menu/createMenuItem.ts +315 -51
- package/src/menu/createMenuTrigger.ts +15 -15
- package/src/menu/index.ts +3 -12
- package/src/meter/createMeter.ts +7 -15
- package/src/meter/index.ts +1 -1
- package/src/numberfield/createNumberField.ts +205 -80
- package/src/numberfield/index.ts +1 -1
- package/src/overlays/ariaHideOutside.ts +14 -10
- package/src/overlays/createInteractOutside.ts +21 -18
- package/src/overlays/createModal.tsx +17 -17
- package/src/overlays/createOverlay.ts +38 -8
- package/src/overlays/createOverlayTrigger.ts +16 -16
- package/src/overlays/createPreventScroll.ts +46 -24
- package/src/overlays/index.ts +6 -17
- package/src/popover/calculatePosition.ts +134 -124
- package/src/popover/createOverlayPosition.ts +55 -40
- package/src/popover/createPopover.ts +42 -17
- package/src/popover/index.ts +3 -3
- package/src/progress/createProgressBar.ts +31 -32
- package/src/progress/index.ts +1 -1
- package/src/radio/createRadio.ts +114 -75
- package/src/radio/createRadioGroup.ts +83 -77
- package/src/radio/createRadioGroupState.ts +7 -31
- package/src/radio/index.ts +3 -8
- package/src/searchfield/createSearchField.ts +57 -29
- package/src/searchfield/index.ts +2 -2
- package/src/select/createHiddenSelect.tsx +57 -44
- package/src/select/createSelect.ts +146 -73
- package/src/select/index.ts +2 -7
- 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 +498 -0
- package/src/selection/createSelectableList.ts +93 -0
- package/src/selection/createTypeSelect.ts +120 -59
- package/src/selection/index.ts +32 -1
- package/src/selection/selectItem.ts +80 -0
- package/src/selection/utils.ts +82 -0
- package/src/separator/createSeparator.ts +20 -25
- package/src/separator/index.ts +1 -1
- package/src/slider/createSlider.ts +128 -112
- package/src/slider/index.ts +2 -2
- package/src/ssr/index.tsx +38 -46
- package/src/steplist/createStepList.ts +106 -0
- package/src/steplist/index.ts +8 -0
- package/src/switch/createSwitch.ts +19 -14
- package/src/switch/index.ts +1 -1
- package/src/table/createTable.ts +192 -95
- package/src/table/createTableCell.ts +17 -16
- package/src/table/createTableColumnHeader.ts +67 -20
- package/src/table/createTableColumnResize.ts +256 -0
- package/src/table/createTableHeaderRow.ts +7 -7
- package/src/table/createTableRow.ts +206 -91
- package/src/table/createTableRowGroup.ts +5 -7
- package/src/table/createTableSelectAllCheckbox.ts +14 -14
- package/src/table/createTableSelectionCheckbox.ts +8 -8
- package/src/table/index.ts +14 -9
- package/src/table/types.ts +43 -7
- package/src/tabs/createTabs.ts +123 -111
- package/src/tabs/index.ts +1 -1
- package/src/tag/createTag.ts +57 -50
- package/src/tag/createTagGroup.ts +47 -41
- package/src/tag/index.ts +2 -6
- package/src/textfield/createTextField.ts +67 -35
- package/src/textfield/index.ts +1 -5
- package/src/toast/createToast.ts +29 -26
- package/src/toast/createToastRegion.ts +169 -26
- package/src/toast/index.ts +2 -6
- package/src/toggle/createToggle.ts +115 -53
- package/src/toggle/createToggleState.ts +2 -10
- package/src/toggle/index.ts +4 -5
- package/src/toolbar/createToolbar.ts +214 -230
- package/src/toolbar/index.ts +1 -1
- package/src/tooltip/createTooltip.ts +11 -24
- package/src/tooltip/createTooltipTrigger.ts +61 -49
- package/src/tooltip/index.ts +2 -2
- package/src/tree/createTree.ts +128 -72
- package/src/tree/createTreeItem.ts +120 -135
- package/src/tree/createTreeSelectionCheckbox.ts +11 -8
- package/src/tree/index.ts +4 -4
- package/src/tree/types.ts +20 -6
- package/src/utils/animation.ts +151 -0
- package/src/utils/createDescription.ts +6 -23
- package/src/utils/dom.ts +265 -68
- package/src/utils/env.ts +9 -11
- package/src/utils/events.ts +7 -7
- package/src/utils/filterDOMProps.ts +49 -49
- package/src/utils/focus.ts +60 -68
- package/src/utils/geometry.ts +1 -4
- package/src/utils/globalListeners.ts +9 -9
- package/src/utils/index.ts +20 -22
- package/src/utils/keyboard.ts +25 -0
- package/src/utils/mergeProps.ts +49 -15
- package/src/utils/platform.ts +2 -2
- package/src/utils/reactivity.ts +3 -3
- package/src/utils/scrollIntoView.ts +181 -0
- package/src/utils/textSelection.ts +16 -16
- package/src/visually-hidden/createVisuallyHidden.ts +16 -28
- package/src/visually-hidden/index.ts +1 -1
- package/dist/i18n/NumberFormatter.d.ts +0 -43
- package/dist/i18n/NumberFormatter.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.ssr.js +0 -17082
- package/dist/index.ssr.js.map +0 -1
- package/src/i18n/NumberFormatter.ts +0 -266
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLabel.js","names":[],"sources":["../../src/label/createLabel.ts"],"sourcesContent":["/**\n * Label hook for Solidaria\n *\n * Provides the accessibility implementation for labels and their associated elements.\n * Labels provide context for user inputs.\n *\n * This is a 1:1 port of @react-aria/label's useLabel hook.\n */\n\nimport { JSX } from \"solid-js\";\nimport { createId } from \"../ssr\";\nimport { createLabels } from \"./createLabels\";\nimport { type MaybeAccessor, access } from \"../utils/reactivity\";\nimport { isDevEnv } from \"../utils/env\";\n\nexport interface AriaLabelingProps {\n /** Defines a string value that labels the current element. */\n \"aria-label\"?: string;\n /** Identifies the element (or elements) that labels the current element. */\n \"aria-labelledby\"?: string;\n /** Identifies the element (or elements) that describes the object. */\n \"aria-describedby\"?: string;\n /** Identifies the element (or elements) that provide a detailed, extended description for the object. */\n \"aria-details\"?: string;\n}\n\nexport interface LabelableProps {\n /** The content to display as the label. */\n label?: JSX.Element;\n}\n\nexport interface DOMProps {\n /** The element's unique identifier. */\n id?: string;\n}\n\nexport interface LabelAriaProps extends LabelableProps, DOMProps, AriaLabelingProps {\n /**\n * The HTML element used to render the label, e.g. 'label', or 'span'.\n * @default 'label'\n */\n labelElementType?: \"label\" | \"span\" | \"div\";\n}\n\nexport interface LabelAria {\n /** Props to apply to the label container element. */\n labelProps: JSX.LabelHTMLAttributes<HTMLLabelElement> | JSX.HTMLAttributes<HTMLSpanElement>;\n /** Props to apply to the field container element being labeled. */\n fieldProps: AriaLabelingProps & DOMProps;\n}\n\n/**\n * Provides the accessibility implementation for labels and their associated elements.\n * Labels provide context for user inputs.\n *\n * @param props - The props for labels and fields.\n */\nexport function createLabel(props: MaybeAccessor<LabelAriaProps>): LabelAria {\n const getProps = () => access(props);\n\n const id = createId(getProps().id);\n const labelId = createId();\n\n const getLabelProps = (): LabelAria[\"labelProps\"] => {\n const { label, labelElementType = \"label\" } = getProps();\n\n if (!label) {\n return {};\n }\n\n return {\n id: labelId,\n ...(labelElementType === \"label\" ? { for: id } : {}),\n };\n };\n\n const getFieldProps = (): LabelAria[\"fieldProps\"] => {\n const { label, \"aria-labelledby\": ariaLabelledby, \"aria-label\": ariaLabel } = getProps();\n\n let labelledBy = ariaLabelledby;\n\n if (label) {\n labelledBy = ariaLabelledby ? `${labelId} ${ariaLabelledby}` : labelId;\n } else if (!ariaLabelledby && !ariaLabel && isDevEnv()) {\n console.warn(\n \"If you do not provide a visible label, you must specify an aria-label or aria-labelledby attribute for accessibility\",\n );\n }\n\n return createLabels({\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": labelledBy,\n });\n };\n\n return {\n get labelProps() {\n return getLabelProps();\n },\n get fieldProps() {\n return getFieldProps();\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAyDA,SAAgB,YAAY,OAAiD;CAC3E,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,KAAK,SAAS,SAAS,CAAC,CAAC,EAAE;CACjC,MAAM,UAAU,SAAS;CAEzB,MAAM,sBAA+C;EACnD,MAAM,EAAE,OAAO,mBAAmB,YAAY,SAAS;EAEvD,IAAI,CAAC,OACH,OAAO,CAAC;EAGV,OAAO;GACL,IAAI;GACJ,GAAI,qBAAqB,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;EACpD;CACF;CAEA,MAAM,sBAA+C;EACnD,MAAM,EAAE,OAAO,mBAAmB,gBAAgB,cAAc,cAAc,SAAS;EAEvF,IAAI,aAAa;EAEjB,IAAI,OACF,aAAa,iBAAiB,GAAG,QAAQ,GAAG,mBAAmB;OAC1D,IAAI,CAAC,kBAAkB,CAAC,aAAa,SAAS,GACnD,QAAQ,KACN,sHACF;EAGF,OAAO,aAAa;GAClB;GACA,cAAc;GACd,mBAAmB;EACrB,CAAC;CACH;CAEA,OAAO;EACL,IAAI,aAAa;GACf,OAAO,cAAc;EACvB;EACA,IAAI,aAAa;GACf,OAAO,cAAc;EACvB;CACF;AACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { i as access, t as isDevEnv } from "./env.jsx";
|
|
2
|
+
import { createId } from "../ssr/index.jsx";
|
|
3
|
+
import { t as createLabels } from "./createLabels.jsx";
|
|
4
|
+
//#region src/label/createLabel.ts
|
|
5
|
+
/**
|
|
6
|
+
* Provides the accessibility implementation for labels and their associated elements.
|
|
7
|
+
* Labels provide context for user inputs.
|
|
8
|
+
*
|
|
9
|
+
* @param props - The props for labels and fields.
|
|
10
|
+
*/
|
|
11
|
+
function createLabel(props) {
|
|
12
|
+
const getProps = () => access(props);
|
|
13
|
+
const id = createId(getProps().id);
|
|
14
|
+
const labelId = createId();
|
|
15
|
+
const getLabelProps = () => {
|
|
16
|
+
const { label, labelElementType = "label" } = getProps();
|
|
17
|
+
if (!label) return {};
|
|
18
|
+
return {
|
|
19
|
+
id: labelId,
|
|
20
|
+
...labelElementType === "label" ? { for: id } : {}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
const getFieldProps = () => {
|
|
24
|
+
const { label, "aria-labelledby": ariaLabelledby, "aria-label": ariaLabel } = getProps();
|
|
25
|
+
let labelledBy = ariaLabelledby;
|
|
26
|
+
if (label) labelledBy = ariaLabelledby ? `${labelId} ${ariaLabelledby}` : labelId;
|
|
27
|
+
else if (!ariaLabelledby && !ariaLabel && isDevEnv()) console.warn("If you do not provide a visible label, you must specify an aria-label or aria-labelledby attribute for accessibility");
|
|
28
|
+
return createLabels({
|
|
29
|
+
id,
|
|
30
|
+
"aria-label": ariaLabel,
|
|
31
|
+
"aria-labelledby": labelledBy
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
get labelProps() {
|
|
36
|
+
return getLabelProps();
|
|
37
|
+
},
|
|
38
|
+
get fieldProps() {
|
|
39
|
+
return getFieldProps();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { createLabel as t };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=createLabel.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLabel.jsx","names":[],"sources":["../../src/label/createLabel.ts"],"sourcesContent":["/**\n * Label hook for Solidaria\n *\n * Provides the accessibility implementation for labels and their associated elements.\n * Labels provide context for user inputs.\n *\n * This is a 1:1 port of @react-aria/label's useLabel hook.\n */\n\nimport { JSX } from \"solid-js\";\nimport { createId } from \"../ssr\";\nimport { createLabels } from \"./createLabels\";\nimport { type MaybeAccessor, access } from \"../utils/reactivity\";\nimport { isDevEnv } from \"../utils/env\";\n\nexport interface AriaLabelingProps {\n /** Defines a string value that labels the current element. */\n \"aria-label\"?: string;\n /** Identifies the element (or elements) that labels the current element. */\n \"aria-labelledby\"?: string;\n /** Identifies the element (or elements) that describes the object. */\n \"aria-describedby\"?: string;\n /** Identifies the element (or elements) that provide a detailed, extended description for the object. */\n \"aria-details\"?: string;\n}\n\nexport interface LabelableProps {\n /** The content to display as the label. */\n label?: JSX.Element;\n}\n\nexport interface DOMProps {\n /** The element's unique identifier. */\n id?: string;\n}\n\nexport interface LabelAriaProps extends LabelableProps, DOMProps, AriaLabelingProps {\n /**\n * The HTML element used to render the label, e.g. 'label', or 'span'.\n * @default 'label'\n */\n labelElementType?: \"label\" | \"span\" | \"div\";\n}\n\nexport interface LabelAria {\n /** Props to apply to the label container element. */\n labelProps: JSX.LabelHTMLAttributes<HTMLLabelElement> | JSX.HTMLAttributes<HTMLSpanElement>;\n /** Props to apply to the field container element being labeled. */\n fieldProps: AriaLabelingProps & DOMProps;\n}\n\n/**\n * Provides the accessibility implementation for labels and their associated elements.\n * Labels provide context for user inputs.\n *\n * @param props - The props for labels and fields.\n */\nexport function createLabel(props: MaybeAccessor<LabelAriaProps>): LabelAria {\n const getProps = () => access(props);\n\n const id = createId(getProps().id);\n const labelId = createId();\n\n const getLabelProps = (): LabelAria[\"labelProps\"] => {\n const { label, labelElementType = \"label\" } = getProps();\n\n if (!label) {\n return {};\n }\n\n return {\n id: labelId,\n ...(labelElementType === \"label\" ? { for: id } : {}),\n };\n };\n\n const getFieldProps = (): LabelAria[\"fieldProps\"] => {\n const { label, \"aria-labelledby\": ariaLabelledby, \"aria-label\": ariaLabel } = getProps();\n\n let labelledBy = ariaLabelledby;\n\n if (label) {\n labelledBy = ariaLabelledby ? `${labelId} ${ariaLabelledby}` : labelId;\n } else if (!ariaLabelledby && !ariaLabel && isDevEnv()) {\n console.warn(\n \"If you do not provide a visible label, you must specify an aria-label or aria-labelledby attribute for accessibility\",\n );\n }\n\n return createLabels({\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": labelledBy,\n });\n };\n\n return {\n get labelProps() {\n return getLabelProps();\n },\n get fieldProps() {\n return getFieldProps();\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAyDA,SAAgB,YAAY,OAAiD;CAC3E,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,KAAK,SAAS,SAAS,CAAC,CAAC,EAAE;CACjC,MAAM,UAAU,SAAS;CAEzB,MAAM,sBAA+C;EACnD,MAAM,EAAE,OAAO,mBAAmB,YAAY,SAAS;EAEvD,IAAI,CAAC,OACH,OAAO,CAAC;EAGV,OAAO;GACL,IAAI;GACJ,GAAI,qBAAqB,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;EACpD;CACF;CAEA,MAAM,sBAA+C;EACnD,MAAM,EAAE,OAAO,mBAAmB,gBAAgB,cAAc,cAAc,SAAS;EAEvF,IAAI,aAAa;EAEjB,IAAI,OACF,aAAa,iBAAiB,GAAG,QAAQ,GAAG,mBAAmB;OAC1D,IAAI,CAAC,kBAAkB,CAAC,aAAa,SAAS,GACnD,QAAQ,KACN,sHACF;EAGF,OAAO,aAAa;GAClB;GACA,cAAc;GACd,mBAAmB;EACrB,CAAC;CACH;CAEA,OAAO;EACL,IAAI,aAAa;GACf,OAAO,cAAc;EACvB;EACA,IAAI,aAAa;GACf,OAAO,cAAc;EACvB;CACF;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createId } from "../ssr/index.js";
|
|
2
|
+
//#region src/label/createLabels.ts
|
|
3
|
+
/**
|
|
4
|
+
* Labels utility for Solidaria
|
|
5
|
+
*
|
|
6
|
+
* Merges aria-label and aria-labelledby into aria-labelledby when both exist.
|
|
7
|
+
*
|
|
8
|
+
* This is a 1:1 port of @react-aria/utils's useLabels hook.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Merges aria-label and aria-labelledby into aria-labelledby when both exist.
|
|
12
|
+
*
|
|
13
|
+
* @param props - Aria label props.
|
|
14
|
+
* @param defaultLabel - Default value for aria-label when not present.
|
|
15
|
+
*/
|
|
16
|
+
function createLabels(props, defaultLabel) {
|
|
17
|
+
let { id, "aria-label": label, "aria-labelledby": labelledBy } = props;
|
|
18
|
+
id = createId(id);
|
|
19
|
+
if (labelledBy && label) labelledBy = [...new Set([id, ...labelledBy.trim().split(/\s+/)])].join(" ");
|
|
20
|
+
else if (labelledBy) labelledBy = labelledBy.trim().split(/\s+/).join(" ");
|
|
21
|
+
if (!label && !labelledBy && defaultLabel) label = defaultLabel;
|
|
22
|
+
return {
|
|
23
|
+
id,
|
|
24
|
+
"aria-label": label,
|
|
25
|
+
"aria-labelledby": labelledBy
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { createLabels as t };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=createLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLabels.js","names":[],"sources":["../../src/label/createLabels.ts"],"sourcesContent":["/**\n * Labels utility for Solidaria\n *\n * Merges aria-label and aria-labelledby into aria-labelledby when both exist.\n *\n * This is a 1:1 port of @react-aria/utils's useLabels hook.\n */\n\nimport { createId } from \"../ssr\";\nimport type { AriaLabelingProps, DOMProps } from \"./createLabel\";\n\n/**\n * Merges aria-label and aria-labelledby into aria-labelledby when both exist.\n *\n * @param props - Aria label props.\n * @param defaultLabel - Default value for aria-label when not present.\n */\nexport function createLabels(\n props: DOMProps & AriaLabelingProps,\n defaultLabel?: string,\n): DOMProps & AriaLabelingProps {\n let { id, \"aria-label\": label, \"aria-labelledby\": labelledBy } = props;\n\n // Generate an ID if not provided\n id = createId(id);\n\n // If there is both an aria-label and aria-labelledby,\n // combine them by pointing to the element itself.\n if (labelledBy && label) {\n const ids = new Set([id, ...labelledBy.trim().split(/\\s+/)]);\n labelledBy = [...ids].join(\" \");\n } else if (labelledBy) {\n labelledBy = labelledBy.trim().split(/\\s+/).join(\" \");\n }\n\n // If no labels are provided, use the default\n if (!label && !labelledBy && defaultLabel) {\n label = defaultLabel;\n }\n\n return {\n id,\n \"aria-label\": label,\n \"aria-labelledby\": labelledBy,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,SAAgB,aACd,OACA,cAC8B;CAC9B,IAAI,EAAE,IAAI,cAAc,OAAO,mBAAmB,eAAe;CAGjE,KAAK,SAAS,EAAE;CAIhB,IAAI,cAAc,OAEhB,aAAa,CAAC,GAAG,IADD,IAAI,CAAC,IAAI,GAAG,WAAW,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CACvC,CAAC,CAAC,CAAC,KAAK,GAAG;MACzB,IAAI,YACT,aAAa,WAAW,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG;CAItD,IAAI,CAAC,SAAS,CAAC,cAAc,cAC3B,QAAQ;CAGV,OAAO;EACL;EACA,cAAc;EACd,mBAAmB;CACrB;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createId } from "../ssr/index.jsx";
|
|
2
|
+
//#region src/label/createLabels.ts
|
|
3
|
+
/**
|
|
4
|
+
* Labels utility for Solidaria
|
|
5
|
+
*
|
|
6
|
+
* Merges aria-label and aria-labelledby into aria-labelledby when both exist.
|
|
7
|
+
*
|
|
8
|
+
* This is a 1:1 port of @react-aria/utils's useLabels hook.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Merges aria-label and aria-labelledby into aria-labelledby when both exist.
|
|
12
|
+
*
|
|
13
|
+
* @param props - Aria label props.
|
|
14
|
+
* @param defaultLabel - Default value for aria-label when not present.
|
|
15
|
+
*/
|
|
16
|
+
function createLabels(props, defaultLabel) {
|
|
17
|
+
let { id, "aria-label": label, "aria-labelledby": labelledBy } = props;
|
|
18
|
+
id = createId(id);
|
|
19
|
+
if (labelledBy && label) labelledBy = [...new Set([id, ...labelledBy.trim().split(/\s+/)])].join(" ");
|
|
20
|
+
else if (labelledBy) labelledBy = labelledBy.trim().split(/\s+/).join(" ");
|
|
21
|
+
if (!label && !labelledBy && defaultLabel) label = defaultLabel;
|
|
22
|
+
return {
|
|
23
|
+
id,
|
|
24
|
+
"aria-label": label,
|
|
25
|
+
"aria-labelledby": labelledBy
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { createLabels as t };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=createLabels.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLabels.jsx","names":[],"sources":["../../src/label/createLabels.ts"],"sourcesContent":["/**\n * Labels utility for Solidaria\n *\n * Merges aria-label and aria-labelledby into aria-labelledby when both exist.\n *\n * This is a 1:1 port of @react-aria/utils's useLabels hook.\n */\n\nimport { createId } from \"../ssr\";\nimport type { AriaLabelingProps, DOMProps } from \"./createLabel\";\n\n/**\n * Merges aria-label and aria-labelledby into aria-labelledby when both exist.\n *\n * @param props - Aria label props.\n * @param defaultLabel - Default value for aria-label when not present.\n */\nexport function createLabels(\n props: DOMProps & AriaLabelingProps,\n defaultLabel?: string,\n): DOMProps & AriaLabelingProps {\n let { id, \"aria-label\": label, \"aria-labelledby\": labelledBy } = props;\n\n // Generate an ID if not provided\n id = createId(id);\n\n // If there is both an aria-label and aria-labelledby,\n // combine them by pointing to the element itself.\n if (labelledBy && label) {\n const ids = new Set([id, ...labelledBy.trim().split(/\\s+/)]);\n labelledBy = [...ids].join(\" \");\n } else if (labelledBy) {\n labelledBy = labelledBy.trim().split(/\\s+/).join(\" \");\n }\n\n // If no labels are provided, use the default\n if (!label && !labelledBy && defaultLabel) {\n label = defaultLabel;\n }\n\n return {\n id,\n \"aria-label\": label,\n \"aria-labelledby\": labelledBy,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,SAAgB,aACd,OACA,cAC8B;CAC9B,IAAI,EAAE,IAAI,cAAc,OAAO,mBAAmB,eAAe;CAGjE,KAAK,SAAS,EAAE;CAIhB,IAAI,cAAc,OAEhB,aAAa,CAAC,GAAG,IADD,IAAI,CAAC,IAAI,GAAG,WAAW,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CACvC,CAAC,CAAC,CAAC,KAAK,GAAG;MACzB,IAAI,YACT,aAAa,WAAW,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG;CAItD,IAAI,CAAC,SAAS,CAAC,cAAc,cAC3B,QAAQ;CAGV,OAAO;EACL;EACA,cAAc;EACd,mBAAmB;CACrB;AACF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { i as access } from "./env.js";
|
|
2
|
+
import { t as filterDOMProps } from "./filterDOMProps.js";
|
|
3
|
+
import { createEffect, onCleanup } from "solid-js";
|
|
4
|
+
//#region src/landmark/createLandmark.ts
|
|
5
|
+
/**
|
|
6
|
+
* Manages all registered landmarks and handles F6 keyboard navigation.
|
|
7
|
+
*/
|
|
8
|
+
var LandmarkManager = class {
|
|
9
|
+
landmarks = [];
|
|
10
|
+
currentIndex = -1;
|
|
11
|
+
listening = false;
|
|
12
|
+
constructor() {
|
|
13
|
+
if (typeof window !== "undefined") this.startListening();
|
|
14
|
+
}
|
|
15
|
+
startListening() {
|
|
16
|
+
if (this.listening) return;
|
|
17
|
+
this.listening = true;
|
|
18
|
+
window.addEventListener("keydown", this.handleKeyDown.bind(this), true);
|
|
19
|
+
}
|
|
20
|
+
handleKeyDown(event) {
|
|
21
|
+
if (event.key === "F6") {
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
if (event.shiftKey) this.focusPrevious();
|
|
24
|
+
else this.focusNext();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
register(entry) {
|
|
28
|
+
const index = this.findInsertionIndex(entry.ref);
|
|
29
|
+
this.landmarks.splice(index, 0, entry);
|
|
30
|
+
this.validateLabels();
|
|
31
|
+
}
|
|
32
|
+
unregister(ref) {
|
|
33
|
+
const index = this.landmarks.findIndex((l) => l.ref === ref);
|
|
34
|
+
if (index !== -1) {
|
|
35
|
+
this.landmarks.splice(index, 1);
|
|
36
|
+
if (this.currentIndex >= this.landmarks.length) this.currentIndex = this.landmarks.length - 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
findInsertionIndex(ref) {
|
|
40
|
+
let low = 0;
|
|
41
|
+
let high = this.landmarks.length;
|
|
42
|
+
while (low < high) {
|
|
43
|
+
const mid = Math.floor((low + high) / 2);
|
|
44
|
+
if (this.landmarks[mid].ref.compareDocumentPosition(ref) & Node.DOCUMENT_POSITION_FOLLOWING) low = mid + 1;
|
|
45
|
+
else high = mid;
|
|
46
|
+
}
|
|
47
|
+
return low;
|
|
48
|
+
}
|
|
49
|
+
validateLabels() {
|
|
50
|
+
const roleGroups = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const landmark of this.landmarks) {
|
|
52
|
+
const group = roleGroups.get(landmark.role) || [];
|
|
53
|
+
group.push(landmark);
|
|
54
|
+
roleGroups.set(landmark.role, group);
|
|
55
|
+
}
|
|
56
|
+
for (const [role, group] of roleGroups) if (group.length > 1) {
|
|
57
|
+
const labels = group.map((l) => l.label);
|
|
58
|
+
if (new Set(labels.filter(Boolean)).size < group.length) console.warn(`Multiple landmarks with role "${role}" exist. Each should have a unique aria-label or aria-labelledby.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
focusNext() {
|
|
62
|
+
if (this.landmarks.length === 0) return;
|
|
63
|
+
const activeElement = document.activeElement;
|
|
64
|
+
this.currentIndex = this.findCurrentLandmarkIndex(activeElement);
|
|
65
|
+
this.currentIndex = (this.currentIndex + 1) % this.landmarks.length;
|
|
66
|
+
this.focusLandmark(this.landmarks[this.currentIndex]);
|
|
67
|
+
}
|
|
68
|
+
focusPrevious() {
|
|
69
|
+
if (this.landmarks.length === 0) return;
|
|
70
|
+
const activeElement = document.activeElement;
|
|
71
|
+
this.currentIndex = this.findCurrentLandmarkIndex(activeElement);
|
|
72
|
+
this.currentIndex = (this.currentIndex - 1 + this.landmarks.length) % this.landmarks.length;
|
|
73
|
+
this.focusLandmark(this.landmarks[this.currentIndex]);
|
|
74
|
+
}
|
|
75
|
+
focusMain() {
|
|
76
|
+
const main = this.landmarks.find((l) => l.role === "main");
|
|
77
|
+
if (main) this.focusLandmark(main);
|
|
78
|
+
}
|
|
79
|
+
navigate(role) {
|
|
80
|
+
const landmark = this.landmarks.find((l) => l.role === role);
|
|
81
|
+
if (landmark) this.focusLandmark(landmark);
|
|
82
|
+
}
|
|
83
|
+
findCurrentLandmarkIndex(activeElement) {
|
|
84
|
+
if (!activeElement) return -1;
|
|
85
|
+
for (let i = 0; i < this.landmarks.length; i++) if (this.landmarks[i].ref.contains(activeElement)) {
|
|
86
|
+
if (activeElement instanceof HTMLElement) this.landmarks[i].lastFocused = activeElement;
|
|
87
|
+
return i;
|
|
88
|
+
}
|
|
89
|
+
return -1;
|
|
90
|
+
}
|
|
91
|
+
focusLandmark(landmark) {
|
|
92
|
+
if (landmark.focus) {
|
|
93
|
+
landmark.focus();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (landmark.lastFocused && landmark.ref.contains(landmark.lastFocused)) {
|
|
97
|
+
landmark.lastFocused.focus();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const focusable = this.findFirstFocusable(landmark.ref);
|
|
101
|
+
if (focusable) {
|
|
102
|
+
focusable.focus();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!landmark.ref.hasAttribute("tabindex")) landmark.ref.setAttribute("tabindex", "-1");
|
|
106
|
+
landmark.ref.focus();
|
|
107
|
+
}
|
|
108
|
+
findFirstFocusable(container) {
|
|
109
|
+
const focusableSelectors = [
|
|
110
|
+
"a[href]",
|
|
111
|
+
"button:not([disabled])",
|
|
112
|
+
"input:not([disabled])",
|
|
113
|
+
"select:not([disabled])",
|
|
114
|
+
"textarea:not([disabled])",
|
|
115
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
116
|
+
].join(", ");
|
|
117
|
+
return container.querySelector(focusableSelectors);
|
|
118
|
+
}
|
|
119
|
+
getController() {
|
|
120
|
+
return {
|
|
121
|
+
focusNext: () => this.focusNext(),
|
|
122
|
+
focusPrevious: () => this.focusPrevious(),
|
|
123
|
+
focusMain: () => this.focusMain(),
|
|
124
|
+
navigate: (role) => this.navigate(role)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
let landmarkManager = null;
|
|
129
|
+
function getLandmarkManager() {
|
|
130
|
+
if (!landmarkManager) landmarkManager = new LandmarkManager();
|
|
131
|
+
return landmarkManager;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Provides landmark navigation in an application.
|
|
135
|
+
* Call this with a role and label to register a landmark navigable with F6.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```tsx
|
|
139
|
+
* function Navigation(props) {
|
|
140
|
+
* let ref: HTMLElement;
|
|
141
|
+
* const { landmarkProps } = createLandmark({
|
|
142
|
+
* role: 'navigation',
|
|
143
|
+
* 'aria-label': 'Main navigation'
|
|
144
|
+
* });
|
|
145
|
+
*
|
|
146
|
+
* return (
|
|
147
|
+
* <nav {...landmarkProps} ref={ref}>
|
|
148
|
+
* {props.children}
|
|
149
|
+
* </nav>
|
|
150
|
+
* );
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
function createLandmark(props, ref) {
|
|
155
|
+
createEffect(() => {
|
|
156
|
+
const element = ref();
|
|
157
|
+
if (!element) return;
|
|
158
|
+
const p = access(props);
|
|
159
|
+
const entry = {
|
|
160
|
+
ref: element,
|
|
161
|
+
role: p.role,
|
|
162
|
+
label: p["aria-label"],
|
|
163
|
+
focus: p.focus
|
|
164
|
+
};
|
|
165
|
+
const manager = getLandmarkManager();
|
|
166
|
+
manager.register(entry);
|
|
167
|
+
onCleanup(() => {
|
|
168
|
+
manager.unregister(element);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
const getLandmarkProps = () => {
|
|
172
|
+
const p = access(props);
|
|
173
|
+
return {
|
|
174
|
+
...filterDOMProps(p, { labelable: true }),
|
|
175
|
+
role: p.role
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
return { get landmarkProps() {
|
|
179
|
+
return getLandmarkProps();
|
|
180
|
+
} };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Returns a controller for programmatic landmark navigation.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```tsx
|
|
187
|
+
* const controller = getLandmarkController();
|
|
188
|
+
* controller.focusMain(); // Focus the main landmark
|
|
189
|
+
* controller.focusNext(); // Focus the next landmark
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
function getLandmarkController() {
|
|
193
|
+
return getLandmarkManager().getController();
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
export { getLandmarkController as n, createLandmark as t };
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=createLandmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLandmark.js","names":[],"sources":["../../src/landmark/createLandmark.ts"],"sourcesContent":["/**\n * createLandmark - SolidJS implementation of React Aria's useLandmark\n *\n * Provides landmark navigation in an application. Call this with a role and label\n * to register a landmark navigable with the F6 key.\n *\n * ARIA landmarks help screen reader users navigate between major sections of a page.\n * The F6 key (or Shift+F6) cycles through all registered landmarks.\n */\n\nimport type { JSX, Accessor } from \"solid-js\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { access, type MaybeAccessor } from \"../utils\";\nimport { filterDOMProps } from \"../utils\";\n\n/** ARIA landmark roles */\nexport type AriaLandmarkRole =\n | \"main\"\n | \"region\"\n | \"search\"\n | \"navigation\"\n | \"form\"\n | \"banner\"\n | \"contentinfo\"\n | \"complementary\";\n\nexport interface AriaLandmarkProps {\n /** The ARIA landmark role. */\n role: AriaLandmarkRole;\n /**\n * A human-readable label for the landmark.\n * Required when multiple landmarks with the same role exist on a page.\n */\n \"aria-label\"?: string;\n /** Identifies the element(s) that labels the landmark. */\n \"aria-labelledby\"?: string;\n /** The element's unique identifier. */\n id?: string;\n /**\n * A custom focus handler called when this landmark receives focus via F6 navigation.\n * Use this to focus a specific element within the landmark instead of the container.\n */\n focus?: () => void;\n}\n\nexport interface LandmarkAria<T extends HTMLElement = HTMLElement> {\n /** Props to spread on the landmark element. */\n landmarkProps: JSX.HTMLAttributes<T>;\n}\n\nexport interface LandmarkController {\n /** Focus the next landmark in DOM order. */\n focusNext: () => void;\n /** Focus the previous landmark in DOM order. */\n focusPrevious: () => void;\n /** Focus the main landmark. */\n focusMain: () => void;\n /** Navigate to a specific landmark by role. If multiple exist, the first one is focused. */\n navigate: (role: AriaLandmarkRole) => void;\n}\n\ninterface LandmarkEntry {\n ref: HTMLElement;\n role: AriaLandmarkRole;\n label?: string;\n focus?: () => void;\n lastFocused?: HTMLElement;\n}\n\n/**\n * Manages all registered landmarks and handles F6 keyboard navigation.\n */\nclass LandmarkManager {\n private landmarks: LandmarkEntry[] = [];\n private currentIndex = -1;\n private listening = false;\n\n constructor() {\n if (typeof window !== \"undefined\") {\n this.startListening();\n }\n }\n\n private startListening() {\n if (this.listening) return;\n this.listening = true;\n\n window.addEventListener(\"keydown\", this.handleKeyDown.bind(this), true);\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n // F6 to navigate landmarks\n if (event.key === \"F6\") {\n event.preventDefault();\n if (event.shiftKey) {\n this.focusPrevious();\n } else {\n this.focusNext();\n }\n }\n }\n\n register(entry: LandmarkEntry): void {\n // Insert in DOM order using compareDocumentPosition\n const index = this.findInsertionIndex(entry.ref);\n this.landmarks.splice(index, 0, entry);\n\n // Validate: if multiple landmarks have the same role, they should have different labels\n this.validateLabels();\n }\n\n unregister(ref: HTMLElement): void {\n const index = this.landmarks.findIndex((l) => l.ref === ref);\n if (index !== -1) {\n this.landmarks.splice(index, 1);\n // Adjust currentIndex if needed\n if (this.currentIndex >= this.landmarks.length) {\n this.currentIndex = this.landmarks.length - 1;\n }\n }\n }\n\n private findInsertionIndex(ref: HTMLElement): number {\n // Binary search for insertion point based on DOM order\n let low = 0;\n let high = this.landmarks.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n const comparison = this.landmarks[mid].ref.compareDocumentPosition(ref);\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4\n if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return low;\n }\n\n private validateLabels(): void {\n // Group landmarks by role\n const roleGroups = new Map<AriaLandmarkRole, LandmarkEntry[]>();\n for (const landmark of this.landmarks) {\n const group = roleGroups.get(landmark.role) || [];\n group.push(landmark);\n roleGroups.set(landmark.role, group);\n }\n\n // Warn if multiple landmarks with the same role lack unique labels\n for (const [role, group] of roleGroups) {\n if (group.length > 1) {\n const labels = group.map((l) => l.label);\n const uniqueLabels = new Set(labels.filter(Boolean));\n if (uniqueLabels.size < group.length) {\n console.warn(\n `Multiple landmarks with role \"${role}\" exist. Each should have a unique aria-label or aria-labelledby.`,\n );\n }\n }\n }\n }\n\n focusNext(): void {\n if (this.landmarks.length === 0) return;\n\n // Find the currently focused landmark\n const activeElement = document.activeElement;\n this.currentIndex = this.findCurrentLandmarkIndex(activeElement);\n\n // Move to next\n this.currentIndex = (this.currentIndex + 1) % this.landmarks.length;\n this.focusLandmark(this.landmarks[this.currentIndex]);\n }\n\n focusPrevious(): void {\n if (this.landmarks.length === 0) return;\n\n // Find the currently focused landmark\n const activeElement = document.activeElement;\n this.currentIndex = this.findCurrentLandmarkIndex(activeElement);\n\n // Move to previous\n this.currentIndex = (this.currentIndex - 1 + this.landmarks.length) % this.landmarks.length;\n this.focusLandmark(this.landmarks[this.currentIndex]);\n }\n\n focusMain(): void {\n const main = this.landmarks.find((l) => l.role === \"main\");\n if (main) {\n this.focusLandmark(main);\n }\n }\n\n navigate(role: AriaLandmarkRole): void {\n const landmark = this.landmarks.find((l) => l.role === role);\n if (landmark) {\n this.focusLandmark(landmark);\n }\n }\n\n private findCurrentLandmarkIndex(activeElement: Element | null): number {\n if (!activeElement) return -1;\n\n // Check if active element is within any landmark\n for (let i = 0; i < this.landmarks.length; i++) {\n if (this.landmarks[i].ref.contains(activeElement)) {\n // Store the last focused element for this landmark\n if (activeElement instanceof HTMLElement) {\n this.landmarks[i].lastFocused = activeElement;\n }\n return i;\n }\n }\n\n return -1;\n }\n\n private focusLandmark(landmark: LandmarkEntry): void {\n // If a custom focus handler is provided, use it\n if (landmark.focus) {\n landmark.focus();\n return;\n }\n\n // If we previously focused an element in this landmark, try to restore it\n if (landmark.lastFocused && landmark.ref.contains(landmark.lastFocused)) {\n landmark.lastFocused.focus();\n return;\n }\n\n // Try to find the first focusable element\n const focusable = this.findFirstFocusable(landmark.ref);\n if (focusable) {\n focusable.focus();\n return;\n }\n\n // Fallback: make the landmark itself focusable and focus it\n if (!landmark.ref.hasAttribute(\"tabindex\")) {\n landmark.ref.setAttribute(\"tabindex\", \"-1\");\n }\n landmark.ref.focus();\n }\n\n private findFirstFocusable(container: HTMLElement): HTMLElement | null {\n const focusableSelectors = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(\", \");\n\n return container.querySelector<HTMLElement>(focusableSelectors);\n }\n\n getController(): LandmarkController {\n return {\n focusNext: () => this.focusNext(),\n focusPrevious: () => this.focusPrevious(),\n focusMain: () => this.focusMain(),\n navigate: (role) => this.navigate(role),\n };\n }\n}\n\n// Global singleton instance\nlet landmarkManager: LandmarkManager | null = null;\n\nfunction getLandmarkManager(): LandmarkManager {\n if (!landmarkManager) {\n landmarkManager = new LandmarkManager();\n }\n return landmarkManager;\n}\n\n/**\n * Provides landmark navigation in an application.\n * Call this with a role and label to register a landmark navigable with F6.\n *\n * @example\n * ```tsx\n * function Navigation(props) {\n * let ref: HTMLElement;\n * const { landmarkProps } = createLandmark({\n * role: 'navigation',\n * 'aria-label': 'Main navigation'\n * });\n *\n * return (\n * <nav {...landmarkProps} ref={ref}>\n * {props.children}\n * </nav>\n * );\n * }\n * ```\n */\nexport function createLandmark<T extends HTMLElement = HTMLElement>(\n props: MaybeAccessor<AriaLandmarkProps>,\n ref: Accessor<T | undefined>,\n): LandmarkAria<T> {\n // Register with the landmark manager\n createEffect(() => {\n const element = ref();\n if (!element) return;\n\n const p = access(props);\n const entry: LandmarkEntry = {\n ref: element,\n role: p.role,\n label: p[\"aria-label\"],\n focus: p.focus,\n };\n\n const manager = getLandmarkManager();\n manager.register(entry);\n\n onCleanup(() => {\n manager.unregister(element);\n });\n });\n\n const getLandmarkProps = (): JSX.HTMLAttributes<T> => {\n const p = access(props);\n const domProps = filterDOMProps(p as unknown as Record<string, unknown>, { labelable: true });\n\n return {\n ...domProps,\n role: p.role,\n };\n };\n\n return {\n get landmarkProps() {\n return getLandmarkProps();\n },\n };\n}\n\n/**\n * Returns a controller for programmatic landmark navigation.\n *\n * @example\n * ```tsx\n * const controller = getLandmarkController();\n * controller.focusMain(); // Focus the main landmark\n * controller.focusNext(); // Focus the next landmark\n * ```\n */\nexport function getLandmarkController(): LandmarkController {\n return getLandmarkManager().getController();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { i as access } from "./env.jsx";
|
|
2
|
+
import { t as filterDOMProps } from "./filterDOMProps.jsx";
|
|
3
|
+
import { createEffect, onCleanup } from "solid-js";
|
|
4
|
+
//#region src/landmark/createLandmark.ts
|
|
5
|
+
/**
|
|
6
|
+
* Manages all registered landmarks and handles F6 keyboard navigation.
|
|
7
|
+
*/
|
|
8
|
+
var LandmarkManager = class {
|
|
9
|
+
landmarks = [];
|
|
10
|
+
currentIndex = -1;
|
|
11
|
+
listening = false;
|
|
12
|
+
constructor() {
|
|
13
|
+
if (typeof window !== "undefined") this.startListening();
|
|
14
|
+
}
|
|
15
|
+
startListening() {
|
|
16
|
+
if (this.listening) return;
|
|
17
|
+
this.listening = true;
|
|
18
|
+
window.addEventListener("keydown", this.handleKeyDown.bind(this), true);
|
|
19
|
+
}
|
|
20
|
+
handleKeyDown(event) {
|
|
21
|
+
if (event.key === "F6") {
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
if (event.shiftKey) this.focusPrevious();
|
|
24
|
+
else this.focusNext();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
register(entry) {
|
|
28
|
+
const index = this.findInsertionIndex(entry.ref);
|
|
29
|
+
this.landmarks.splice(index, 0, entry);
|
|
30
|
+
this.validateLabels();
|
|
31
|
+
}
|
|
32
|
+
unregister(ref) {
|
|
33
|
+
const index = this.landmarks.findIndex((l) => l.ref === ref);
|
|
34
|
+
if (index !== -1) {
|
|
35
|
+
this.landmarks.splice(index, 1);
|
|
36
|
+
if (this.currentIndex >= this.landmarks.length) this.currentIndex = this.landmarks.length - 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
findInsertionIndex(ref) {
|
|
40
|
+
let low = 0;
|
|
41
|
+
let high = this.landmarks.length;
|
|
42
|
+
while (low < high) {
|
|
43
|
+
const mid = Math.floor((low + high) / 2);
|
|
44
|
+
if (this.landmarks[mid].ref.compareDocumentPosition(ref) & Node.DOCUMENT_POSITION_FOLLOWING) low = mid + 1;
|
|
45
|
+
else high = mid;
|
|
46
|
+
}
|
|
47
|
+
return low;
|
|
48
|
+
}
|
|
49
|
+
validateLabels() {
|
|
50
|
+
const roleGroups = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const landmark of this.landmarks) {
|
|
52
|
+
const group = roleGroups.get(landmark.role) || [];
|
|
53
|
+
group.push(landmark);
|
|
54
|
+
roleGroups.set(landmark.role, group);
|
|
55
|
+
}
|
|
56
|
+
for (const [role, group] of roleGroups) if (group.length > 1) {
|
|
57
|
+
const labels = group.map((l) => l.label);
|
|
58
|
+
if (new Set(labels.filter(Boolean)).size < group.length) console.warn(`Multiple landmarks with role "${role}" exist. Each should have a unique aria-label or aria-labelledby.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
focusNext() {
|
|
62
|
+
if (this.landmarks.length === 0) return;
|
|
63
|
+
const activeElement = document.activeElement;
|
|
64
|
+
this.currentIndex = this.findCurrentLandmarkIndex(activeElement);
|
|
65
|
+
this.currentIndex = (this.currentIndex + 1) % this.landmarks.length;
|
|
66
|
+
this.focusLandmark(this.landmarks[this.currentIndex]);
|
|
67
|
+
}
|
|
68
|
+
focusPrevious() {
|
|
69
|
+
if (this.landmarks.length === 0) return;
|
|
70
|
+
const activeElement = document.activeElement;
|
|
71
|
+
this.currentIndex = this.findCurrentLandmarkIndex(activeElement);
|
|
72
|
+
this.currentIndex = (this.currentIndex - 1 + this.landmarks.length) % this.landmarks.length;
|
|
73
|
+
this.focusLandmark(this.landmarks[this.currentIndex]);
|
|
74
|
+
}
|
|
75
|
+
focusMain() {
|
|
76
|
+
const main = this.landmarks.find((l) => l.role === "main");
|
|
77
|
+
if (main) this.focusLandmark(main);
|
|
78
|
+
}
|
|
79
|
+
navigate(role) {
|
|
80
|
+
const landmark = this.landmarks.find((l) => l.role === role);
|
|
81
|
+
if (landmark) this.focusLandmark(landmark);
|
|
82
|
+
}
|
|
83
|
+
findCurrentLandmarkIndex(activeElement) {
|
|
84
|
+
if (!activeElement) return -1;
|
|
85
|
+
for (let i = 0; i < this.landmarks.length; i++) if (this.landmarks[i].ref.contains(activeElement)) {
|
|
86
|
+
if (activeElement instanceof HTMLElement) this.landmarks[i].lastFocused = activeElement;
|
|
87
|
+
return i;
|
|
88
|
+
}
|
|
89
|
+
return -1;
|
|
90
|
+
}
|
|
91
|
+
focusLandmark(landmark) {
|
|
92
|
+
if (landmark.focus) {
|
|
93
|
+
landmark.focus();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (landmark.lastFocused && landmark.ref.contains(landmark.lastFocused)) {
|
|
97
|
+
landmark.lastFocused.focus();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const focusable = this.findFirstFocusable(landmark.ref);
|
|
101
|
+
if (focusable) {
|
|
102
|
+
focusable.focus();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!landmark.ref.hasAttribute("tabindex")) landmark.ref.setAttribute("tabindex", "-1");
|
|
106
|
+
landmark.ref.focus();
|
|
107
|
+
}
|
|
108
|
+
findFirstFocusable(container) {
|
|
109
|
+
const focusableSelectors = [
|
|
110
|
+
"a[href]",
|
|
111
|
+
"button:not([disabled])",
|
|
112
|
+
"input:not([disabled])",
|
|
113
|
+
"select:not([disabled])",
|
|
114
|
+
"textarea:not([disabled])",
|
|
115
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
116
|
+
].join(", ");
|
|
117
|
+
return container.querySelector(focusableSelectors);
|
|
118
|
+
}
|
|
119
|
+
getController() {
|
|
120
|
+
return {
|
|
121
|
+
focusNext: () => this.focusNext(),
|
|
122
|
+
focusPrevious: () => this.focusPrevious(),
|
|
123
|
+
focusMain: () => this.focusMain(),
|
|
124
|
+
navigate: (role) => this.navigate(role)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
let landmarkManager = null;
|
|
129
|
+
function getLandmarkManager() {
|
|
130
|
+
if (!landmarkManager) landmarkManager = new LandmarkManager();
|
|
131
|
+
return landmarkManager;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Provides landmark navigation in an application.
|
|
135
|
+
* Call this with a role and label to register a landmark navigable with F6.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```tsx
|
|
139
|
+
* function Navigation(props) {
|
|
140
|
+
* let ref: HTMLElement;
|
|
141
|
+
* const { landmarkProps } = createLandmark({
|
|
142
|
+
* role: 'navigation',
|
|
143
|
+
* 'aria-label': 'Main navigation'
|
|
144
|
+
* });
|
|
145
|
+
*
|
|
146
|
+
* return (
|
|
147
|
+
* <nav {...landmarkProps} ref={ref}>
|
|
148
|
+
* {props.children}
|
|
149
|
+
* </nav>
|
|
150
|
+
* );
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
function createLandmark(props, ref) {
|
|
155
|
+
createEffect(() => {
|
|
156
|
+
const element = ref();
|
|
157
|
+
if (!element) return;
|
|
158
|
+
const p = access(props);
|
|
159
|
+
const entry = {
|
|
160
|
+
ref: element,
|
|
161
|
+
role: p.role,
|
|
162
|
+
label: p["aria-label"],
|
|
163
|
+
focus: p.focus
|
|
164
|
+
};
|
|
165
|
+
const manager = getLandmarkManager();
|
|
166
|
+
manager.register(entry);
|
|
167
|
+
onCleanup(() => {
|
|
168
|
+
manager.unregister(element);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
const getLandmarkProps = () => {
|
|
172
|
+
const p = access(props);
|
|
173
|
+
return {
|
|
174
|
+
...filterDOMProps(p, { labelable: true }),
|
|
175
|
+
role: p.role
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
return { get landmarkProps() {
|
|
179
|
+
return getLandmarkProps();
|
|
180
|
+
} };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Returns a controller for programmatic landmark navigation.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```tsx
|
|
187
|
+
* const controller = getLandmarkController();
|
|
188
|
+
* controller.focusMain(); // Focus the main landmark
|
|
189
|
+
* controller.focusNext(); // Focus the next landmark
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
function getLandmarkController() {
|
|
193
|
+
return getLandmarkManager().getController();
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
export { getLandmarkController as n, createLandmark as t };
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=createLandmark.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLandmark.jsx","names":[],"sources":["../../src/landmark/createLandmark.ts"],"sourcesContent":["/**\n * createLandmark - SolidJS implementation of React Aria's useLandmark\n *\n * Provides landmark navigation in an application. Call this with a role and label\n * to register a landmark navigable with the F6 key.\n *\n * ARIA landmarks help screen reader users navigate between major sections of a page.\n * The F6 key (or Shift+F6) cycles through all registered landmarks.\n */\n\nimport type { JSX, Accessor } from \"solid-js\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { access, type MaybeAccessor } from \"../utils\";\nimport { filterDOMProps } from \"../utils\";\n\n/** ARIA landmark roles */\nexport type AriaLandmarkRole =\n | \"main\"\n | \"region\"\n | \"search\"\n | \"navigation\"\n | \"form\"\n | \"banner\"\n | \"contentinfo\"\n | \"complementary\";\n\nexport interface AriaLandmarkProps {\n /** The ARIA landmark role. */\n role: AriaLandmarkRole;\n /**\n * A human-readable label for the landmark.\n * Required when multiple landmarks with the same role exist on a page.\n */\n \"aria-label\"?: string;\n /** Identifies the element(s) that labels the landmark. */\n \"aria-labelledby\"?: string;\n /** The element's unique identifier. */\n id?: string;\n /**\n * A custom focus handler called when this landmark receives focus via F6 navigation.\n * Use this to focus a specific element within the landmark instead of the container.\n */\n focus?: () => void;\n}\n\nexport interface LandmarkAria<T extends HTMLElement = HTMLElement> {\n /** Props to spread on the landmark element. */\n landmarkProps: JSX.HTMLAttributes<T>;\n}\n\nexport interface LandmarkController {\n /** Focus the next landmark in DOM order. */\n focusNext: () => void;\n /** Focus the previous landmark in DOM order. */\n focusPrevious: () => void;\n /** Focus the main landmark. */\n focusMain: () => void;\n /** Navigate to a specific landmark by role. If multiple exist, the first one is focused. */\n navigate: (role: AriaLandmarkRole) => void;\n}\n\ninterface LandmarkEntry {\n ref: HTMLElement;\n role: AriaLandmarkRole;\n label?: string;\n focus?: () => void;\n lastFocused?: HTMLElement;\n}\n\n/**\n * Manages all registered landmarks and handles F6 keyboard navigation.\n */\nclass LandmarkManager {\n private landmarks: LandmarkEntry[] = [];\n private currentIndex = -1;\n private listening = false;\n\n constructor() {\n if (typeof window !== \"undefined\") {\n this.startListening();\n }\n }\n\n private startListening() {\n if (this.listening) return;\n this.listening = true;\n\n window.addEventListener(\"keydown\", this.handleKeyDown.bind(this), true);\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n // F6 to navigate landmarks\n if (event.key === \"F6\") {\n event.preventDefault();\n if (event.shiftKey) {\n this.focusPrevious();\n } else {\n this.focusNext();\n }\n }\n }\n\n register(entry: LandmarkEntry): void {\n // Insert in DOM order using compareDocumentPosition\n const index = this.findInsertionIndex(entry.ref);\n this.landmarks.splice(index, 0, entry);\n\n // Validate: if multiple landmarks have the same role, they should have different labels\n this.validateLabels();\n }\n\n unregister(ref: HTMLElement): void {\n const index = this.landmarks.findIndex((l) => l.ref === ref);\n if (index !== -1) {\n this.landmarks.splice(index, 1);\n // Adjust currentIndex if needed\n if (this.currentIndex >= this.landmarks.length) {\n this.currentIndex = this.landmarks.length - 1;\n }\n }\n }\n\n private findInsertionIndex(ref: HTMLElement): number {\n // Binary search for insertion point based on DOM order\n let low = 0;\n let high = this.landmarks.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n const comparison = this.landmarks[mid].ref.compareDocumentPosition(ref);\n\n // Node.DOCUMENT_POSITION_FOLLOWING = 4\n if (comparison & Node.DOCUMENT_POSITION_FOLLOWING) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return low;\n }\n\n private validateLabels(): void {\n // Group landmarks by role\n const roleGroups = new Map<AriaLandmarkRole, LandmarkEntry[]>();\n for (const landmark of this.landmarks) {\n const group = roleGroups.get(landmark.role) || [];\n group.push(landmark);\n roleGroups.set(landmark.role, group);\n }\n\n // Warn if multiple landmarks with the same role lack unique labels\n for (const [role, group] of roleGroups) {\n if (group.length > 1) {\n const labels = group.map((l) => l.label);\n const uniqueLabels = new Set(labels.filter(Boolean));\n if (uniqueLabels.size < group.length) {\n console.warn(\n `Multiple landmarks with role \"${role}\" exist. Each should have a unique aria-label or aria-labelledby.`,\n );\n }\n }\n }\n }\n\n focusNext(): void {\n if (this.landmarks.length === 0) return;\n\n // Find the currently focused landmark\n const activeElement = document.activeElement;\n this.currentIndex = this.findCurrentLandmarkIndex(activeElement);\n\n // Move to next\n this.currentIndex = (this.currentIndex + 1) % this.landmarks.length;\n this.focusLandmark(this.landmarks[this.currentIndex]);\n }\n\n focusPrevious(): void {\n if (this.landmarks.length === 0) return;\n\n // Find the currently focused landmark\n const activeElement = document.activeElement;\n this.currentIndex = this.findCurrentLandmarkIndex(activeElement);\n\n // Move to previous\n this.currentIndex = (this.currentIndex - 1 + this.landmarks.length) % this.landmarks.length;\n this.focusLandmark(this.landmarks[this.currentIndex]);\n }\n\n focusMain(): void {\n const main = this.landmarks.find((l) => l.role === \"main\");\n if (main) {\n this.focusLandmark(main);\n }\n }\n\n navigate(role: AriaLandmarkRole): void {\n const landmark = this.landmarks.find((l) => l.role === role);\n if (landmark) {\n this.focusLandmark(landmark);\n }\n }\n\n private findCurrentLandmarkIndex(activeElement: Element | null): number {\n if (!activeElement) return -1;\n\n // Check if active element is within any landmark\n for (let i = 0; i < this.landmarks.length; i++) {\n if (this.landmarks[i].ref.contains(activeElement)) {\n // Store the last focused element for this landmark\n if (activeElement instanceof HTMLElement) {\n this.landmarks[i].lastFocused = activeElement;\n }\n return i;\n }\n }\n\n return -1;\n }\n\n private focusLandmark(landmark: LandmarkEntry): void {\n // If a custom focus handler is provided, use it\n if (landmark.focus) {\n landmark.focus();\n return;\n }\n\n // If we previously focused an element in this landmark, try to restore it\n if (landmark.lastFocused && landmark.ref.contains(landmark.lastFocused)) {\n landmark.lastFocused.focus();\n return;\n }\n\n // Try to find the first focusable element\n const focusable = this.findFirstFocusable(landmark.ref);\n if (focusable) {\n focusable.focus();\n return;\n }\n\n // Fallback: make the landmark itself focusable and focus it\n if (!landmark.ref.hasAttribute(\"tabindex\")) {\n landmark.ref.setAttribute(\"tabindex\", \"-1\");\n }\n landmark.ref.focus();\n }\n\n private findFirstFocusable(container: HTMLElement): HTMLElement | null {\n const focusableSelectors = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(\", \");\n\n return container.querySelector<HTMLElement>(focusableSelectors);\n }\n\n getController(): LandmarkController {\n return {\n focusNext: () => this.focusNext(),\n focusPrevious: () => this.focusPrevious(),\n focusMain: () => this.focusMain(),\n navigate: (role) => this.navigate(role),\n };\n }\n}\n\n// Global singleton instance\nlet landmarkManager: LandmarkManager | null = null;\n\nfunction getLandmarkManager(): LandmarkManager {\n if (!landmarkManager) {\n landmarkManager = new LandmarkManager();\n }\n return landmarkManager;\n}\n\n/**\n * Provides landmark navigation in an application.\n * Call this with a role and label to register a landmark navigable with F6.\n *\n * @example\n * ```tsx\n * function Navigation(props) {\n * let ref: HTMLElement;\n * const { landmarkProps } = createLandmark({\n * role: 'navigation',\n * 'aria-label': 'Main navigation'\n * });\n *\n * return (\n * <nav {...landmarkProps} ref={ref}>\n * {props.children}\n * </nav>\n * );\n * }\n * ```\n */\nexport function createLandmark<T extends HTMLElement = HTMLElement>(\n props: MaybeAccessor<AriaLandmarkProps>,\n ref: Accessor<T | undefined>,\n): LandmarkAria<T> {\n // Register with the landmark manager\n createEffect(() => {\n const element = ref();\n if (!element) return;\n\n const p = access(props);\n const entry: LandmarkEntry = {\n ref: element,\n role: p.role,\n label: p[\"aria-label\"],\n focus: p.focus,\n };\n\n const manager = getLandmarkManager();\n manager.register(entry);\n\n onCleanup(() => {\n manager.unregister(element);\n });\n });\n\n const getLandmarkProps = (): JSX.HTMLAttributes<T> => {\n const p = access(props);\n const domProps = filterDOMProps(p as unknown as Record<string, unknown>, { labelable: true });\n\n return {\n ...domProps,\n role: p.role,\n };\n };\n\n return {\n get landmarkProps() {\n return getLandmarkProps();\n },\n };\n}\n\n/**\n * Returns a controller for programmatic landmark navigation.\n *\n * @example\n * ```tsx\n * const controller = getLandmarkController();\n * controller.focusMain(); // Focus the main landmark\n * controller.focusNext(); // Focus the next landmark\n * ```\n */\nexport function getLandmarkController(): LandmarkController {\n return getLandmarkManager().getController();\n}\n"],"mappings":"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"}
|