@proyecto-viviana/solidaria 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunk/DragManager.js +627 -0
- package/dist/_chunk/DragManager.js.map +1 -0
- package/dist/_chunk/DragManager.jsx +627 -0
- package/dist/_chunk/DragManager.jsx.map +1 -0
- package/dist/_chunk/FocusScope.js +400 -0
- package/dist/_chunk/FocusScope.js.map +1 -0
- package/dist/_chunk/FocusScope.jsx +375 -0
- package/dist/_chunk/FocusScope.jsx.map +1 -0
- package/dist/_chunk/actiongroup.js +13 -79
- package/dist/_chunk/actiongroup.js.map +1 -1
- package/dist/_chunk/actiongroup.jsx +13 -79
- package/dist/_chunk/actiongroup.jsx.map +1 -1
- package/dist/_chunk/{live-announcer.js → announce.js} +1 -1
- package/dist/_chunk/announce.js.map +1 -0
- package/dist/_chunk/{live-announcer.jsx → announce.jsx} +1 -1
- package/dist/_chunk/announce.jsx.map +1 -0
- package/dist/_chunk/autocomplete.js +56 -8
- package/dist/_chunk/autocomplete.js.map +1 -1
- package/dist/_chunk/autocomplete.jsx +56 -8
- package/dist/_chunk/autocomplete.jsx.map +1 -1
- package/dist/_chunk/breadcrumbs.js +6 -4
- package/dist/_chunk/breadcrumbs.js.map +1 -1
- package/dist/_chunk/breadcrumbs.jsx +6 -4
- package/dist/_chunk/breadcrumbs.jsx.map +1 -1
- package/dist/_chunk/button.js +8 -9
- package/dist/_chunk/button.js.map +1 -1
- package/dist/_chunk/button.jsx +8 -9
- package/dist/_chunk/button.jsx.map +1 -1
- package/dist/_chunk/calendar.js +27 -26
- package/dist/_chunk/calendar.js.map +1 -1
- package/dist/_chunk/calendar.jsx +27 -26
- package/dist/_chunk/calendar.jsx.map +1 -1
- package/dist/_chunk/checkbox.js +5 -4
- package/dist/_chunk/checkbox.js.map +1 -1
- package/dist/_chunk/checkbox.jsx +5 -4
- package/dist/_chunk/checkbox.jsx.map +1 -1
- package/dist/_chunk/color.js +302 -18
- package/dist/_chunk/color.js.map +1 -1
- package/dist/_chunk/color.jsx +302 -18
- package/dist/_chunk/color.jsx.map +1 -1
- package/dist/_chunk/combobox.js +638 -12
- package/dist/_chunk/combobox.js.map +1 -1
- package/dist/_chunk/combobox.jsx +638 -12
- package/dist/_chunk/combobox.jsx.map +1 -1
- package/dist/_chunk/constants.js +19 -0
- package/dist/_chunk/constants.js.map +1 -0
- package/dist/_chunk/constants.jsx +19 -0
- package/dist/_chunk/constants.jsx.map +1 -0
- package/dist/_chunk/createCollator.js +3 -171
- package/dist/_chunk/createCollator.js.map +1 -1
- package/dist/_chunk/createCollator.jsx +3 -165
- package/dist/_chunk/createCollator.jsx.map +1 -1
- package/dist/_chunk/createField.js +2 -1
- package/dist/_chunk/createField.js.map +1 -1
- package/dist/_chunk/createField.jsx +2 -1
- package/dist/_chunk/createField.jsx.map +1 -1
- package/dist/_chunk/createFocus.js +12 -8
- package/dist/_chunk/createFocus.js.map +1 -1
- package/dist/_chunk/createFocus.jsx +12 -8
- package/dist/_chunk/createFocus.jsx.map +1 -1
- package/dist/_chunk/createFocusWithin.js +12 -13
- package/dist/_chunk/createFocusWithin.js.map +1 -1
- package/dist/_chunk/createFocusWithin.jsx +12 -13
- package/dist/_chunk/createFocusWithin.jsx.map +1 -1
- package/dist/_chunk/createFocusable.js +3 -3
- package/dist/_chunk/createFocusable.js.map +1 -1
- package/dist/_chunk/createFocusable.jsx +3 -3
- package/dist/_chunk/createFocusable.jsx.map +1 -1
- package/dist/_chunk/{form.js → createFormReset.js} +1 -1
- package/dist/_chunk/createFormReset.js.map +1 -0
- package/dist/_chunk/{form.jsx → createFormReset.jsx} +1 -1
- package/dist/_chunk/createFormReset.jsx.map +1 -0
- package/dist/_chunk/createHover.js +2 -1
- package/dist/_chunk/createHover.js.map +1 -1
- package/dist/_chunk/createHover.jsx +2 -1
- package/dist/_chunk/createHover.jsx.map +1 -1
- package/dist/_chunk/createInteractionModality.js +2 -3
- package/dist/_chunk/createInteractionModality.js.map +1 -1
- package/dist/_chunk/createInteractionModality.jsx +2 -3
- package/dist/_chunk/createInteractionModality.jsx.map +1 -1
- package/dist/_chunk/createLabel.js +2 -1
- package/dist/_chunk/createLabel.js.map +1 -1
- package/dist/_chunk/createLabel.jsx +2 -1
- package/dist/_chunk/createLabel.jsx.map +1 -1
- package/dist/_chunk/createLabels.js +3 -2
- package/dist/_chunk/createLabels.js.map +1 -1
- package/dist/_chunk/createLabels.jsx +3 -2
- package/dist/_chunk/createLabels.jsx.map +1 -1
- package/dist/_chunk/createLandmark.js +1 -1
- package/dist/_chunk/createLandmark.jsx +1 -1
- package/dist/_chunk/createProgressBar.js +2 -1
- package/dist/_chunk/createProgressBar.js.map +1 -1
- package/dist/_chunk/createProgressBar.jsx +2 -1
- package/dist/_chunk/createProgressBar.jsx.map +1 -1
- package/dist/_chunk/createSelectableItem.js +7 -3
- package/dist/_chunk/createSelectableItem.js.map +1 -1
- package/dist/_chunk/createSelectableItem.jsx +7 -3
- package/dist/_chunk/createSelectableItem.jsx.map +1 -1
- package/dist/_chunk/createStringFormatter.js +61 -0
- package/dist/_chunk/createStringFormatter.js.map +1 -0
- package/dist/_chunk/createStringFormatter.jsx +61 -0
- package/dist/_chunk/createStringFormatter.jsx.map +1 -0
- package/dist/_chunk/createToggle.js +5 -4
- package/dist/_chunk/createToggle.js.map +1 -1
- package/dist/_chunk/createToggle.jsx +5 -4
- package/dist/_chunk/createToggle.jsx.map +1 -1
- package/dist/_chunk/datepicker.js +1413 -1100
- package/dist/_chunk/datepicker.js.map +1 -1
- package/dist/_chunk/datepicker.jsx +1413 -1100
- package/dist/_chunk/datepicker.jsx.map +1 -1
- package/dist/_chunk/disclosure.js +2 -2
- package/dist/_chunk/disclosure.js.map +1 -1
- package/dist/_chunk/disclosure.jsx +2 -2
- package/dist/_chunk/disclosure.jsx.map +1 -1
- package/dist/_chunk/dnd.js +1586 -495
- package/dist/_chunk/dnd.js.map +1 -1
- package/dist/_chunk/dnd.jsx +1586 -495
- package/dist/_chunk/dnd.jsx.map +1 -1
- package/dist/_chunk/env.js +1 -19
- package/dist/_chunk/env.js.map +1 -1
- package/dist/_chunk/env.jsx +1 -19
- package/dist/_chunk/env.jsx.map +1 -1
- package/dist/_chunk/focus.js +1 -1
- package/dist/_chunk/focus.js.map +1 -1
- package/dist/_chunk/focus.jsx +1 -1
- package/dist/_chunk/focus.jsx.map +1 -1
- package/dist/_chunk/focus2.js +54 -318
- package/dist/_chunk/focus2.js.map +1 -1
- package/dist/_chunk/focus2.jsx +53 -292
- package/dist/_chunk/focus2.jsx.map +1 -1
- package/dist/_chunk/grid.js +1 -1
- package/dist/_chunk/grid.jsx +1 -1
- package/dist/_chunk/gridlist.js +14 -9
- package/dist/_chunk/gridlist.js.map +1 -1
- package/dist/_chunk/gridlist.jsx +14 -9
- package/dist/_chunk/gridlist.jsx.map +1 -1
- package/dist/_chunk/i18n.js +3 -58
- package/dist/_chunk/i18n.js.map +1 -1
- package/dist/_chunk/i18n.jsx +3 -58
- package/dist/_chunk/i18n.jsx.map +1 -1
- package/dist/_chunk/interactions.js +99 -9
- package/dist/_chunk/interactions.js.map +1 -1
- package/dist/_chunk/interactions.jsx +97 -9
- package/dist/_chunk/interactions.jsx.map +1 -1
- package/dist/_chunk/link.js +2 -1
- package/dist/_chunk/link.js.map +1 -1
- package/dist/_chunk/link.jsx +2 -1
- package/dist/_chunk/link.jsx.map +1 -1
- package/dist/_chunk/listbox.js +42 -10
- package/dist/_chunk/listbox.js.map +1 -1
- package/dist/_chunk/listbox.jsx +42 -10
- package/dist/_chunk/listbox.jsx.map +1 -1
- package/dist/_chunk/locale.js +173 -0
- package/dist/_chunk/locale.js.map +1 -0
- package/dist/_chunk/locale.jsx +167 -0
- package/dist/_chunk/locale.jsx.map +1 -0
- package/dist/_chunk/menu.js +5 -4
- package/dist/_chunk/menu.js.map +1 -1
- package/dist/_chunk/menu.jsx +5 -4
- package/dist/_chunk/menu.jsx.map +1 -1
- package/dist/_chunk/numberfield.js +3 -2
- package/dist/_chunk/numberfield.js.map +1 -1
- package/dist/_chunk/numberfield.jsx +3 -2
- package/dist/_chunk/numberfield.jsx.map +1 -1
- package/dist/_chunk/overlays.js +1 -1
- package/dist/_chunk/overlays.jsx +1 -1
- package/dist/_chunk/popover.js +3 -3
- package/dist/_chunk/popover.js.map +1 -1
- package/dist/_chunk/popover.jsx +3 -3
- package/dist/_chunk/popover.jsx.map +1 -1
- package/dist/_chunk/radio.js +7 -6
- package/dist/_chunk/radio.js.map +1 -1
- package/dist/_chunk/radio.jsx +7 -6
- package/dist/_chunk/radio.jsx.map +1 -1
- package/dist/_chunk/reactivity.js +21 -0
- package/dist/_chunk/reactivity.js.map +1 -0
- package/dist/_chunk/reactivity.jsx +21 -0
- package/dist/_chunk/reactivity.jsx.map +1 -0
- package/dist/_chunk/searchfield.js +2 -1
- package/dist/_chunk/searchfield.js.map +1 -1
- package/dist/_chunk/searchfield.jsx +2 -1
- package/dist/_chunk/searchfield.jsx.map +1 -1
- package/dist/_chunk/select.js +8 -5
- package/dist/_chunk/select.js.map +1 -1
- package/dist/_chunk/select.jsx +8 -5
- package/dist/_chunk/select.jsx.map +1 -1
- package/dist/_chunk/selection.js +8 -21
- package/dist/_chunk/selection.js.map +1 -1
- package/dist/_chunk/selection.jsx +8 -21
- package/dist/_chunk/selection.jsx.map +1 -1
- package/dist/_chunk/separator.js +1 -1
- package/dist/_chunk/separator.jsx +1 -1
- package/dist/_chunk/slider.js +5 -4
- package/dist/_chunk/slider.js.map +1 -1
- package/dist/_chunk/slider.jsx +5 -4
- package/dist/_chunk/slider.jsx.map +1 -1
- package/dist/_chunk/spinbutton.js +153 -0
- package/dist/_chunk/spinbutton.js.map +1 -0
- package/dist/_chunk/spinbutton.jsx +153 -0
- package/dist/_chunk/spinbutton.jsx.map +1 -0
- package/dist/_chunk/table.js +45 -8
- package/dist/_chunk/table.js.map +1 -1
- package/dist/_chunk/table.jsx +45 -8
- package/dist/_chunk/table.jsx.map +1 -1
- package/dist/_chunk/tabs.js +11 -8
- package/dist/_chunk/tabs.js.map +1 -1
- package/dist/_chunk/tabs.jsx +11 -8
- package/dist/_chunk/tabs.jsx.map +1 -1
- package/dist/_chunk/tag.js +54 -18
- package/dist/_chunk/tag.js.map +1 -1
- package/dist/_chunk/tag.jsx +54 -18
- package/dist/_chunk/tag.jsx.map +1 -1
- package/dist/_chunk/textfield.js +2 -1
- package/dist/_chunk/textfield.js.map +1 -1
- package/dist/_chunk/textfield.jsx +2 -1
- package/dist/_chunk/textfield.jsx.map +1 -1
- package/dist/_chunk/toolbar.js +4 -36
- package/dist/_chunk/toolbar.js.map +1 -1
- package/dist/_chunk/toolbar.jsx +4 -36
- package/dist/_chunk/toolbar.jsx.map +1 -1
- package/dist/_chunk/tooltip.js +2 -2
- package/dist/_chunk/tooltip.js.map +1 -1
- package/dist/_chunk/tooltip.jsx +2 -2
- package/dist/_chunk/tooltip.jsx.map +1 -1
- package/dist/_chunk/tree.js +42 -14
- package/dist/_chunk/tree.js.map +1 -1
- package/dist/_chunk/tree.jsx +42 -14
- package/dist/_chunk/tree.jsx.map +1 -1
- package/dist/_chunk/utils.js +59 -19
- package/dist/_chunk/utils.js.map +1 -1
- package/dist/_chunk/utils.jsx +59 -19
- package/dist/_chunk/utils.jsx.map +1 -1
- package/dist/_chunk/visually-hidden.js +3 -2
- package/dist/_chunk/visually-hidden.js.map +1 -1
- package/dist/_chunk/visually-hidden.jsx +3 -2
- package/dist/_chunk/visually-hidden.jsx.map +1 -1
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -1
- package/dist/autocomplete/createAutocomplete.d.ts +10 -7
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -1
- package/dist/calendar/createCalendar.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/calendar/intl/index.d.ts +1 -1
- package/dist/calendar/intl/index.d.ts.map +1 -1
- package/dist/collections/index.js +1 -1
- package/dist/collections/index.jsx +1 -1
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorField.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorSwatch.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/color/intl/index.d.ts +30 -0
- package/dist/color/intl/index.d.ts.map +1 -0
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/combobox/intl/generated-locales.d.ts +16 -0
- package/dist/combobox/intl/generated-locales.d.ts.map +1 -0
- package/dist/combobox/intl/index.d.ts +2 -2
- package/dist/combobox/intl/index.d.ts.map +1 -1
- package/dist/datepicker/createDateField.d.ts +45 -23
- package/dist/datepicker/createDateField.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +34 -6
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDatePickerGroup.d.ts +13 -13
- package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -1
- package/dist/datepicker/createDateRangePicker.d.ts +55 -7
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -1
- package/dist/datepicker/createDateSegment.d.ts +6 -15
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createDisplayNames.d.ts +17 -0
- package/dist/datepicker/createDisplayNames.d.ts.map +1 -0
- package/dist/datepicker/createTimeField.d.ts +12 -49
- package/dist/datepicker/createTimeField.d.ts.map +1 -1
- package/dist/datepicker/index.d.ts +3 -3
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/datepicker/index.js +2 -2
- package/dist/datepicker/index.jsx +2 -2
- package/dist/datepicker/intl.d.ts +12 -0
- package/dist/datepicker/intl.d.ts.map +1 -0
- package/dist/dnd/DragManager.d.ts +86 -0
- package/dist/dnd/DragManager.d.ts.map +1 -0
- package/dist/dnd/DropTargetKeyboardNavigation.d.ts +42 -0
- package/dist/dnd/DropTargetKeyboardNavigation.d.ts.map +1 -0
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts +12 -7
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +7 -15
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +5 -1
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/dnd/index.js +3 -2
- package/dist/dnd/index.jsx +3 -2
- package/dist/dnd/intl/index.d.ts +39 -0
- package/dist/dnd/intl/index.d.ts.map +1 -0
- package/dist/dnd/utils.d.ts +5 -0
- package/dist/dnd/utils.d.ts.map +1 -1
- package/dist/focus/FocusScope.d.ts +7 -0
- package/dist/focus/FocusScope.d.ts.map +1 -1
- package/dist/focus/index.d.ts +2 -1
- package/dist/focus/index.d.ts.map +1 -1
- package/dist/focus/index.js +3 -2
- package/dist/focus/index.jsx +3 -2
- package/dist/focus/virtualFocus.d.ts +26 -0
- package/dist/focus/virtualFocus.d.ts.map +1 -0
- package/dist/form/index.js +1 -1
- package/dist/form/index.jsx +1 -1
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/i18n/index.js +4 -2
- package/dist/i18n/index.jsx +4 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -12
- package/dist/index.jsx +18 -12
- package/dist/interactions/FocusableProvider.d.ts.map +1 -1
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/interactions/createInteractionModality.d.ts.map +1 -1
- package/dist/interactions/index.js +1 -2
- package/dist/interactions/index.jsx +1 -2
- package/dist/label/createLabels.d.ts.map +1 -1
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts +1 -1
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/live-announcer/index.js +1 -1
- package/dist/live-announcer/index.jsx +1 -1
- package/dist/select/createSelect.d.ts +2 -0
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/selection/createSelectableItem.d.ts.map +1 -1
- package/dist/selection/index.js +2 -1
- package/dist/selection/index.jsx +2 -1
- package/dist/spinbutton/createSpinButton.d.ts +41 -0
- package/dist/spinbutton/createSpinButton.d.ts.map +1 -0
- package/dist/spinbutton/index.d.ts +3 -0
- package/dist/spinbutton/index.d.ts.map +1 -0
- package/dist/spinbutton/index.js +2 -0
- package/dist/spinbutton/index.jsx +2 -0
- package/dist/spinbutton/intl.d.ts +5 -0
- package/dist/spinbutton/intl.d.ts.map +1 -0
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/table/createTableColumnHeader.d.ts.map +1 -1
- package/dist/table/createTableRow.d.ts.map +1 -1
- package/dist/table/createTableSelectionCheckbox.d.ts.map +1 -1
- package/dist/table/types.d.ts +8 -0
- package/dist/table/types.d.ts.map +1 -1
- package/dist/table/utils.d.ts +15 -0
- package/dist/table/utils.d.ts.map +1 -0
- package/dist/tabs/createTabs.d.ts +1 -0
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts +7 -0
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
- package/dist/utils/animation.d.ts.map +1 -1
- package/dist/utils/dom.d.ts +1 -0
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -3
- package/dist/utils/index.jsx +4 -3
- package/package.json +2 -2
- package/src/actiongroup/createActionGroup.ts +26 -109
- package/src/autocomplete/createAutocomplete.ts +136 -15
- package/src/breadcrumbs/createBreadcrumbs.ts +12 -4
- package/src/button/createToggleButtonGroup.ts +19 -14
- package/src/calendar/createCalendar.ts +3 -4
- package/src/calendar/createCalendarCell.ts +17 -3
- package/src/calendar/createCalendarGrid.ts +5 -4
- package/src/calendar/createRangeCalendar.ts +27 -17
- package/src/calendar/createRangeCalendarCell.ts +17 -3
- package/src/calendar/intl/index.ts +8 -0
- package/src/color/createColorArea.ts +17 -10
- package/src/color/createColorField.ts +8 -1
- package/src/color/createColorSlider.ts +1 -2
- package/src/color/createColorSwatch.ts +4 -2
- package/src/color/createColorWheel.ts +0 -6
- package/src/color/intl/index.ts +316 -0
- package/src/combobox/createComboBox.ts +35 -4
- package/src/combobox/intl/generated-locales.ts +635 -0
- package/src/combobox/intl/index.ts +8 -2
- package/src/datepicker/createDateField.ts +228 -213
- package/src/datepicker/createDatePicker.ts +157 -146
- package/src/datepicker/createDatePickerGroup.ts +88 -82
- package/src/datepicker/createDateRangePicker.ts +230 -179
- package/src/datepicker/createDateSegment.ts +386 -389
- package/src/datepicker/createDisplayNames.ts +45 -0
- package/src/datepicker/createTimeField.ts +36 -129
- package/src/datepicker/index.ts +13 -14
- package/src/datepicker/intl.ts +633 -0
- package/src/dnd/DragManager.ts +693 -0
- package/src/dnd/DropTargetKeyboardNavigation.ts +337 -0
- package/src/dnd/createDrag.ts +31 -5
- package/src/dnd/createDraggableCollection.ts +33 -15
- package/src/dnd/createDraggableItem.ts +92 -5
- package/src/dnd/createDroppableCollection.ts +487 -373
- package/src/dnd/index.ts +11 -0
- package/src/dnd/intl/ar-AE.json +29 -0
- package/src/dnd/intl/bg-BG.json +29 -0
- package/src/dnd/intl/cs-CZ.json +29 -0
- package/src/dnd/intl/da-DK.json +29 -0
- package/src/dnd/intl/de-DE.json +29 -0
- package/src/dnd/intl/el-GR.json +29 -0
- package/src/dnd/intl/en-US.json +29 -0
- package/src/dnd/intl/es-ES.json +29 -0
- package/src/dnd/intl/et-EE.json +29 -0
- package/src/dnd/intl/fi-FI.json +29 -0
- package/src/dnd/intl/fr-FR.json +29 -0
- package/src/dnd/intl/he-IL.json +29 -0
- package/src/dnd/intl/hr-HR.json +29 -0
- package/src/dnd/intl/hu-HU.json +29 -0
- package/src/dnd/intl/index.ts +139 -0
- package/src/dnd/intl/it-IT.json +29 -0
- package/src/dnd/intl/ja-JP.json +29 -0
- package/src/dnd/intl/ko-KR.json +29 -0
- package/src/dnd/intl/lt-LT.json +29 -0
- package/src/dnd/intl/lv-LV.json +29 -0
- package/src/dnd/intl/nb-NO.json +29 -0
- package/src/dnd/intl/nl-NL.json +29 -0
- package/src/dnd/intl/pl-PL.json +29 -0
- package/src/dnd/intl/pt-BR.json +29 -0
- package/src/dnd/intl/pt-PT.json +29 -0
- package/src/dnd/intl/ro-RO.json +29 -0
- package/src/dnd/intl/ru-RU.json +29 -0
- package/src/dnd/intl/sk-SK.json +29 -0
- package/src/dnd/intl/sl-SI.json +29 -0
- package/src/dnd/intl/sr-SP.json +29 -0
- package/src/dnd/intl/sv-SE.json +29 -0
- package/src/dnd/intl/tr-TR.json +29 -0
- package/src/dnd/intl/uk-UA.json +29 -0
- package/src/dnd/intl/zh-CN.json +29 -0
- package/src/dnd/intl/zh-TW.json +29 -0
- package/src/dnd/utils.ts +36 -0
- package/src/focus/FocusScope.tsx +120 -12
- package/src/focus/index.ts +8 -0
- package/src/focus/virtualFocus.ts +55 -0
- package/src/gridlist/createGridList.ts +52 -16
- package/src/index.ts +11 -3
- package/src/interactions/FocusableProvider.tsx +11 -6
- package/src/interactions/createFocus.ts +26 -21
- package/src/interactions/createFocusWithin.ts +23 -24
- package/src/interactions/createInteractionModality.ts +5 -3
- package/src/label/createLabels.ts +7 -4
- package/src/listbox/createListBox.ts +74 -2
- package/src/listbox/createOption.ts +16 -1
- package/src/select/createSelect.ts +23 -2
- package/src/selection/createSelectableItem.ts +14 -0
- package/src/spinbutton/createSpinButton.ts +163 -0
- package/src/spinbutton/index.ts +10 -0
- package/src/spinbutton/intl.ts +115 -0
- package/src/table/createTable.ts +26 -1
- package/src/table/createTableColumnHeader.ts +10 -0
- package/src/table/createTableRow.ts +10 -0
- package/src/table/createTableSelectionCheckbox.ts +24 -1
- package/src/table/types.ts +8 -0
- package/src/table/utils.ts +41 -0
- package/src/tabs/createTabs.ts +53 -12
- package/src/tag/createTag.ts +21 -32
- package/src/tag/createTagGroup.ts +92 -0
- package/src/toolbar/createToolbar.ts +6 -58
- package/src/tree/createTree.ts +69 -14
- package/src/tree/createTreeSelectionCheckbox.ts +14 -1
- package/src/utils/animation.ts +119 -27
- package/src/utils/dom.ts +3 -2
- package/src/utils/index.ts +2 -0
- package/dist/_chunk/createLongPress.js +0 -91
- package/dist/_chunk/createLongPress.js.map +0 -1
- package/dist/_chunk/createLongPress.jsx +0 -91
- package/dist/_chunk/createLongPress.jsx.map +0 -1
- package/dist/_chunk/form.js.map +0 -1
- package/dist/_chunk/form.jsx.map +0 -1
- package/dist/_chunk/live-announcer.js.map +0 -1
- package/dist/_chunk/live-announcer.jsx.map +0 -1
- package/dist/datepicker/createTimeSegment.d.ts +0 -29
- package/dist/datepicker/createTimeSegment.d.ts.map +0 -1
- package/src/datepicker/createTimeSegment.ts +0 -352
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","names":[],"sources":["../../src/tooltip/createTooltip.ts","../../src/tooltip/createTooltipTrigger.ts"],"sourcesContent":["/**\n * createTooltip hook for Solidaria\n *\n * Provides the accessibility implementation for a Tooltip component.\n *\n * Port of @react-aria/tooltip useTooltip.\n */\n\nimport { type JSX } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { filterDOMProps, mergeProps } from \"../utils\";\n\nexport interface TooltipProps {\n /** Whether the tooltip is disabled. */\n isDisabled?: boolean;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n}\n\nexport interface TooltipAria {\n /** Props to spread on the tooltip element. */\n tooltipProps: JSX.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * Provides the accessibility implementation for a Tooltip component.\n *\n * When hovering over the tooltip itself, it stays open. When the mouse leaves\n * the tooltip, it closes.\n *\n * @example\n * ```tsx\n * import { createTooltip } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function Tooltip(props) {\n * const state = props.state;\n * const { tooltipProps } = createTooltip(props, state);\n *\n * return (\n * <div {...tooltipProps} role=\"tooltip\">\n * {props.children}\n * </div>\n * );\n * }\n * ```\n */\nexport function createTooltip(props: TooltipProps = {}, state?: TooltipTriggerState): TooltipAria {\n const domProps = filterDOMProps(props, { labelable: true });\n\n const { hoverProps } = createHover({\n onHoverStart: () => state?.open(true),\n onHoverEnd: () => state?.close(),\n });\n\n return {\n tooltipProps: mergeProps<JSX.HTMLAttributes<HTMLElement>>(domProps, hoverProps, {\n role: \"tooltip\",\n }),\n };\n}\n","/**\n * createTooltipTrigger hook for Solidaria\n *\n * Provides the behavior and accessibility implementation for a tooltip trigger,\n * e.g. a button that shows a description when focused or hovered.\n *\n * Port of @react-aria/tooltip useTooltipTrigger.\n */\n\nimport { type JSX, createEffect, onCleanup } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { createFocusable } from \"../interactions/createFocusable\";\nimport { createId } from \"../ssr\";\n\nexport interface TooltipTriggerProps {\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /**\n * The trigger mechanism for the tooltip.\n * @default 'hover'\n */\n trigger?: \"focus\" | \"hover\";\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean;\n /**\n * ID of the tooltip element.\n * @internal Used by component wrappers to merge explicit tooltip ids with trigger aria-describedby.\n */\n tooltipId?: string;\n}\n\nexport interface TooltipTriggerAria {\n /** Props to spread on the trigger element. */\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props to spread on the tooltip element (id for accessibility). */\n tooltipProps: { readonly id: string };\n}\n\ntype Modality = \"keyboard\" | \"pointer\" | \"virtual\";\nlet currentModality: Modality | null = null;\n\n// Track interaction modality (pointer vs keyboard)\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"keydown\",\n () => {\n currentModality = \"keyboard\";\n },\n true,\n );\n document.addEventListener(\n \"pointerdown\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n document.addEventListener(\n \"pointermove\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n}\n\nfunction isFocusVisible(): boolean {\n return currentModality === \"keyboard\";\n}\n\n/**\n * Provides the behavior and accessibility implementation for a tooltip trigger.\n *\n * @example\n * ```tsx\n * import { createTooltipTrigger } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function TooltipButton(props) {\n * let ref;\n * const state = createTooltipTriggerState({ delay: 500 });\n * const { triggerProps, tooltipProps } = createTooltipTrigger(\n * { isDisabled: props.isDisabled },\n * state,\n * () => ref\n * );\n *\n * return (\n * <>\n * <button ref={ref} {...triggerProps}>\n * Hover me\n * </button>\n * <Show when={state.isOpen()}>\n * <div {...tooltipProps}>Tooltip content</div>\n * </Show>\n * </>\n * );\n * }\n * ```\n */\nexport function createTooltipTrigger(\n props: TooltipTriggerProps,\n state: TooltipTriggerState,\n ref: () => HTMLElement | null | undefined,\n): TooltipTriggerAria {\n const isDisabled = () => props.isDisabled ?? false;\n const trigger = () => props.trigger ?? \"hover\";\n const shouldCloseOnPress = () => props.shouldCloseOnPress ?? true;\n\n const generatedTooltipId = createId();\n const tooltipId = () => props.tooltipId ?? generatedTooltipId;\n\n // Track hover and focus state\n let isHovered = false;\n let isFocused = false;\n\n const handleShow = () => {\n if (!isDisabled() && (isHovered || isFocused)) {\n state.open(isFocused);\n }\n };\n\n const handleHide = (immediate?: boolean) => {\n if (!isHovered && !isFocused) {\n state.close(immediate);\n }\n };\n\n // Handle Escape key to dismiss tooltip\n createEffect(() => {\n if (!state.isOpen()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const element = ref();\n if (element) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n state.close(true);\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n });\n });\n\n const onHoverStart = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n // Hover events (onPointerEnter) only fire from pointer interactions,\n // so we can always set isHovered to true here\n isHovered = true;\n handleShow();\n };\n\n const onHoverEnd = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide();\n };\n\n const closeOnPress = () => {\n if (isDisabled() || !shouldCloseOnPress()) {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const onKeyDownPress = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \" && event.key !== \"Spacebar\") {\n return;\n }\n closeOnPress();\n };\n\n const onFocus = () => {\n if (isDisabled()) {\n return;\n }\n\n const visible = isFocusVisible();\n if (visible) {\n isFocused = true;\n handleShow();\n }\n };\n\n const onBlur = () => {\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const { hoverProps } = createHover(() => ({\n isDisabled: isDisabled(),\n onHoverStart,\n onHoverEnd,\n }));\n\n const { focusableProps } = createFocusable({\n isDisabled,\n onFocus,\n onBlur,\n });\n\n const triggerProps = {\n ...focusableProps,\n ...hoverProps,\n get \"aria-describedby\"() {\n return !isDisabled() && state.isOpen() ? tooltipId() : undefined;\n },\n onPointerDown: closeOnPress,\n onKeyDown: onKeyDownPress,\n // Remove tabIndex set by focusableProps to avoid overriding\n tabIndex: undefined,\n };\n\n return {\n triggerProps: triggerProps as JSX.HTMLAttributes<HTMLElement>,\n tooltipProps: {\n get id() {\n return tooltipId();\n },\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":["mergeProps"],"sources":["../../src/tooltip/createTooltip.ts","../../src/tooltip/createTooltipTrigger.ts"],"sourcesContent":["/**\n * createTooltip hook for Solidaria\n *\n * Provides the accessibility implementation for a Tooltip component.\n *\n * Port of @react-aria/tooltip useTooltip.\n */\n\nimport { type JSX } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { filterDOMProps, mergeProps } from \"../utils\";\n\nexport interface TooltipProps {\n /** Whether the tooltip is disabled. */\n isDisabled?: boolean;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n}\n\nexport interface TooltipAria {\n /** Props to spread on the tooltip element. */\n tooltipProps: JSX.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * Provides the accessibility implementation for a Tooltip component.\n *\n * When hovering over the tooltip itself, it stays open. When the mouse leaves\n * the tooltip, it closes.\n *\n * @example\n * ```tsx\n * import { createTooltip } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function Tooltip(props) {\n * const state = props.state;\n * const { tooltipProps } = createTooltip(props, state);\n *\n * return (\n * <div {...tooltipProps} role=\"tooltip\">\n * {props.children}\n * </div>\n * );\n * }\n * ```\n */\nexport function createTooltip(props: TooltipProps = {}, state?: TooltipTriggerState): TooltipAria {\n const domProps = filterDOMProps(props, { labelable: true });\n\n const { hoverProps } = createHover({\n onHoverStart: () => state?.open(true),\n onHoverEnd: () => state?.close(),\n });\n\n return {\n tooltipProps: mergeProps<JSX.HTMLAttributes<HTMLElement>>(domProps, hoverProps, {\n role: \"tooltip\",\n }),\n };\n}\n","/**\n * createTooltipTrigger hook for Solidaria\n *\n * Provides the behavior and accessibility implementation for a tooltip trigger,\n * e.g. a button that shows a description when focused or hovered.\n *\n * Port of @react-aria/tooltip useTooltipTrigger.\n */\n\nimport { type JSX, createEffect, onCleanup } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { createFocusable } from \"../interactions/createFocusable\";\nimport { createId } from \"../ssr\";\n\nexport interface TooltipTriggerProps {\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /**\n * The trigger mechanism for the tooltip.\n * @default 'hover'\n */\n trigger?: \"focus\" | \"hover\";\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean;\n /**\n * ID of the tooltip element.\n * @internal Used by component wrappers to merge explicit tooltip ids with trigger aria-describedby.\n */\n tooltipId?: string;\n}\n\nexport interface TooltipTriggerAria {\n /** Props to spread on the trigger element. */\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props to spread on the tooltip element (id for accessibility). */\n tooltipProps: { readonly id: string };\n}\n\ntype Modality = \"keyboard\" | \"pointer\" | \"virtual\";\nlet currentModality: Modality | null = null;\n\n// Track interaction modality (pointer vs keyboard)\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"keydown\",\n () => {\n currentModality = \"keyboard\";\n },\n true,\n );\n document.addEventListener(\n \"pointerdown\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n document.addEventListener(\n \"pointermove\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n}\n\nfunction isFocusVisible(): boolean {\n return currentModality === \"keyboard\";\n}\n\n/**\n * Provides the behavior and accessibility implementation for a tooltip trigger.\n *\n * @example\n * ```tsx\n * import { createTooltipTrigger } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function TooltipButton(props) {\n * let ref;\n * const state = createTooltipTriggerState({ delay: 500 });\n * const { triggerProps, tooltipProps } = createTooltipTrigger(\n * { isDisabled: props.isDisabled },\n * state,\n * () => ref\n * );\n *\n * return (\n * <>\n * <button ref={ref} {...triggerProps}>\n * Hover me\n * </button>\n * <Show when={state.isOpen()}>\n * <div {...tooltipProps}>Tooltip content</div>\n * </Show>\n * </>\n * );\n * }\n * ```\n */\nexport function createTooltipTrigger(\n props: TooltipTriggerProps,\n state: TooltipTriggerState,\n ref: () => HTMLElement | null | undefined,\n): TooltipTriggerAria {\n const isDisabled = () => props.isDisabled ?? false;\n const trigger = () => props.trigger ?? \"hover\";\n const shouldCloseOnPress = () => props.shouldCloseOnPress ?? true;\n\n const generatedTooltipId = createId();\n const tooltipId = () => props.tooltipId ?? generatedTooltipId;\n\n // Track hover and focus state\n let isHovered = false;\n let isFocused = false;\n\n const handleShow = () => {\n if (!isDisabled() && (isHovered || isFocused)) {\n state.open(isFocused);\n }\n };\n\n const handleHide = (immediate?: boolean) => {\n if (!isHovered && !isFocused) {\n state.close(immediate);\n }\n };\n\n // Handle Escape key to dismiss tooltip\n createEffect(() => {\n if (!state.isOpen()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const element = ref();\n if (element) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n state.close(true);\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n });\n });\n\n const onHoverStart = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n // Hover events (onPointerEnter) only fire from pointer interactions,\n // so we can always set isHovered to true here\n isHovered = true;\n handleShow();\n };\n\n const onHoverEnd = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide();\n };\n\n const closeOnPress = () => {\n if (isDisabled() || !shouldCloseOnPress()) {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const onKeyDownPress = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \" && event.key !== \"Spacebar\") {\n return;\n }\n closeOnPress();\n };\n\n const onFocus = () => {\n if (isDisabled()) {\n return;\n }\n\n const visible = isFocusVisible();\n if (visible) {\n isFocused = true;\n handleShow();\n }\n };\n\n const onBlur = () => {\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const { hoverProps } = createHover(() => ({\n isDisabled: isDisabled(),\n onHoverStart,\n onHoverEnd,\n }));\n\n const { focusableProps } = createFocusable({\n isDisabled,\n onFocus,\n onBlur,\n });\n\n const triggerProps = {\n ...focusableProps,\n ...hoverProps,\n get \"aria-describedby\"() {\n return !isDisabled() && state.isOpen() ? tooltipId() : undefined;\n },\n onPointerDown: closeOnPress,\n onKeyDown: onKeyDownPress,\n // Remove tabIndex set by focusableProps to avoid overriding\n tabIndex: undefined,\n };\n\n return {\n triggerProps: triggerProps as JSX.HTMLAttributes<HTMLElement>,\n tooltipProps: {\n get id() {\n return tooltipId();\n },\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/_chunk/tooltip.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as mergeProps$1 } from "./env.jsx";
|
|
2
2
|
import { t as filterDOMProps } from "./filterDOMProps.jsx";
|
|
3
3
|
import { n as createFocusable } from "./createFocusable.jsx";
|
|
4
4
|
import { t as createHover } from "./createHover.jsx";
|
|
@@ -34,7 +34,7 @@ function createTooltip(props = {}, state) {
|
|
|
34
34
|
onHoverStart: () => state?.open(true),
|
|
35
35
|
onHoverEnd: () => state?.close()
|
|
36
36
|
});
|
|
37
|
-
return { tooltipProps: mergeProps(domProps, hoverProps, { role: "tooltip" }) };
|
|
37
|
+
return { tooltipProps: mergeProps$1(domProps, hoverProps, { role: "tooltip" }) };
|
|
38
38
|
}
|
|
39
39
|
//#endregion
|
|
40
40
|
//#region src/tooltip/createTooltipTrigger.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.jsx","names":[],"sources":["../../src/tooltip/createTooltip.ts","../../src/tooltip/createTooltipTrigger.ts"],"sourcesContent":["/**\n * createTooltip hook for Solidaria\n *\n * Provides the accessibility implementation for a Tooltip component.\n *\n * Port of @react-aria/tooltip useTooltip.\n */\n\nimport { type JSX } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { filterDOMProps, mergeProps } from \"../utils\";\n\nexport interface TooltipProps {\n /** Whether the tooltip is disabled. */\n isDisabled?: boolean;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n}\n\nexport interface TooltipAria {\n /** Props to spread on the tooltip element. */\n tooltipProps: JSX.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * Provides the accessibility implementation for a Tooltip component.\n *\n * When hovering over the tooltip itself, it stays open. When the mouse leaves\n * the tooltip, it closes.\n *\n * @example\n * ```tsx\n * import { createTooltip } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function Tooltip(props) {\n * const state = props.state;\n * const { tooltipProps } = createTooltip(props, state);\n *\n * return (\n * <div {...tooltipProps} role=\"tooltip\">\n * {props.children}\n * </div>\n * );\n * }\n * ```\n */\nexport function createTooltip(props: TooltipProps = {}, state?: TooltipTriggerState): TooltipAria {\n const domProps = filterDOMProps(props, { labelable: true });\n\n const { hoverProps } = createHover({\n onHoverStart: () => state?.open(true),\n onHoverEnd: () => state?.close(),\n });\n\n return {\n tooltipProps: mergeProps<JSX.HTMLAttributes<HTMLElement>>(domProps, hoverProps, {\n role: \"tooltip\",\n }),\n };\n}\n","/**\n * createTooltipTrigger hook for Solidaria\n *\n * Provides the behavior and accessibility implementation for a tooltip trigger,\n * e.g. a button that shows a description when focused or hovered.\n *\n * Port of @react-aria/tooltip useTooltipTrigger.\n */\n\nimport { type JSX, createEffect, onCleanup } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { createFocusable } from \"../interactions/createFocusable\";\nimport { createId } from \"../ssr\";\n\nexport interface TooltipTriggerProps {\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /**\n * The trigger mechanism for the tooltip.\n * @default 'hover'\n */\n trigger?: \"focus\" | \"hover\";\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean;\n /**\n * ID of the tooltip element.\n * @internal Used by component wrappers to merge explicit tooltip ids with trigger aria-describedby.\n */\n tooltipId?: string;\n}\n\nexport interface TooltipTriggerAria {\n /** Props to spread on the trigger element. */\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props to spread on the tooltip element (id for accessibility). */\n tooltipProps: { readonly id: string };\n}\n\ntype Modality = \"keyboard\" | \"pointer\" | \"virtual\";\nlet currentModality: Modality | null = null;\n\n// Track interaction modality (pointer vs keyboard)\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"keydown\",\n () => {\n currentModality = \"keyboard\";\n },\n true,\n );\n document.addEventListener(\n \"pointerdown\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n document.addEventListener(\n \"pointermove\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n}\n\nfunction isFocusVisible(): boolean {\n return currentModality === \"keyboard\";\n}\n\n/**\n * Provides the behavior and accessibility implementation for a tooltip trigger.\n *\n * @example\n * ```tsx\n * import { createTooltipTrigger } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function TooltipButton(props) {\n * let ref;\n * const state = createTooltipTriggerState({ delay: 500 });\n * const { triggerProps, tooltipProps } = createTooltipTrigger(\n * { isDisabled: props.isDisabled },\n * state,\n * () => ref\n * );\n *\n * return (\n * <>\n * <button ref={ref} {...triggerProps}>\n * Hover me\n * </button>\n * <Show when={state.isOpen()}>\n * <div {...tooltipProps}>Tooltip content</div>\n * </Show>\n * </>\n * );\n * }\n * ```\n */\nexport function createTooltipTrigger(\n props: TooltipTriggerProps,\n state: TooltipTriggerState,\n ref: () => HTMLElement | null | undefined,\n): TooltipTriggerAria {\n const isDisabled = () => props.isDisabled ?? false;\n const trigger = () => props.trigger ?? \"hover\";\n const shouldCloseOnPress = () => props.shouldCloseOnPress ?? true;\n\n const generatedTooltipId = createId();\n const tooltipId = () => props.tooltipId ?? generatedTooltipId;\n\n // Track hover and focus state\n let isHovered = false;\n let isFocused = false;\n\n const handleShow = () => {\n if (!isDisabled() && (isHovered || isFocused)) {\n state.open(isFocused);\n }\n };\n\n const handleHide = (immediate?: boolean) => {\n if (!isHovered && !isFocused) {\n state.close(immediate);\n }\n };\n\n // Handle Escape key to dismiss tooltip\n createEffect(() => {\n if (!state.isOpen()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const element = ref();\n if (element) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n state.close(true);\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n });\n });\n\n const onHoverStart = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n // Hover events (onPointerEnter) only fire from pointer interactions,\n // so we can always set isHovered to true here\n isHovered = true;\n handleShow();\n };\n\n const onHoverEnd = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide();\n };\n\n const closeOnPress = () => {\n if (isDisabled() || !shouldCloseOnPress()) {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const onKeyDownPress = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \" && event.key !== \"Spacebar\") {\n return;\n }\n closeOnPress();\n };\n\n const onFocus = () => {\n if (isDisabled()) {\n return;\n }\n\n const visible = isFocusVisible();\n if (visible) {\n isFocused = true;\n handleShow();\n }\n };\n\n const onBlur = () => {\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const { hoverProps } = createHover(() => ({\n isDisabled: isDisabled(),\n onHoverStart,\n onHoverEnd,\n }));\n\n const { focusableProps } = createFocusable({\n isDisabled,\n onFocus,\n onBlur,\n });\n\n const triggerProps = {\n ...focusableProps,\n ...hoverProps,\n get \"aria-describedby\"() {\n return !isDisabled() && state.isOpen() ? tooltipId() : undefined;\n },\n onPointerDown: closeOnPress,\n onKeyDown: onKeyDownPress,\n // Remove tabIndex set by focusableProps to avoid overriding\n tabIndex: undefined,\n };\n\n return {\n triggerProps: triggerProps as JSX.HTMLAttributes<HTMLElement>,\n tooltipProps: {\n get id() {\n return tooltipId();\n },\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tooltip.jsx","names":["mergeProps"],"sources":["../../src/tooltip/createTooltip.ts","../../src/tooltip/createTooltipTrigger.ts"],"sourcesContent":["/**\n * createTooltip hook for Solidaria\n *\n * Provides the accessibility implementation for a Tooltip component.\n *\n * Port of @react-aria/tooltip useTooltip.\n */\n\nimport { type JSX } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { filterDOMProps, mergeProps } from \"../utils\";\n\nexport interface TooltipProps {\n /** Whether the tooltip is disabled. */\n isDisabled?: boolean;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n}\n\nexport interface TooltipAria {\n /** Props to spread on the tooltip element. */\n tooltipProps: JSX.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * Provides the accessibility implementation for a Tooltip component.\n *\n * When hovering over the tooltip itself, it stays open. When the mouse leaves\n * the tooltip, it closes.\n *\n * @example\n * ```tsx\n * import { createTooltip } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function Tooltip(props) {\n * const state = props.state;\n * const { tooltipProps } = createTooltip(props, state);\n *\n * return (\n * <div {...tooltipProps} role=\"tooltip\">\n * {props.children}\n * </div>\n * );\n * }\n * ```\n */\nexport function createTooltip(props: TooltipProps = {}, state?: TooltipTriggerState): TooltipAria {\n const domProps = filterDOMProps(props, { labelable: true });\n\n const { hoverProps } = createHover({\n onHoverStart: () => state?.open(true),\n onHoverEnd: () => state?.close(),\n });\n\n return {\n tooltipProps: mergeProps<JSX.HTMLAttributes<HTMLElement>>(domProps, hoverProps, {\n role: \"tooltip\",\n }),\n };\n}\n","/**\n * createTooltipTrigger hook for Solidaria\n *\n * Provides the behavior and accessibility implementation for a tooltip trigger,\n * e.g. a button that shows a description when focused or hovered.\n *\n * Port of @react-aria/tooltip useTooltipTrigger.\n */\n\nimport { type JSX, createEffect, onCleanup } from \"solid-js\";\nimport { type TooltipTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport { createHover } from \"../interactions/createHover\";\nimport { createFocusable } from \"../interactions/createFocusable\";\nimport { createId } from \"../ssr\";\n\nexport interface TooltipTriggerProps {\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /**\n * The trigger mechanism for the tooltip.\n * @default 'hover'\n */\n trigger?: \"focus\" | \"hover\";\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean;\n /**\n * ID of the tooltip element.\n * @internal Used by component wrappers to merge explicit tooltip ids with trigger aria-describedby.\n */\n tooltipId?: string;\n}\n\nexport interface TooltipTriggerAria {\n /** Props to spread on the trigger element. */\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n /** Props to spread on the tooltip element (id for accessibility). */\n tooltipProps: { readonly id: string };\n}\n\ntype Modality = \"keyboard\" | \"pointer\" | \"virtual\";\nlet currentModality: Modality | null = null;\n\n// Track interaction modality (pointer vs keyboard)\nif (typeof document !== \"undefined\") {\n document.addEventListener(\n \"keydown\",\n () => {\n currentModality = \"keyboard\";\n },\n true,\n );\n document.addEventListener(\n \"pointerdown\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n document.addEventListener(\n \"pointermove\",\n () => {\n currentModality = \"pointer\";\n },\n true,\n );\n}\n\nfunction isFocusVisible(): boolean {\n return currentModality === \"keyboard\";\n}\n\n/**\n * Provides the behavior and accessibility implementation for a tooltip trigger.\n *\n * @example\n * ```tsx\n * import { createTooltipTrigger } from 'solidaria';\n * import { createTooltipTriggerState } from 'solid-stately';\n *\n * function TooltipButton(props) {\n * let ref;\n * const state = createTooltipTriggerState({ delay: 500 });\n * const { triggerProps, tooltipProps } = createTooltipTrigger(\n * { isDisabled: props.isDisabled },\n * state,\n * () => ref\n * );\n *\n * return (\n * <>\n * <button ref={ref} {...triggerProps}>\n * Hover me\n * </button>\n * <Show when={state.isOpen()}>\n * <div {...tooltipProps}>Tooltip content</div>\n * </Show>\n * </>\n * );\n * }\n * ```\n */\nexport function createTooltipTrigger(\n props: TooltipTriggerProps,\n state: TooltipTriggerState,\n ref: () => HTMLElement | null | undefined,\n): TooltipTriggerAria {\n const isDisabled = () => props.isDisabled ?? false;\n const trigger = () => props.trigger ?? \"hover\";\n const shouldCloseOnPress = () => props.shouldCloseOnPress ?? true;\n\n const generatedTooltipId = createId();\n const tooltipId = () => props.tooltipId ?? generatedTooltipId;\n\n // Track hover and focus state\n let isHovered = false;\n let isFocused = false;\n\n const handleShow = () => {\n if (!isDisabled() && (isHovered || isFocused)) {\n state.open(isFocused);\n }\n };\n\n const handleHide = (immediate?: boolean) => {\n if (!isHovered && !isFocused) {\n state.close(immediate);\n }\n };\n\n // Handle Escape key to dismiss tooltip\n createEffect(() => {\n if (!state.isOpen()) return;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const element = ref();\n if (element) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n state.close(true);\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n onCleanup(() => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n });\n });\n\n const onHoverStart = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n // Hover events (onPointerEnter) only fire from pointer interactions,\n // so we can always set isHovered to true here\n isHovered = true;\n handleShow();\n };\n\n const onHoverEnd = () => {\n if (isDisabled() || trigger() === \"focus\") {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide();\n };\n\n const closeOnPress = () => {\n if (isDisabled() || !shouldCloseOnPress()) {\n return;\n }\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const onKeyDownPress = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \" && event.key !== \"Spacebar\") {\n return;\n }\n closeOnPress();\n };\n\n const onFocus = () => {\n if (isDisabled()) {\n return;\n }\n\n const visible = isFocusVisible();\n if (visible) {\n isFocused = true;\n handleShow();\n }\n };\n\n const onBlur = () => {\n isFocused = false;\n isHovered = false;\n handleHide(true);\n };\n\n const { hoverProps } = createHover(() => ({\n isDisabled: isDisabled(),\n onHoverStart,\n onHoverEnd,\n }));\n\n const { focusableProps } = createFocusable({\n isDisabled,\n onFocus,\n onBlur,\n });\n\n const triggerProps = {\n ...focusableProps,\n ...hoverProps,\n get \"aria-describedby\"() {\n return !isDisabled() && state.isOpen() ? tooltipId() : undefined;\n },\n onPointerDown: closeOnPress,\n onKeyDown: onKeyDownPress,\n // Remove tabIndex set by focusableProps to avoid overriding\n tabIndex: undefined,\n };\n\n return {\n triggerProps: triggerProps as JSX.HTMLAttributes<HTMLElement>,\n tooltipProps: {\n get id() {\n return tooltipId();\n },\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/_chunk/tree.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as mergeProps$1 } from "./env.js";
|
|
2
2
|
import { S as scrollIntoViewport } from "./utils.js";
|
|
3
3
|
import { o as getInteractionModality } from "./createInteractionModality.js";
|
|
4
4
|
import { n as createSelectableItem } from "./createSelectableItem.js";
|
|
@@ -138,16 +138,37 @@ function createTree(props, state, ref) {
|
|
|
138
138
|
break;
|
|
139
139
|
}
|
|
140
140
|
};
|
|
141
|
-
const
|
|
141
|
+
const firstSelectedKey = (s) => {
|
|
142
|
+
let key = s.collection.getFirstKey();
|
|
143
|
+
while (key != null) {
|
|
144
|
+
if (s.isSelected(key)) return key;
|
|
145
|
+
key = s.collection.getKeyAfter(key);
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
const lastSelectedKey = (s) => {
|
|
150
|
+
let key = s.collection.getLastKey();
|
|
151
|
+
while (key != null) {
|
|
152
|
+
if (s.isSelected(key)) return key;
|
|
153
|
+
key = s.collection.getKeyBefore(key);
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
};
|
|
157
|
+
const onFocusIn = (e) => {
|
|
142
158
|
const s = state();
|
|
143
159
|
s.setFocused(true);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
160
|
+
const currentTarget = e.currentTarget;
|
|
161
|
+
const relatedTarget = e.relatedTarget;
|
|
162
|
+
if (!currentTarget || relatedTarget && currentTarget.contains(relatedTarget)) return;
|
|
163
|
+
let key = s.focusedKey;
|
|
164
|
+
if (key == null) key = !!relatedTarget && !!(currentTarget.compareDocumentPosition(relatedTarget) & Node.DOCUMENT_POSITION_FOLLOWING) ? lastSelectedKey(s) ?? findNextNavigableKey(s, s.collection.getLastKey(), (k) => s.collection.getKeyBefore(k)) : firstSelectedKey(s) ?? findNextNavigableKey(s, s.collection.getFirstKey(), (k) => s.collection.getKeyAfter(k));
|
|
165
|
+
if (key != null) s.setFocusedKey(key);
|
|
148
166
|
};
|
|
149
|
-
const
|
|
150
|
-
state()
|
|
167
|
+
const onFocusOut = (e) => {
|
|
168
|
+
const s = state();
|
|
169
|
+
const currentTarget = e.currentTarget;
|
|
170
|
+
const relatedTarget = e.relatedTarget;
|
|
171
|
+
if (!currentTarget || !relatedTarget || !currentTarget.contains(relatedTarget)) s.setFocused(false);
|
|
151
172
|
};
|
|
152
173
|
createEffect(() => {
|
|
153
174
|
const key = state().focusedKey;
|
|
@@ -172,10 +193,10 @@ function createTree(props, state, ref) {
|
|
|
172
193
|
"aria-describedby": p["aria-describedby"],
|
|
173
194
|
"aria-multiselectable": s.selectionMode === "multiple" ? true : void 0,
|
|
174
195
|
"aria-disabled": p.isDisabled || void 0,
|
|
175
|
-
tabIndex: p.isDisabled ? void 0 : 0,
|
|
196
|
+
tabIndex: p.isDisabled ? void 0 : s.focusedKey == null ? 0 : -1,
|
|
176
197
|
onKeyDown,
|
|
177
|
-
|
|
178
|
-
|
|
198
|
+
onFocusIn,
|
|
199
|
+
onFocusOut
|
|
179
200
|
};
|
|
180
201
|
if (p.isVirtualized) baseProps["aria-rowcount"] = s.collection.rowCount;
|
|
181
202
|
return baseProps;
|
|
@@ -304,7 +325,7 @@ function createTreeItem(props, state, ref) {
|
|
|
304
325
|
};
|
|
305
326
|
if (p.isVirtualized && node.rowIndex != null) baseProps["aria-rowindex"] = node.rowIndex + 1;
|
|
306
327
|
const treeData = getTreeData(state());
|
|
307
|
-
return mergeCollectionRowInteractionProps(mergeProps(selectableItem.itemProps, baseProps), {
|
|
328
|
+
return mergeCollectionRowInteractionProps(mergeProps$1(selectableItem.itemProps, baseProps), {
|
|
308
329
|
ref,
|
|
309
330
|
keyboardNavigationBehavior: () => treeData?.keyboardNavigationBehavior ?? "arrow",
|
|
310
331
|
direction: () => treeData?.direction ?? "ltr"
|
|
@@ -382,6 +403,12 @@ function createTreeItem(props, state, ref) {
|
|
|
382
403
|
* Creates accessibility props for a tree selection checkbox.
|
|
383
404
|
*/
|
|
384
405
|
function createTreeSelectionCheckbox(props, state) {
|
|
406
|
+
const fallbackRowId = createId();
|
|
407
|
+
const checkboxId = createId();
|
|
408
|
+
const rowId = createMemo(() => {
|
|
409
|
+
const treeData = getTreeData(state());
|
|
410
|
+
return treeData ? `${treeData.treeId}-row-${String(props().key)}` : fallbackRowId;
|
|
411
|
+
});
|
|
385
412
|
const isSelected = createMemo(() => {
|
|
386
413
|
const s = state();
|
|
387
414
|
const p = props();
|
|
@@ -406,12 +433,13 @@ function createTreeSelectionCheckbox(props, state) {
|
|
|
406
433
|
const checkboxProps = createMemo(() => {
|
|
407
434
|
return {
|
|
408
435
|
type: "checkbox",
|
|
436
|
+
id: checkboxId,
|
|
409
437
|
"aria-label": "Select",
|
|
438
|
+
"aria-labelledby": `${checkboxId} ${rowId()}`,
|
|
410
439
|
checked: isSelected(),
|
|
411
440
|
disabled: isDisabled(),
|
|
412
441
|
onChange,
|
|
413
|
-
onClick
|
|
414
|
-
tabIndex: -1
|
|
442
|
+
onClick
|
|
415
443
|
};
|
|
416
444
|
});
|
|
417
445
|
return { get checkboxProps() {
|
package/dist/_chunk/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../src/tree/createTree.ts","../../src/tree/createTreeItem.ts","../../src/tree/createTreeSelectionCheckbox.ts"],"sourcesContent":["/**\n * createTree - Provides accessibility for a tree component.\n * Based on @react-aria/tree/useTree.\n */\n\nimport { createEffect, createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport { createId } from \"@proyecto-viviana/solid-stately\";\nimport type { TreeState, TreeCollection, Key } from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeProps, TreeAria } from \"./types\";\nimport { scrollIntoViewport } from \"../utils\";\nimport { getInteractionModality } from \"../interactions/createInteractionModality\";\n\n/**\n * Metadata stored for a tree instance.\n */\ninterface TreeData {\n /** The generated ID for the tree. */\n treeId: string;\n /** How keyboard navigation behaves within row children. */\n keyboardNavigationBehavior: \"arrow\" | \"tab\";\n /** Text direction for row-child arrow navigation and tree expansion keys. */\n direction: \"ltr\" | \"rtl\";\n /** Actions registered for the tree. */\n actions: {\n onAction?: (key: Key) => void;\n };\n}\n\n/**\n * WeakMap to store tree data for child components to access.\n */\nconst treeDataMap = new WeakMap<object, TreeData>();\n\n/**\n * Gets the tree data for a given state.\n */\nexport function getTreeData<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n): TreeData | undefined {\n return treeDataMap.get(state);\n}\n\n/**\n * Whether a key should be skipped during keyboard navigation. Disabled keys only\n * block navigation under `disabledBehavior: \"all\"` (the default); under\n * `\"selection\"` they remain focusable (selection is still blocked elsewhere).\n * Mirrors `ListKeyboardDelegate.isDisabled` in React Aria.\n */\nfunction isNavigationDisabled<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n key: Key,\n): boolean {\n return state.isDisabled(key) && state.disabledBehavior === \"all\";\n}\n\n/**\n * Walks from `startKey` via `step` until reaching a key that is navigable (not\n * disabled for navigation), mirroring React Aria's\n * `ListKeyboardDelegate.findNextNonDisabled`. `getFirstKey`/`getLastKey` and the\n * next/previous lookups all funnel through this so arrow keys, Home and End land\n * on enabled rows only.\n */\nfunction findNextNavigableKey<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n startKey: Key | null,\n step: (key: Key) => Key | null,\n): Key | null {\n let key = startKey;\n while (key != null && isNavigationDisabled(state, key)) {\n key = step(key);\n }\n return key;\n}\n\n/**\n * Creates accessibility props for a tree.\n */\nexport function createTree<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(\n props: Accessor<AriaTreeProps>,\n state: Accessor<TreeState<T, C>>,\n ref: Accessor<HTMLDivElement | null>,\n): TreeAria {\n // Generate a unique ID for the tree\n const treeId = props().id ?? createId();\n\n // Store tree data for child components\n const treeData: TreeData = {\n treeId,\n get keyboardNavigationBehavior() {\n return props().keyboardNavigationBehavior ?? \"arrow\";\n },\n get direction() {\n return props().direction ?? \"ltr\";\n },\n actions: {\n get onAction() {\n return props().onAction;\n },\n },\n };\n\n // Store in WeakMap using the state as key\n treeDataMap.set(state(), treeData);\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n const s = state();\n const p = props();\n const collection = s.collection;\n const focusedKey = s.focusedKey;\n const direction = p.direction ?? \"ltr\";\n // In RTL, ArrowLeft expands and ArrowRight collapses (opposite of LTR)\n const expandKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const collapseKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n\n if (p.isDisabled) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const nextKey =\n focusedKey != null\n ? findNextNavigableKey(s, collection.getKeyAfter(focusedKey), (k) =>\n collection.getKeyAfter(k),\n )\n : findNextNavigableKey(s, collection.getFirstKey(), (k) => collection.getKeyAfter(k));\n if (nextKey != null) {\n s.setFocusedKey(nextKey);\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prevKey =\n focusedKey != null\n ? findNextNavigableKey(s, collection.getKeyBefore(focusedKey), (k) =>\n collection.getKeyBefore(k),\n )\n : findNextNavigableKey(s, collection.getLastKey(), (k) => collection.getKeyBefore(k));\n if (prevKey != null) {\n s.setFocusedKey(prevKey);\n }\n break;\n }\n case \"ArrowRight\":\n case \"ArrowLeft\": {\n e.preventDefault();\n if (focusedKey != null) {\n const node = collection.getItem(focusedKey);\n if (e.key === expandKey) {\n // Expand or move to first child\n if (node?.isExpandable) {\n if (!s.isExpanded(focusedKey)) {\n s.expandKey(focusedKey);\n } else {\n const children = [...collection.getChildren(focusedKey)];\n if (children.length > 0) {\n s.setFocusedKey(children[0].key);\n }\n }\n }\n } else if (e.key === collapseKey) {\n // Collapse or move to parent\n if (node?.isExpandable && s.isExpanded(focusedKey)) {\n s.collapseKey(focusedKey);\n } else if (node?.parentKey != null) {\n s.setFocusedKey(node.parentKey);\n }\n }\n }\n break;\n }\n case \"Home\": {\n e.preventDefault();\n const firstKey = findNextNavigableKey(s, collection.getFirstKey(), (k) =>\n collection.getKeyAfter(k),\n );\n if (firstKey != null) {\n s.setFocusedKey(firstKey);\n }\n break;\n }\n case \"End\": {\n e.preventDefault();\n const lastKey = findNextNavigableKey(s, collection.getLastKey(), (k) =>\n collection.getKeyBefore(k),\n );\n if (lastKey != null) {\n s.setFocusedKey(lastKey);\n }\n break;\n }\n case \"a\":\n case \"A\": {\n if ((e.ctrlKey || e.metaKey) && s.selectionMode === \"multiple\") {\n e.preventDefault();\n s.selectAll();\n }\n break;\n }\n // Space (selection) and Enter (action) are intentionally absent here.\n // Upstream's useSelectableCollection leaves activation to useSelectableItem.\n // The focus effect below moves DOM focus onto the focused row, so the row's\n // own createSelectableItem handlers receive those keys without duplicating\n // work in the bubbling tree handler.\n case \"Escape\": {\n if (s.selectionMode !== \"none\") {\n e.preventDefault();\n s.clearSelection();\n }\n break;\n }\n case \"*\": {\n // Expand all siblings at current level\n e.preventDefault();\n if (focusedKey != null) {\n const node = collection.getItem(focusedKey);\n if (node) {\n // Find all siblings at the same level\n const parentKey = node.parentKey;\n let siblings: Key[];\n if (parentKey != null) {\n siblings = [...collection.getChildren(parentKey)].map((n) => n.key);\n } else {\n // Root level siblings\n siblings = collection.rows.filter((n) => n.level === 0).map((n) => n.key);\n }\n // Expand all expandable siblings\n for (const siblingKey of siblings) {\n const sibling = collection.getItem(siblingKey);\n if (sibling?.isExpandable && !s.isExpanded(siblingKey)) {\n s.expandKey(siblingKey);\n }\n }\n }\n }\n break;\n }\n }\n };\n\n const onFocus = () => {\n const s = state();\n s.setFocused(true);\n\n // If nothing is focused, focus the first navigable item\n if (s.focusedKey == null) {\n const firstKey = findNextNavigableKey(s, s.collection.getFirstKey(), (k) =>\n s.collection.getKeyAfter(k),\n );\n if (firstKey != null) {\n s.setFocusedKey(firstKey);\n }\n }\n };\n\n const onBlur = () => {\n const s = state();\n s.setFocused(false);\n };\n\n createEffect(() => {\n const s = state();\n const key = s.focusedKey;\n const el = ref();\n if (!el || key == null) {\n return;\n }\n\n const active = document.activeElement;\n if (!active || (active !== el && !el.contains(active))) {\n return;\n }\n\n const target = el.querySelector<HTMLElement>(`[data-key=\"${key}\"]`);\n if (target && target !== active) {\n target.focus();\n\n if (getInteractionModality() !== \"pointer\") {\n scrollIntoViewport(target, { containingElement: el });\n }\n }\n });\n\n const treeProps = createMemo(() => {\n const p = props();\n const s = state();\n\n const baseProps: Record<string, unknown> = {\n role: \"treegrid\",\n id: treeId,\n \"aria-label\": p[\"aria-label\"],\n \"aria-labelledby\": p[\"aria-labelledby\"],\n \"aria-describedby\": p[\"aria-describedby\"],\n \"aria-multiselectable\": s.selectionMode === \"multiple\" ? true : undefined,\n \"aria-disabled\": p.isDisabled || undefined,\n tabIndex: p.isDisabled ? undefined : 0,\n onKeyDown,\n onFocus,\n onBlur,\n };\n\n // Add row count for virtualized trees\n if (p.isVirtualized) {\n baseProps[\"aria-rowcount\"] = s.collection.rowCount;\n }\n\n return baseProps as JSX.HTMLAttributes<HTMLDivElement>;\n });\n\n return {\n get treeProps() {\n return treeProps();\n },\n };\n}\n","/**\n * createTreeItem - Provides accessibility for a tree item.\n * Based on @react-aria/tree/useTreeItem.\n */\n\nimport { createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport { createId } from \"@proyecto-viviana/solid-stately\";\nimport type {\n Collection,\n Key,\n Selection,\n TreeState,\n TreeCollection,\n} from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeItemProps, TreeItemAria } from \"./types\";\nimport { getTreeData } from \"./createTree\";\nimport { createSelectableItem, type SelectableItemState } from \"../selection/createSelectableItem\";\nimport { mergeCollectionRowInteractionProps } from \"../selection/createCollectionRowInteraction\";\nimport { mergeProps } from \"../utils/mergeProps\";\n\n/**\n * Creates accessibility props for a tree item.\n */\nexport function createTreeItem<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(\n props: Accessor<AriaTreeItemProps<T>>,\n state: Accessor<TreeState<T, C>>,\n ref: Accessor<HTMLElement | null>,\n): TreeItemAria {\n const fallbackRowId = createId();\n const expandButtonId = createId();\n\n const rowId = createMemo(() => {\n const treeData = getTreeData(state());\n return treeData ? `${treeData.treeId}-row-${String(props().node.key)}` : fallbackRowId;\n });\n\n const isSelected = createMemo(() => {\n const s = state();\n const p = props();\n return s.isSelected(p.node.key);\n });\n\n const isExpanded = createMemo(() => {\n const s = state();\n const p = props();\n return s.isExpanded(p.node.key);\n });\n\n const isExpandable = createMemo(() => {\n const p = props();\n return p.node.isExpandable ?? false;\n });\n\n const level = createMemo(() => {\n const p = props();\n return p.node.level;\n });\n\n const selectableState: SelectableItemState<T> = {\n collection: () => state().collection as unknown as Collection<T>,\n isFocused: () => state().isFocused,\n setFocused: (focused: boolean) => state().setFocused(focused),\n focusedKey: () => state().focusedKey,\n childFocusStrategy: () => state().childFocusStrategy,\n setFocusedKey: (key: Key | null, strategy) => state().setFocusedKey(key, strategy),\n selectionMode: () => state().selectionMode,\n selectionBehavior: () => props().selectionBehavior ?? state().selectionBehavior,\n disallowEmptySelection: () => state().disallowEmptySelection,\n selectedKeys: () => state().selectedKeys as Selection,\n disabledKeys: () => state().disabledKeys,\n disabledBehavior: () => state().disabledBehavior,\n isEmpty: () => {\n const keys = state().selectedKeys;\n return keys !== \"all\" && keys.size === 0;\n },\n isSelectAll: () => state().selectedKeys === \"all\",\n isSelected: (key: Key) => state().isSelected(key),\n isDisabled: (key: Key) => {\n const s = state();\n const item = s.collection.getItem(key);\n return (\n s.disabledBehavior === \"all\" &&\n s.isDisabled(key) &&\n item?.props?.disabledBehavior !== \"selection\"\n );\n },\n canSelectItem: (key: Key) => {\n const s = state();\n return s.selectionMode !== \"none\" && !s.isDisabled(key);\n },\n setSelectionBehavior: (behavior) => state().setSelectionBehavior(behavior),\n toggleSelection: (key: Key) => state().toggleSelection(key),\n replaceSelection: (key: Key) => state().replaceSelection(key),\n setSelectedKeys: (keys: Iterable<Key>) => state().setSelectedKeys(keys),\n selectAll: () => state().selectAll(),\n clearSelection: () => state().clearSelection(),\n toggleSelectAll: () => state().toggleSelectAll(),\n extendSelection: (toKey: Key, _collection: Collection<T>) => state().extendSelection(toKey),\n };\n\n const selectableItem = createSelectableItem<T>(\n () => {\n const s = state();\n const p = props();\n const treeData = getTreeData(s);\n const treeAction = treeData?.actions.onAction;\n const shouldToggleOnAction =\n !treeAction && !p.onAction && s.selectionMode === \"none\" && isExpandable();\n\n return {\n key: p.node.key,\n id: rowId(),\n isVirtualized: p.isVirtualized,\n isDisabled: p.isDisabled,\n onAction:\n treeAction || p.onAction || shouldToggleOnAction\n ? () => {\n p.onAction?.();\n treeAction?.(p.node.key);\n if (shouldToggleOnAction) {\n s.toggleKey(p.node.key);\n }\n }\n : undefined,\n };\n },\n selectableState,\n ref,\n );\n\n // Compute sibling position (aria-posinset/aria-setsize)\n const siblingInfo = createMemo(() => {\n const s = state();\n const p = props();\n const node = p.node;\n const parentKey = node.parentKey;\n\n if (parentKey != null) {\n const parentNode = s.collection.getItem(parentKey);\n if (parentNode) {\n return {\n posinset: node.index + 1, // 1-based\n setsize: parentNode.childNodes.length,\n };\n }\n }\n\n // Root-level: count root nodes\n const rootNodes = s.collection.rows.filter((n) => n.level === 0);\n const rootIndex = rootNodes.findIndex((n) => n.key === node.key);\n return {\n posinset: rootIndex >= 0 ? rootIndex + 1 : node.index + 1,\n setsize: rootNodes.length,\n };\n });\n\n const rowProps = createMemo(() => {\n const p = props();\n const node = p.node;\n const { posinset, setsize } = siblingInfo();\n\n // Use textValue for aria-label (if available), or explicit textValue prop\n const textValue = p.textValue ?? node.textValue;\n\n const baseProps: Record<string, unknown> = {\n role: \"row\",\n \"aria-label\": textValue || undefined,\n \"aria-selected\": selectableState.canSelectItem?.(node.key) ? isSelected() : undefined,\n \"aria-disabled\": selectableItem.isDisabled() || undefined,\n \"aria-expanded\": isExpandable() ? isExpanded() : undefined,\n \"aria-level\": node.level + 1, // 1-based for ARIA\n \"aria-posinset\": posinset,\n \"aria-setsize\": setsize,\n };\n\n // Add aria-rowindex for virtualized trees\n if (p.isVirtualized && node.rowIndex != null) {\n baseProps[\"aria-rowindex\"] = node.rowIndex + 1; // 1-based\n }\n\n const treeData = getTreeData(state());\n const mergedProps = mergeProps<JSX.HTMLAttributes<HTMLDivElement>>(\n selectableItem.itemProps,\n baseProps,\n );\n\n return mergeCollectionRowInteractionProps(mergedProps, {\n ref,\n keyboardNavigationBehavior: () => treeData?.keyboardNavigationBehavior ?? \"arrow\",\n direction: () => treeData?.direction ?? \"ltr\",\n });\n });\n\n const gridCellProps = createMemo(() => {\n return {\n role: \"gridcell\",\n \"aria-colindex\": 1,\n } as JSX.HTMLAttributes<HTMLDivElement>;\n });\n\n // Expand button handler\n const onExpandClick = (e: MouseEvent) => {\n e.stopPropagation(); // Don't trigger row click\n const s = state();\n const p = props();\n\n if (selectableItem.isDisabled()) return;\n\n s.toggleKey(p.node.key);\n };\n\n const stopPointerPropagation = (e: Event) => {\n // Prevent row pointer handlers from flipping pressed state and re-rendering\n // before the button click handler can run.\n e.stopPropagation();\n };\n\n const expandButtonProps = createMemo(() => {\n const baseProps: Record<string, unknown> = {\n type: \"button\",\n id: expandButtonId,\n \"aria-label\": isExpanded() ? \"Collapse\" : \"Expand\",\n \"aria-labelledby\": isExpandable() ? `${expandButtonId} ${rowId()}` : undefined,\n \"data-react-aria-prevent-focus\": true,\n onClick: onExpandClick,\n onPointerDown: stopPointerPropagation,\n onPointerUp: stopPointerPropagation,\n onMouseDown: stopPointerPropagation,\n onMouseUp: stopPointerPropagation,\n tabIndex: -1, // Not in tab order, use arrow keys\n \"aria-hidden\": !isExpandable() ? true : undefined,\n };\n\n return baseProps as JSX.ButtonHTMLAttributes<HTMLButtonElement>;\n });\n\n return {\n get rowProps() {\n return rowProps();\n },\n get gridCellProps() {\n return gridCellProps();\n },\n get expandButtonProps() {\n return expandButtonProps();\n },\n get isSelected() {\n return isSelected();\n },\n get isDisabled() {\n return selectableItem.isDisabled();\n },\n get isPressed() {\n return selectableItem.isPressed();\n },\n get isExpanded() {\n return isExpanded();\n },\n get isExpandable() {\n return isExpandable();\n },\n get level() {\n return level();\n },\n };\n}\n","/**\n * createTreeSelectionCheckbox - Provides accessibility for a tree item's selection checkbox.\n * Based on @react-aria/gridlist/useGridListSelectionCheckbox.\n */\n\nimport { createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport type { TreeState, TreeCollection } from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeSelectionCheckboxProps, TreeSelectionCheckboxAria } from \"./types\";\n\n/**\n * Creates accessibility props for a tree selection checkbox.\n */\nexport function createTreeSelectionCheckbox<\n T extends object,\n C extends TreeCollection<T> = TreeCollection<T>,\n>(\n props: Accessor<AriaTreeSelectionCheckboxProps>,\n state: Accessor<TreeState<T, C>>,\n): TreeSelectionCheckboxAria {\n const isSelected = createMemo(() => {\n const s = state();\n const p = props();\n return s.isSelected(p.key);\n });\n\n const isDisabled = createMemo(() => {\n const s = state();\n const p = props();\n return s.isDisabled(p.key);\n });\n\n const onChange = (e: Event) => {\n const s = state();\n const p = props();\n const target = e.target as HTMLInputElement;\n\n if (isDisabled()) return;\n\n if (target.checked) {\n s.toggleSelection(p.key);\n } else {\n s.toggleSelection(p.key);\n }\n };\n\n const onClick = (e: MouseEvent) => {\n // Stop propagation to prevent row click from also firing\n e.stopPropagation();\n };\n\n const checkboxProps = createMemo(() => {\n const baseProps: Record<string, unknown> = {\n type: \"checkbox\",\n \"aria-label\": \"Select\",\n checked: isSelected(),\n disabled: isDisabled(),\n onChange,\n onClick,\n tabIndex: -1, // Use arrow keys to navigate, not tab\n };\n\n return baseProps as JSX.InputHTMLAttributes<HTMLInputElement>;\n });\n\n return {\n get checkboxProps() {\n return checkboxProps();\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree.js","names":["mergeProps"],"sources":["../../src/tree/createTree.ts","../../src/tree/createTreeItem.ts","../../src/tree/createTreeSelectionCheckbox.ts"],"sourcesContent":["/**\n * createTree - Provides accessibility for a tree component.\n * Based on @react-aria/tree/useTree.\n */\n\nimport { createEffect, createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport { createId } from \"@proyecto-viviana/solid-stately\";\nimport type { TreeState, TreeCollection, Key } from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeProps, TreeAria } from \"./types\";\nimport { scrollIntoViewport } from \"../utils\";\nimport { getInteractionModality } from \"../interactions/createInteractionModality\";\n\n/**\n * Metadata stored for a tree instance.\n */\ninterface TreeData {\n /** The generated ID for the tree. */\n treeId: string;\n /** How keyboard navigation behaves within row children. */\n keyboardNavigationBehavior: \"arrow\" | \"tab\";\n /** Text direction for row-child arrow navigation and tree expansion keys. */\n direction: \"ltr\" | \"rtl\";\n /** Actions registered for the tree. */\n actions: {\n onAction?: (key: Key) => void;\n };\n}\n\n/**\n * WeakMap to store tree data for child components to access.\n */\nconst treeDataMap = new WeakMap<object, TreeData>();\n\n/**\n * Gets the tree data for a given state.\n */\nexport function getTreeData<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n): TreeData | undefined {\n return treeDataMap.get(state);\n}\n\n/**\n * Whether a key should be skipped during keyboard navigation. Disabled keys only\n * block navigation under `disabledBehavior: \"all\"` (the default); under\n * `\"selection\"` they remain focusable (selection is still blocked elsewhere).\n * Mirrors `ListKeyboardDelegate.isDisabled` in React Aria.\n */\nfunction isNavigationDisabled<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n key: Key,\n): boolean {\n return state.isDisabled(key) && state.disabledBehavior === \"all\";\n}\n\n/**\n * Walks from `startKey` via `step` until reaching a key that is navigable (not\n * disabled for navigation), mirroring React Aria's\n * `ListKeyboardDelegate.findNextNonDisabled`. `getFirstKey`/`getLastKey` and the\n * next/previous lookups all funnel through this so arrow keys, Home and End land\n * on enabled rows only.\n */\nfunction findNextNavigableKey<T extends object, C extends TreeCollection<T>>(\n state: TreeState<T, C>,\n startKey: Key | null,\n step: (key: Key) => Key | null,\n): Key | null {\n let key = startKey;\n while (key != null && isNavigationDisabled(state, key)) {\n key = step(key);\n }\n return key;\n}\n\n/**\n * Creates accessibility props for a tree.\n */\nexport function createTree<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(\n props: Accessor<AriaTreeProps>,\n state: Accessor<TreeState<T, C>>,\n ref: Accessor<HTMLDivElement | null>,\n): TreeAria {\n // Generate a unique ID for the tree\n const treeId = props().id ?? createId();\n\n // Store tree data for child components\n const treeData: TreeData = {\n treeId,\n get keyboardNavigationBehavior() {\n return props().keyboardNavigationBehavior ?? \"arrow\";\n },\n get direction() {\n return props().direction ?? \"ltr\";\n },\n actions: {\n get onAction() {\n return props().onAction;\n },\n },\n };\n\n // Store in WeakMap using the state as key\n treeDataMap.set(state(), treeData);\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n const s = state();\n const p = props();\n const collection = s.collection;\n const focusedKey = s.focusedKey;\n const direction = p.direction ?? \"ltr\";\n // In RTL, ArrowLeft expands and ArrowRight collapses (opposite of LTR)\n const expandKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const collapseKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n\n if (p.isDisabled) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const nextKey =\n focusedKey != null\n ? findNextNavigableKey(s, collection.getKeyAfter(focusedKey), (k) =>\n collection.getKeyAfter(k),\n )\n : findNextNavigableKey(s, collection.getFirstKey(), (k) => collection.getKeyAfter(k));\n if (nextKey != null) {\n s.setFocusedKey(nextKey);\n }\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prevKey =\n focusedKey != null\n ? findNextNavigableKey(s, collection.getKeyBefore(focusedKey), (k) =>\n collection.getKeyBefore(k),\n )\n : findNextNavigableKey(s, collection.getLastKey(), (k) => collection.getKeyBefore(k));\n if (prevKey != null) {\n s.setFocusedKey(prevKey);\n }\n break;\n }\n case \"ArrowRight\":\n case \"ArrowLeft\": {\n e.preventDefault();\n if (focusedKey != null) {\n const node = collection.getItem(focusedKey);\n if (e.key === expandKey) {\n // Expand or move to first child\n if (node?.isExpandable) {\n if (!s.isExpanded(focusedKey)) {\n s.expandKey(focusedKey);\n } else {\n const children = [...collection.getChildren(focusedKey)];\n if (children.length > 0) {\n s.setFocusedKey(children[0].key);\n }\n }\n }\n } else if (e.key === collapseKey) {\n // Collapse or move to parent\n if (node?.isExpandable && s.isExpanded(focusedKey)) {\n s.collapseKey(focusedKey);\n } else if (node?.parentKey != null) {\n s.setFocusedKey(node.parentKey);\n }\n }\n }\n break;\n }\n case \"Home\": {\n e.preventDefault();\n const firstKey = findNextNavigableKey(s, collection.getFirstKey(), (k) =>\n collection.getKeyAfter(k),\n );\n if (firstKey != null) {\n s.setFocusedKey(firstKey);\n }\n break;\n }\n case \"End\": {\n e.preventDefault();\n const lastKey = findNextNavigableKey(s, collection.getLastKey(), (k) =>\n collection.getKeyBefore(k),\n );\n if (lastKey != null) {\n s.setFocusedKey(lastKey);\n }\n break;\n }\n case \"a\":\n case \"A\": {\n if ((e.ctrlKey || e.metaKey) && s.selectionMode === \"multiple\") {\n e.preventDefault();\n s.selectAll();\n }\n break;\n }\n // Space (selection) and Enter (action) are intentionally absent here.\n // Upstream's useSelectableCollection leaves activation to useSelectableItem.\n // The focus effect below moves DOM focus onto the focused row, so the row's\n // own createSelectableItem handlers receive those keys without duplicating\n // work in the bubbling tree handler.\n case \"Escape\": {\n if (s.selectionMode !== \"none\") {\n e.preventDefault();\n s.clearSelection();\n }\n break;\n }\n case \"*\": {\n // Expand all siblings at current level\n e.preventDefault();\n if (focusedKey != null) {\n const node = collection.getItem(focusedKey);\n if (node) {\n // Find all siblings at the same level\n const parentKey = node.parentKey;\n let siblings: Key[];\n if (parentKey != null) {\n siblings = [...collection.getChildren(parentKey)].map((n) => n.key);\n } else {\n // Root level siblings\n siblings = collection.rows.filter((n) => n.level === 0).map((n) => n.key);\n }\n // Expand all expandable siblings\n for (const siblingKey of siblings) {\n const sibling = collection.getItem(siblingKey);\n if (sibling?.isExpandable && !s.isExpanded(siblingKey)) {\n s.expandKey(siblingKey);\n }\n }\n }\n }\n break;\n }\n }\n };\n\n // The first / last SELECTED key in flattened (visible) order — mirrors React\n // Aria's `SelectionManager.firstSelectedKey`/`lastSelectedKey`, which entry\n // focus prefers over the first/last row.\n const firstSelectedKey = (s: TreeState<T, C>): Key | null => {\n let key = s.collection.getFirstKey();\n while (key != null) {\n if (s.isSelected(key)) return key;\n key = s.collection.getKeyAfter(key);\n }\n return null;\n };\n const lastSelectedKey = (s: TreeState<T, C>): Key | null => {\n let key = s.collection.getLastKey();\n while (key != null) {\n if (s.isSelected(key)) return key;\n key = s.collection.getKeyBefore(key);\n }\n return null;\n };\n\n // Entry focus is handled on `focusin` (BUBBLING) rather than `focus`\n // (non-bubbling): React Aria's `useSelectableCollection.onFocus` bubbles, so a\n // Shift+Tab that the browser parks on a tabbable descendant (e.g. a selection\n // checkbox, which is `tabIndex=0` like upstream) still reaches the collection\n // and is redirected to the focused/selected row. A Solid non-bubbling `focus`\n // handler on the treegrid only fires for forward Tab (the container is the first\n // tab stop) and would strand backward entry on the last checkbox — the same\n // trampoline gotcha the TagGroup port hit. See `createListBox.onListBoxFocus`.\n const onFocusIn = (e: FocusEvent) => {\n const s = state();\n s.setFocused(true);\n\n const currentTarget = e.currentTarget as Element | null;\n const relatedTarget = e.relatedTarget as Element | null;\n // Internal roving moves (focus already inside the tree) are driven by\n // `onKeyDown`; only seed focus when it enters from OUTSIDE the treegrid.\n if (!currentTarget || (relatedTarget && currentTarget.contains(relatedTarget))) {\n return;\n }\n\n let key = s.focusedKey;\n if (key == null) {\n // Shift+Tab backward into the tree (focus arrived from a FOLLOWING element)\n // enters at the last selected row, else the last navigable row; forward Tab\n // enters at the first selected row, else the first navigable row.\n const backward =\n !!relatedTarget &&\n !!(\n currentTarget.compareDocumentPosition(relatedTarget) &\n Node.DOCUMENT_POSITION_FOLLOWING\n );\n key = backward\n ? (lastSelectedKey(s) ??\n findNextNavigableKey(s, s.collection.getLastKey(), (k) => s.collection.getKeyBefore(k)))\n : (firstSelectedKey(s) ??\n findNextNavigableKey(s, s.collection.getFirstKey(), (k) => s.collection.getKeyAfter(k)));\n }\n if (key != null) {\n s.setFocusedKey(key);\n }\n };\n\n const onFocusOut = (e: FocusEvent) => {\n const s = state();\n const currentTarget = e.currentTarget as Element | null;\n const relatedTarget = e.relatedTarget as Element | null;\n // Only clear the focused flag once focus has left the treegrid entirely.\n if (!currentTarget || !relatedTarget || !currentTarget.contains(relatedTarget)) {\n s.setFocused(false);\n }\n };\n\n createEffect(() => {\n const s = state();\n const key = s.focusedKey;\n const el = ref();\n if (!el || key == null) {\n return;\n }\n\n const active = document.activeElement;\n if (!active || (active !== el && !el.contains(active))) {\n return;\n }\n\n const target = el.querySelector<HTMLElement>(`[data-key=\"${key}\"]`);\n if (target && target !== active) {\n target.focus();\n\n if (getInteractionModality() !== \"pointer\") {\n scrollIntoViewport(target, { containingElement: el });\n }\n }\n });\n\n const treeProps = createMemo(() => {\n const p = props();\n const s = state();\n\n const baseProps: Record<string, unknown> = {\n role: \"treegrid\",\n id: treeId,\n \"aria-label\": p[\"aria-label\"],\n \"aria-labelledby\": p[\"aria-labelledby\"],\n \"aria-describedby\": p[\"aria-describedby\"],\n \"aria-multiselectable\": s.selectionMode === \"multiple\" ? true : undefined,\n \"aria-disabled\": p.isDisabled || undefined,\n // Roving container tab stop: `0` while no row is focused (Tab enters the\n // tree), `-1` once a row takes focus (the row holds the tab stop). Mirrors\n // `useSelectableCollection` `tabIndex = focusedKey == null ? 0 : -1`.\n tabIndex: p.isDisabled ? undefined : s.focusedKey == null ? 0 : -1,\n onKeyDown,\n onFocusIn,\n onFocusOut,\n };\n\n // Add row count for virtualized trees\n if (p.isVirtualized) {\n baseProps[\"aria-rowcount\"] = s.collection.rowCount;\n }\n\n return baseProps as JSX.HTMLAttributes<HTMLDivElement>;\n });\n\n return {\n get treeProps() {\n return treeProps();\n },\n };\n}\n","/**\n * createTreeItem - Provides accessibility for a tree item.\n * Based on @react-aria/tree/useTreeItem.\n */\n\nimport { createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport { createId } from \"@proyecto-viviana/solid-stately\";\nimport type {\n Collection,\n Key,\n Selection,\n TreeState,\n TreeCollection,\n} from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeItemProps, TreeItemAria } from \"./types\";\nimport { getTreeData } from \"./createTree\";\nimport { createSelectableItem, type SelectableItemState } from \"../selection/createSelectableItem\";\nimport { mergeCollectionRowInteractionProps } from \"../selection/createCollectionRowInteraction\";\nimport { mergeProps } from \"../utils/mergeProps\";\n\n/**\n * Creates accessibility props for a tree item.\n */\nexport function createTreeItem<T extends object, C extends TreeCollection<T> = TreeCollection<T>>(\n props: Accessor<AriaTreeItemProps<T>>,\n state: Accessor<TreeState<T, C>>,\n ref: Accessor<HTMLElement | null>,\n): TreeItemAria {\n const fallbackRowId = createId();\n const expandButtonId = createId();\n\n const rowId = createMemo(() => {\n const treeData = getTreeData(state());\n return treeData ? `${treeData.treeId}-row-${String(props().node.key)}` : fallbackRowId;\n });\n\n const isSelected = createMemo(() => {\n const s = state();\n const p = props();\n return s.isSelected(p.node.key);\n });\n\n const isExpanded = createMemo(() => {\n const s = state();\n const p = props();\n return s.isExpanded(p.node.key);\n });\n\n const isExpandable = createMemo(() => {\n const p = props();\n return p.node.isExpandable ?? false;\n });\n\n const level = createMemo(() => {\n const p = props();\n return p.node.level;\n });\n\n const selectableState: SelectableItemState<T> = {\n collection: () => state().collection as unknown as Collection<T>,\n isFocused: () => state().isFocused,\n setFocused: (focused: boolean) => state().setFocused(focused),\n focusedKey: () => state().focusedKey,\n childFocusStrategy: () => state().childFocusStrategy,\n setFocusedKey: (key: Key | null, strategy) => state().setFocusedKey(key, strategy),\n selectionMode: () => state().selectionMode,\n selectionBehavior: () => props().selectionBehavior ?? state().selectionBehavior,\n disallowEmptySelection: () => state().disallowEmptySelection,\n selectedKeys: () => state().selectedKeys as Selection,\n disabledKeys: () => state().disabledKeys,\n disabledBehavior: () => state().disabledBehavior,\n isEmpty: () => {\n const keys = state().selectedKeys;\n return keys !== \"all\" && keys.size === 0;\n },\n isSelectAll: () => state().selectedKeys === \"all\",\n isSelected: (key: Key) => state().isSelected(key),\n isDisabled: (key: Key) => {\n const s = state();\n const item = s.collection.getItem(key);\n return (\n s.disabledBehavior === \"all\" &&\n s.isDisabled(key) &&\n item?.props?.disabledBehavior !== \"selection\"\n );\n },\n canSelectItem: (key: Key) => {\n const s = state();\n return s.selectionMode !== \"none\" && !s.isDisabled(key);\n },\n setSelectionBehavior: (behavior) => state().setSelectionBehavior(behavior),\n toggleSelection: (key: Key) => state().toggleSelection(key),\n replaceSelection: (key: Key) => state().replaceSelection(key),\n setSelectedKeys: (keys: Iterable<Key>) => state().setSelectedKeys(keys),\n selectAll: () => state().selectAll(),\n clearSelection: () => state().clearSelection(),\n toggleSelectAll: () => state().toggleSelectAll(),\n extendSelection: (toKey: Key, _collection: Collection<T>) => state().extendSelection(toKey),\n };\n\n const selectableItem = createSelectableItem<T>(\n () => {\n const s = state();\n const p = props();\n const treeData = getTreeData(s);\n const treeAction = treeData?.actions.onAction;\n const shouldToggleOnAction =\n !treeAction && !p.onAction && s.selectionMode === \"none\" && isExpandable();\n\n return {\n key: p.node.key,\n id: rowId(),\n isVirtualized: p.isVirtualized,\n isDisabled: p.isDisabled,\n onAction:\n treeAction || p.onAction || shouldToggleOnAction\n ? () => {\n p.onAction?.();\n treeAction?.(p.node.key);\n if (shouldToggleOnAction) {\n s.toggleKey(p.node.key);\n }\n }\n : undefined,\n };\n },\n selectableState,\n ref,\n );\n\n // Compute sibling position (aria-posinset/aria-setsize)\n const siblingInfo = createMemo(() => {\n const s = state();\n const p = props();\n const node = p.node;\n const parentKey = node.parentKey;\n\n if (parentKey != null) {\n const parentNode = s.collection.getItem(parentKey);\n if (parentNode) {\n return {\n posinset: node.index + 1, // 1-based\n setsize: parentNode.childNodes.length,\n };\n }\n }\n\n // Root-level: count root nodes\n const rootNodes = s.collection.rows.filter((n) => n.level === 0);\n const rootIndex = rootNodes.findIndex((n) => n.key === node.key);\n return {\n posinset: rootIndex >= 0 ? rootIndex + 1 : node.index + 1,\n setsize: rootNodes.length,\n };\n });\n\n const rowProps = createMemo(() => {\n const p = props();\n const node = p.node;\n const { posinset, setsize } = siblingInfo();\n\n // Use textValue for aria-label (if available), or explicit textValue prop\n const textValue = p.textValue ?? node.textValue;\n\n const baseProps: Record<string, unknown> = {\n role: \"row\",\n \"aria-label\": textValue || undefined,\n \"aria-selected\": selectableState.canSelectItem?.(node.key) ? isSelected() : undefined,\n \"aria-disabled\": selectableItem.isDisabled() || undefined,\n \"aria-expanded\": isExpandable() ? isExpanded() : undefined,\n \"aria-level\": node.level + 1, // 1-based for ARIA\n \"aria-posinset\": posinset,\n \"aria-setsize\": setsize,\n };\n\n // Add aria-rowindex for virtualized trees\n if (p.isVirtualized && node.rowIndex != null) {\n baseProps[\"aria-rowindex\"] = node.rowIndex + 1; // 1-based\n }\n\n const treeData = getTreeData(state());\n const mergedProps = mergeProps<JSX.HTMLAttributes<HTMLDivElement>>(\n selectableItem.itemProps,\n baseProps,\n );\n\n return mergeCollectionRowInteractionProps(mergedProps, {\n ref,\n keyboardNavigationBehavior: () => treeData?.keyboardNavigationBehavior ?? \"arrow\",\n direction: () => treeData?.direction ?? \"ltr\",\n });\n });\n\n const gridCellProps = createMemo(() => {\n return {\n role: \"gridcell\",\n \"aria-colindex\": 1,\n } as JSX.HTMLAttributes<HTMLDivElement>;\n });\n\n // Expand button handler\n const onExpandClick = (e: MouseEvent) => {\n e.stopPropagation(); // Don't trigger row click\n const s = state();\n const p = props();\n\n if (selectableItem.isDisabled()) return;\n\n s.toggleKey(p.node.key);\n };\n\n const stopPointerPropagation = (e: Event) => {\n // Prevent row pointer handlers from flipping pressed state and re-rendering\n // before the button click handler can run.\n e.stopPropagation();\n };\n\n const expandButtonProps = createMemo(() => {\n const baseProps: Record<string, unknown> = {\n type: \"button\",\n id: expandButtonId,\n \"aria-label\": isExpanded() ? \"Collapse\" : \"Expand\",\n \"aria-labelledby\": isExpandable() ? `${expandButtonId} ${rowId()}` : undefined,\n \"data-react-aria-prevent-focus\": true,\n onClick: onExpandClick,\n onPointerDown: stopPointerPropagation,\n onPointerUp: stopPointerPropagation,\n onMouseDown: stopPointerPropagation,\n onMouseUp: stopPointerPropagation,\n tabIndex: -1, // Not in tab order, use arrow keys\n \"aria-hidden\": !isExpandable() ? true : undefined,\n };\n\n return baseProps as JSX.ButtonHTMLAttributes<HTMLButtonElement>;\n });\n\n return {\n get rowProps() {\n return rowProps();\n },\n get gridCellProps() {\n return gridCellProps();\n },\n get expandButtonProps() {\n return expandButtonProps();\n },\n get isSelected() {\n return isSelected();\n },\n get isDisabled() {\n return selectableItem.isDisabled();\n },\n get isPressed() {\n return selectableItem.isPressed();\n },\n get isExpanded() {\n return isExpanded();\n },\n get isExpandable() {\n return isExpandable();\n },\n get level() {\n return level();\n },\n };\n}\n","/**\n * createTreeSelectionCheckbox - Provides accessibility for a tree item's selection checkbox.\n * Based on @react-aria/gridlist/useGridListSelectionCheckbox.\n */\n\nimport { createMemo, type Accessor } from \"solid-js\";\nimport type { JSX } from \"solid-js\";\nimport { createId } from \"@proyecto-viviana/solid-stately\";\nimport type { TreeState, TreeCollection } from \"@proyecto-viviana/solid-stately\";\nimport type { AriaTreeSelectionCheckboxProps, TreeSelectionCheckboxAria } from \"./types\";\nimport { getTreeData } from \"./createTree\";\n\n/**\n * Creates accessibility props for a tree selection checkbox.\n */\nexport function createTreeSelectionCheckbox<\n T extends object,\n C extends TreeCollection<T> = TreeCollection<T>,\n>(\n props: Accessor<AriaTreeSelectionCheckboxProps>,\n state: Accessor<TreeState<T, C>>,\n): TreeSelectionCheckboxAria {\n const fallbackRowId = createId();\n const checkboxId = createId();\n\n // Mirror @react-aria/tree getRowId: the checkbox's aria-labelledby folds its own\n // \"Select\" label with the row's id so the SR announces \"Select <row text>\".\n const rowId = createMemo(() => {\n const treeData = getTreeData(state());\n return treeData ? `${treeData.treeId}-row-${String(props().key)}` : fallbackRowId;\n });\n\n const isSelected = createMemo(() => {\n const s = state();\n const p = props();\n return s.isSelected(p.key);\n });\n\n const isDisabled = createMemo(() => {\n const s = state();\n const p = props();\n return s.isDisabled(p.key);\n });\n\n const onChange = (e: Event) => {\n const s = state();\n const p = props();\n const target = e.target as HTMLInputElement;\n\n if (isDisabled()) return;\n\n if (target.checked) {\n s.toggleSelection(p.key);\n } else {\n s.toggleSelection(p.key);\n }\n };\n\n const onClick = (e: MouseEvent) => {\n // Stop propagation to prevent row click from also firing\n e.stopPropagation();\n };\n\n const checkboxProps = createMemo(() => {\n const baseProps: Record<string, unknown> = {\n type: \"checkbox\",\n id: checkboxId,\n \"aria-label\": \"Select\",\n \"aria-labelledby\": `${checkboxId} ${rowId()}`,\n checked: isSelected(),\n disabled: isDisabled(),\n onChange,\n onClick,\n };\n\n return baseProps as JSX.InputHTMLAttributes<HTMLInputElement>;\n });\n\n return {\n get checkboxProps() {\n return checkboxProps();\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/_chunk/tree.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as mergeProps$1 } from "./env.jsx";
|
|
2
2
|
import { S as scrollIntoViewport } from "./utils.jsx";
|
|
3
3
|
import { o as getInteractionModality } from "./createInteractionModality.jsx";
|
|
4
4
|
import { n as createSelectableItem } from "./createSelectableItem.jsx";
|
|
@@ -138,16 +138,37 @@ function createTree(props, state, ref) {
|
|
|
138
138
|
break;
|
|
139
139
|
}
|
|
140
140
|
};
|
|
141
|
-
const
|
|
141
|
+
const firstSelectedKey = (s) => {
|
|
142
|
+
let key = s.collection.getFirstKey();
|
|
143
|
+
while (key != null) {
|
|
144
|
+
if (s.isSelected(key)) return key;
|
|
145
|
+
key = s.collection.getKeyAfter(key);
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
const lastSelectedKey = (s) => {
|
|
150
|
+
let key = s.collection.getLastKey();
|
|
151
|
+
while (key != null) {
|
|
152
|
+
if (s.isSelected(key)) return key;
|
|
153
|
+
key = s.collection.getKeyBefore(key);
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
};
|
|
157
|
+
const onFocusIn = (e) => {
|
|
142
158
|
const s = state();
|
|
143
159
|
s.setFocused(true);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
160
|
+
const currentTarget = e.currentTarget;
|
|
161
|
+
const relatedTarget = e.relatedTarget;
|
|
162
|
+
if (!currentTarget || relatedTarget && currentTarget.contains(relatedTarget)) return;
|
|
163
|
+
let key = s.focusedKey;
|
|
164
|
+
if (key == null) key = !!relatedTarget && !!(currentTarget.compareDocumentPosition(relatedTarget) & Node.DOCUMENT_POSITION_FOLLOWING) ? lastSelectedKey(s) ?? findNextNavigableKey(s, s.collection.getLastKey(), (k) => s.collection.getKeyBefore(k)) : firstSelectedKey(s) ?? findNextNavigableKey(s, s.collection.getFirstKey(), (k) => s.collection.getKeyAfter(k));
|
|
165
|
+
if (key != null) s.setFocusedKey(key);
|
|
148
166
|
};
|
|
149
|
-
const
|
|
150
|
-
state()
|
|
167
|
+
const onFocusOut = (e) => {
|
|
168
|
+
const s = state();
|
|
169
|
+
const currentTarget = e.currentTarget;
|
|
170
|
+
const relatedTarget = e.relatedTarget;
|
|
171
|
+
if (!currentTarget || !relatedTarget || !currentTarget.contains(relatedTarget)) s.setFocused(false);
|
|
151
172
|
};
|
|
152
173
|
createEffect(() => {
|
|
153
174
|
const key = state().focusedKey;
|
|
@@ -172,10 +193,10 @@ function createTree(props, state, ref) {
|
|
|
172
193
|
"aria-describedby": p["aria-describedby"],
|
|
173
194
|
"aria-multiselectable": s.selectionMode === "multiple" ? true : void 0,
|
|
174
195
|
"aria-disabled": p.isDisabled || void 0,
|
|
175
|
-
tabIndex: p.isDisabled ? void 0 : 0,
|
|
196
|
+
tabIndex: p.isDisabled ? void 0 : s.focusedKey == null ? 0 : -1,
|
|
176
197
|
onKeyDown,
|
|
177
|
-
|
|
178
|
-
|
|
198
|
+
onFocusIn,
|
|
199
|
+
onFocusOut
|
|
179
200
|
};
|
|
180
201
|
if (p.isVirtualized) baseProps["aria-rowcount"] = s.collection.rowCount;
|
|
181
202
|
return baseProps;
|
|
@@ -304,7 +325,7 @@ function createTreeItem(props, state, ref) {
|
|
|
304
325
|
};
|
|
305
326
|
if (p.isVirtualized && node.rowIndex != null) baseProps["aria-rowindex"] = node.rowIndex + 1;
|
|
306
327
|
const treeData = getTreeData(state());
|
|
307
|
-
return mergeCollectionRowInteractionProps(mergeProps(selectableItem.itemProps, baseProps), {
|
|
328
|
+
return mergeCollectionRowInteractionProps(mergeProps$1(selectableItem.itemProps, baseProps), {
|
|
308
329
|
ref,
|
|
309
330
|
keyboardNavigationBehavior: () => treeData?.keyboardNavigationBehavior ?? "arrow",
|
|
310
331
|
direction: () => treeData?.direction ?? "ltr"
|
|
@@ -382,6 +403,12 @@ function createTreeItem(props, state, ref) {
|
|
|
382
403
|
* Creates accessibility props for a tree selection checkbox.
|
|
383
404
|
*/
|
|
384
405
|
function createTreeSelectionCheckbox(props, state) {
|
|
406
|
+
const fallbackRowId = createId();
|
|
407
|
+
const checkboxId = createId();
|
|
408
|
+
const rowId = createMemo(() => {
|
|
409
|
+
const treeData = getTreeData(state());
|
|
410
|
+
return treeData ? `${treeData.treeId}-row-${String(props().key)}` : fallbackRowId;
|
|
411
|
+
});
|
|
385
412
|
const isSelected = createMemo(() => {
|
|
386
413
|
const s = state();
|
|
387
414
|
const p = props();
|
|
@@ -406,12 +433,13 @@ function createTreeSelectionCheckbox(props, state) {
|
|
|
406
433
|
const checkboxProps = createMemo(() => {
|
|
407
434
|
return {
|
|
408
435
|
type: "checkbox",
|
|
436
|
+
id: checkboxId,
|
|
409
437
|
"aria-label": "Select",
|
|
438
|
+
"aria-labelledby": `${checkboxId} ${rowId()}`,
|
|
410
439
|
checked: isSelected(),
|
|
411
440
|
disabled: isDisabled(),
|
|
412
441
|
onChange,
|
|
413
|
-
onClick
|
|
414
|
-
tabIndex: -1
|
|
442
|
+
onClick
|
|
415
443
|
};
|
|
416
444
|
});
|
|
417
445
|
return { get checkboxProps() {
|