@proyecto-viviana/solidaria 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +31 -236
- package/dist/actiongroup/createActionGroup.d.ts +29 -0
- package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
- package/dist/actiongroup/index.d.ts +2 -0
- package/dist/actiongroup/index.d.ts.map +1 -0
- package/dist/autocomplete/createAutocomplete.d.ts +16 -12
- package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
- package/dist/autocomplete/index.d.ts +1 -1
- package/dist/autocomplete/index.d.ts.map +1 -1
- package/dist/breadcrumbs/createBreadcrumbs.d.ts +11 -7
- package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
- package/dist/breadcrumbs/index.d.ts +1 -1
- package/dist/button/createButton.d.ts +1 -1
- package/dist/button/createButton.d.ts.map +1 -1
- package/dist/button/createToggleButton.d.ts +3 -3
- package/dist/button/createToggleButtonGroup.d.ts +32 -0
- package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
- package/dist/button/index.d.ts +6 -4
- package/dist/button/index.d.ts.map +1 -1
- package/dist/button/types.d.ts +18 -12
- package/dist/button/types.d.ts.map +1 -1
- package/dist/calendar/createCalendar.d.ts +15 -5
- package/dist/calendar/createCalendar.d.ts.map +1 -1
- package/dist/calendar/createCalendarCell.d.ts +8 -2
- package/dist/calendar/createCalendarCell.d.ts.map +1 -1
- package/dist/calendar/createCalendarGrid.d.ts +4 -4
- package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendar.d.ts +15 -5
- package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
- package/dist/calendar/createRangeCalendarCell.d.ts +7 -3
- package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
- package/dist/calendar/index.d.ts +5 -5
- package/dist/calendar/index.d.ts.map +1 -1
- package/dist/calendar/intl/index.d.ts +12 -0
- package/dist/calendar/intl/index.d.ts.map +1 -0
- package/dist/calendar/utils.d.ts +12 -0
- package/dist/calendar/utils.d.ts.map +1 -0
- package/dist/checkbox/createCheckbox.d.ts +6 -6
- package/dist/checkbox/createCheckbox.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroup.d.ts +11 -7
- package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroupItem.d.ts +4 -4
- package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
- package/dist/checkbox/createCheckboxGroupState.d.ts +2 -2
- package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -1
- package/dist/checkbox/index.d.ts +8 -8
- package/dist/checkbox/index.d.ts.map +1 -1
- package/dist/collections/index.d.ts +56 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/color/createColorArea.d.ts +3 -3
- package/dist/color/createColorArea.d.ts.map +1 -1
- package/dist/color/createColorField.d.ts +4 -4
- package/dist/color/createColorField.d.ts.map +1 -1
- package/dist/color/createColorSlider.d.ts +4 -4
- package/dist/color/createColorSlider.d.ts.map +1 -1
- package/dist/color/createColorSwatch.d.ts +2 -2
- package/dist/color/createColorSwatch.d.ts.map +1 -1
- package/dist/color/createColorWheel.d.ts +3 -3
- package/dist/color/createColorWheel.d.ts.map +1 -1
- package/dist/color/index.d.ts +6 -6
- package/dist/color/types.d.ts +98 -16
- package/dist/color/types.d.ts.map +1 -1
- package/dist/combobox/createComboBox.d.ts +16 -7
- package/dist/combobox/createComboBox.d.ts.map +1 -1
- package/dist/combobox/index.d.ts +1 -1
- package/dist/combobox/intl/index.d.ts +1 -1
- package/dist/datepicker/createDateField.d.ts +18 -6
- package/dist/datepicker/createDateField.d.ts.map +1 -1
- package/dist/datepicker/createDatePicker.d.ts +57 -5
- package/dist/datepicker/createDatePicker.d.ts.map +1 -1
- package/dist/datepicker/createDatePickerGroup.d.ts +19 -0
- package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -0
- package/dist/datepicker/createDateRangePicker.d.ts +42 -0
- package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
- package/dist/datepicker/createDateSegment.d.ts +11 -3
- package/dist/datepicker/createDateSegment.d.ts.map +1 -1
- package/dist/datepicker/createTimeField.d.ts +11 -5
- package/dist/datepicker/createTimeField.d.ts.map +1 -1
- package/dist/datepicker/createTimeSegment.d.ts +29 -0
- package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +7 -4
- package/dist/datepicker/index.d.ts.map +1 -1
- package/dist/dialog/createDialog.d.ts +5 -5
- package/dist/dialog/createDialog.d.ts.map +1 -1
- package/dist/dialog/index.d.ts +2 -2
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/dialog/types.d.ts +4 -4
- package/dist/disclosure/createDisclosure.d.ts +5 -2
- package/dist/disclosure/createDisclosure.d.ts.map +1 -1
- package/dist/disclosure/createDisclosureGroup.d.ts +4 -3
- package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
- package/dist/disclosure/index.d.ts +2 -2
- package/dist/dnd/createDrag.d.ts +2 -2
- package/dist/dnd/createDrag.d.ts.map +1 -1
- package/dist/dnd/createDraggableCollection.d.ts +6 -2
- package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
- package/dist/dnd/createDraggableItem.d.ts +3 -3
- package/dist/dnd/createDraggableItem.d.ts.map +1 -1
- package/dist/dnd/createDrop.d.ts +2 -2
- package/dist/dnd/createDrop.d.ts.map +1 -1
- package/dist/dnd/createDroppableCollection.d.ts +55 -4
- package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
- package/dist/dnd/createDroppableItem.d.ts +3 -3
- package/dist/dnd/createDroppableItem.d.ts.map +1 -1
- package/dist/dnd/index.d.ts +12 -12
- package/dist/dnd/index.d.ts.map +1 -1
- package/dist/dnd/types.d.ts +2 -2
- package/dist/dnd/types.d.ts.map +1 -1
- package/dist/dnd/utils.d.ts +1 -1
- package/dist/dnd/utils.d.ts.map +1 -1
- package/dist/focus/FocusScope.d.ts +1 -1
- package/dist/focus/FocusScope.d.ts.map +1 -1
- package/dist/focus/createAutoFocus.d.ts.map +1 -1
- package/dist/focus/createFocusRestore.d.ts.map +1 -1
- package/dist/focus/createVirtualFocus.d.ts +4 -4
- package/dist/focus/createVirtualFocus.d.ts.map +1 -1
- package/dist/focus/index.d.ts +4 -4
- package/dist/focus/index.d.ts.map +1 -1
- package/dist/form/createFormReset.d.ts +1 -1
- package/dist/form/createFormValidation.d.ts +3 -3
- package/dist/form/createFormValidation.d.ts.map +1 -1
- package/dist/form/index.d.ts +2 -2
- package/dist/form/index.d.ts.map +1 -1
- package/dist/grid/GridKeyboardDelegate.d.ts +5 -5
- package/dist/grid/createGrid.d.ts +3 -3
- package/dist/grid/createGrid.d.ts.map +1 -1
- package/dist/grid/createGridCell.d.ts +3 -3
- package/dist/grid/createGridRow.d.ts +3 -3
- package/dist/grid/index.d.ts +5 -5
- package/dist/grid/types.d.ts +8 -8
- package/dist/gridlist/createGridList.d.ts +6 -4
- package/dist/gridlist/createGridList.d.ts.map +1 -1
- package/dist/gridlist/createGridListItem.d.ts +4 -4
- package/dist/gridlist/createGridListItem.d.ts.map +1 -1
- package/dist/gridlist/createGridListSelectionCheckbox.d.ts +3 -3
- package/dist/gridlist/createGridListSelectionCheckbox.d.ts.map +1 -1
- package/dist/gridlist/index.d.ts +4 -4
- package/dist/gridlist/types.d.ts +11 -7
- package/dist/gridlist/types.d.ts.map +1 -1
- package/dist/i18n/createCollator.d.ts.map +1 -1
- package/dist/i18n/createDateFormatter.d.ts.map +1 -1
- package/dist/i18n/createFilter.d.ts.map +1 -1
- package/dist/i18n/createNumberFormatter.d.ts +1 -1
- package/dist/i18n/createNumberFormatter.d.ts.map +1 -1
- package/dist/i18n/createStringFormatter.d.ts +2 -2
- package/dist/i18n/createStringFormatter.d.ts.map +1 -1
- package/dist/i18n/index.d.ts +8 -8
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/locale.d.ts +2 -2
- package/dist/i18n/locale.d.ts.map +1 -1
- package/dist/i18n/utils.d.ts.map +1 -1
- package/dist/index.d.ts +52 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18089 -15690
- package/dist/index.js.map +1 -7
- package/dist/index.jsx +18242 -0
- package/dist/index.jsx.map +1 -0
- package/dist/interactions/FocusableProvider.d.ts +2 -2
- package/dist/interactions/FocusableProvider.d.ts.map +1 -1
- package/dist/interactions/PressEvent.d.ts +2 -2
- package/dist/interactions/createFocus.d.ts +1 -1
- package/dist/interactions/createFocus.d.ts.map +1 -1
- package/dist/interactions/createFocusRing.d.ts +1 -1
- package/dist/interactions/createFocusRing.d.ts.map +1 -1
- package/dist/interactions/createFocusWithin.d.ts +1 -1
- package/dist/interactions/createFocusWithin.d.ts.map +1 -1
- package/dist/interactions/createFocusable.d.ts +3 -3
- package/dist/interactions/createFocusable.d.ts.map +1 -1
- package/dist/interactions/createHover.d.ts +5 -5
- package/dist/interactions/createHover.d.ts.map +1 -1
- package/dist/interactions/createInteractionModality.d.ts +3 -3
- package/dist/interactions/createInteractionModality.d.ts.map +1 -1
- package/dist/interactions/createKeyboard.d.ts +1 -1
- package/dist/interactions/createLongPress.d.ts +5 -5
- package/dist/interactions/createMove.d.ts +5 -5
- package/dist/interactions/createMove.d.ts.map +1 -1
- package/dist/interactions/createPress.d.ts +4 -4
- package/dist/interactions/createPress.d.ts.map +1 -1
- package/dist/interactions/index.d.ts +12 -12
- package/dist/interactions/index.d.ts.map +1 -1
- package/dist/label/createField.d.ts +4 -4
- package/dist/label/createField.d.ts.map +1 -1
- package/dist/label/createLabel.d.ts +7 -7
- package/dist/label/createLabel.d.ts.map +1 -1
- package/dist/label/createLabels.d.ts +1 -1
- package/dist/label/createLabels.d.ts.map +1 -1
- package/dist/label/index.d.ts +5 -5
- package/dist/landmark/createLandmark.d.ts +5 -5
- package/dist/landmark/createLandmark.d.ts.map +1 -1
- package/dist/landmark/index.d.ts +1 -1
- package/dist/link/createLink.d.ts +23 -7
- package/dist/link/createLink.d.ts.map +1 -1
- package/dist/link/index.d.ts +1 -1
- package/dist/listbox/createListBox.d.ts +12 -6
- package/dist/listbox/createListBox.d.ts.map +1 -1
- package/dist/listbox/createOption.d.ts +21 -4
- package/dist/listbox/createOption.d.ts.map +1 -1
- package/dist/listbox/index.d.ts +2 -2
- package/dist/listbox/index.d.ts.map +1 -1
- package/dist/live-announcer/announce.d.ts +2 -2
- package/dist/live-announcer/announce.d.ts.map +1 -1
- package/dist/live-announcer/index.d.ts +1 -1
- package/dist/menu/createMenu.d.ts +8 -7
- package/dist/menu/createMenu.d.ts.map +1 -1
- package/dist/menu/createMenuItem.d.ts +16 -4
- package/dist/menu/createMenuItem.d.ts.map +1 -1
- package/dist/menu/createMenuTrigger.d.ts +4 -4
- package/dist/menu/index.d.ts +3 -3
- package/dist/menu/index.d.ts.map +1 -1
- package/dist/meter/createMeter.d.ts +6 -6
- package/dist/meter/createMeter.d.ts.map +1 -1
- package/dist/meter/index.d.ts +1 -1
- package/dist/numberfield/createNumberField.d.ts +27 -8
- package/dist/numberfield/createNumberField.d.ts.map +1 -1
- package/dist/numberfield/index.d.ts +1 -1
- package/dist/overlays/ariaHideOutside.d.ts.map +1 -1
- package/dist/overlays/createModal.d.ts +19 -3
- package/dist/overlays/createModal.d.ts.map +1 -1
- package/dist/overlays/createOverlay.d.ts +1 -1
- package/dist/overlays/createOverlay.d.ts.map +1 -1
- package/dist/overlays/createOverlayTrigger.d.ts +6 -6
- package/dist/overlays/index.d.ts +6 -6
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/popover/calculatePosition.d.ts +4 -4
- package/dist/popover/calculatePosition.d.ts.map +1 -1
- package/dist/popover/createOverlayPosition.d.ts +3 -3
- package/dist/popover/createOverlayPosition.d.ts.map +1 -1
- package/dist/popover/createPopover.d.ts +4 -4
- package/dist/popover/createPopover.d.ts.map +1 -1
- package/dist/popover/index.d.ts +3 -3
- package/dist/progress/createProgressBar.d.ts +7 -5
- package/dist/progress/createProgressBar.d.ts.map +1 -1
- package/dist/progress/index.d.ts +1 -1
- package/dist/radio/createRadio.d.ts +7 -7
- package/dist/radio/createRadio.d.ts.map +1 -1
- package/dist/radio/createRadioGroup.d.ts +11 -11
- package/dist/radio/createRadioGroup.d.ts.map +1 -1
- package/dist/radio/createRadioGroupState.d.ts +3 -3
- package/dist/radio/createRadioGroupState.d.ts.map +1 -1
- package/dist/radio/index.d.ts +3 -3
- package/dist/radio/index.d.ts.map +1 -1
- package/dist/searchfield/createSearchField.d.ts +7 -7
- package/dist/searchfield/createSearchField.d.ts.map +1 -1
- package/dist/searchfield/index.d.ts +2 -2
- package/dist/select/createHiddenSelect.d.ts +4 -4
- package/dist/select/createHiddenSelect.d.ts.map +1 -1
- package/dist/select/createSelect.d.ts +14 -6
- package/dist/select/createSelect.d.ts.map +1 -1
- package/dist/select/index.d.ts +2 -2
- package/dist/select/index.d.ts.map +1 -1
- package/dist/selection/createTypeSelect.d.ts +2 -2
- package/dist/selection/index.d.ts +1 -1
- package/dist/separator/createSeparator.d.ts +9 -5
- package/dist/separator/createSeparator.d.ts.map +1 -1
- package/dist/separator/index.d.ts +1 -1
- package/dist/slider/createSlider.d.ts +11 -7
- package/dist/slider/createSlider.d.ts.map +1 -1
- package/dist/slider/index.d.ts +2 -2
- package/dist/ssr/index.d.ts +1 -1
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/steplist/createStepList.d.ts +36 -0
- package/dist/steplist/createStepList.d.ts.map +1 -0
- package/dist/steplist/index.d.ts +2 -0
- package/dist/steplist/index.d.ts.map +1 -0
- package/dist/switch/createSwitch.d.ts +6 -4
- package/dist/switch/createSwitch.d.ts.map +1 -1
- package/dist/switch/index.d.ts +1 -1
- package/dist/table/createTable.d.ts +3 -3
- package/dist/table/createTable.d.ts.map +1 -1
- package/dist/table/createTableCell.d.ts +3 -3
- package/dist/table/createTableCell.d.ts.map +1 -1
- package/dist/table/createTableColumnHeader.d.ts +3 -3
- package/dist/table/createTableColumnHeader.d.ts.map +1 -1
- package/dist/table/createTableColumnResize.d.ts +41 -0
- package/dist/table/createTableColumnResize.d.ts.map +1 -0
- package/dist/table/createTableHeaderRow.d.ts +3 -3
- package/dist/table/createTableRow.d.ts +3 -3
- package/dist/table/createTableRow.d.ts.map +1 -1
- package/dist/table/createTableRowGroup.d.ts +2 -2
- package/dist/table/createTableRowGroup.d.ts.map +1 -1
- package/dist/table/createTableSelectAllCheckbox.d.ts +3 -3
- package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
- package/dist/table/createTableSelectionCheckbox.d.ts +3 -3
- package/dist/table/index.d.ts +11 -9
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/types.d.ts +15 -7
- package/dist/table/types.d.ts.map +1 -1
- package/dist/tabs/createTabs.d.ts +28 -25
- package/dist/tabs/createTabs.d.ts.map +1 -1
- package/dist/tabs/index.d.ts +1 -1
- package/dist/tag/createTag.d.ts +2 -2
- package/dist/tag/createTag.d.ts.map +1 -1
- package/dist/tag/createTagGroup.d.ts +5 -5
- package/dist/tag/createTagGroup.d.ts.map +1 -1
- package/dist/tag/index.d.ts +2 -2
- package/dist/tag/index.d.ts.map +1 -1
- package/dist/textfield/createTextField.d.ts +17 -11
- package/dist/textfield/createTextField.d.ts.map +1 -1
- package/dist/textfield/index.d.ts +1 -1
- package/dist/textfield/index.d.ts.map +1 -1
- package/dist/toast/createToast.d.ts +6 -2
- package/dist/toast/createToast.d.ts.map +1 -1
- package/dist/toast/createToastRegion.d.ts +5 -3
- package/dist/toast/createToastRegion.d.ts.map +1 -1
- package/dist/toast/index.d.ts +2 -2
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toggle/createToggle.d.ts +9 -9
- package/dist/toggle/createToggle.d.ts.map +1 -1
- package/dist/toggle/createToggleState.d.ts +2 -2
- package/dist/toggle/createToggleState.d.ts.map +1 -1
- package/dist/toggle/index.d.ts +4 -4
- package/dist/toggle/index.d.ts.map +1 -1
- package/dist/toolbar/createToolbar.d.ts +9 -9
- package/dist/toolbar/createToolbar.d.ts.map +1 -1
- package/dist/toolbar/index.d.ts +1 -1
- package/dist/toolbar/index.d.ts.map +1 -1
- package/dist/tooltip/createTooltip.d.ts +5 -5
- package/dist/tooltip/createTooltip.d.ts.map +1 -1
- package/dist/tooltip/createTooltipTrigger.d.ts +10 -5
- package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
- package/dist/tooltip/index.d.ts +2 -2
- package/dist/tree/createTree.d.ts +3 -3
- package/dist/tree/createTree.d.ts.map +1 -1
- package/dist/tree/createTreeItem.d.ts +4 -4
- package/dist/tree/createTreeItem.d.ts.map +1 -1
- package/dist/tree/createTreeSelectionCheckbox.d.ts +3 -3
- package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
- package/dist/tree/index.d.ts +4 -4
- package/dist/tree/types.d.ts +13 -5
- package/dist/tree/types.d.ts.map +1 -1
- package/dist/utils/createDescription.d.ts +2 -2
- package/dist/utils/createDescription.d.ts.map +1 -1
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/focus.d.ts +1 -1
- package/dist/utils/focus.d.ts.map +1 -1
- package/dist/utils/geometry.d.ts.map +1 -1
- package/dist/utils/index.d.ts +12 -12
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/mergeProps.d.ts.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/utils/reactivity.d.ts +1 -1
- package/dist/visually-hidden/createVisuallyHidden.d.ts +2 -2
- package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
- package/dist/visually-hidden/index.d.ts +1 -1
- package/package.json +34 -32
- package/src/actiongroup/createActionGroup.ts +334 -0
- package/src/actiongroup/index.ts +8 -0
- package/src/autocomplete/createAutocomplete.ts +137 -131
- package/src/autocomplete/index.ts +1 -1
- package/src/breadcrumbs/createBreadcrumbs.ts +37 -51
- package/src/breadcrumbs/index.ts +1 -1
- package/src/button/createButton.ts +102 -73
- package/src/button/createToggleButton.ts +10 -10
- package/src/button/createToggleButtonGroup.ts +121 -0
- package/src/button/index.ts +10 -4
- package/src/button/types.ts +18 -12
- package/src/calendar/createCalendar.ts +62 -29
- package/src/calendar/createCalendarCell.ts +102 -48
- package/src/calendar/createCalendarGrid.ts +78 -47
- package/src/calendar/createRangeCalendar.ts +66 -31
- package/src/calendar/createRangeCalendarCell.ts +115 -37
- package/src/calendar/index.ts +5 -9
- package/src/calendar/intl/index.ts +210 -0
- package/src/calendar/utils.ts +227 -0
- package/src/checkbox/createCheckbox.ts +13 -21
- package/src/checkbox/createCheckboxGroup.ts +86 -45
- package/src/checkbox/createCheckboxGroupItem.ts +16 -27
- package/src/checkbox/createCheckboxGroupState.ts +3 -22
- package/src/checkbox/index.ts +8 -10
- package/src/collections/index.ts +246 -0
- package/src/color/createColorArea.ts +458 -314
- package/src/color/createColorField.ts +186 -137
- package/src/color/createColorSlider.ts +444 -197
- package/src/color/createColorSwatch.ts +65 -40
- package/src/color/createColorWheel.ts +343 -208
- package/src/color/index.ts +24 -24
- package/src/color/types.ts +198 -116
- package/src/combobox/createComboBox.ts +727 -647
- package/src/combobox/index.ts +6 -6
- package/src/combobox/intl/index.ts +5 -5
- package/src/datepicker/createDateField.ts +192 -39
- package/src/datepicker/createDatePicker.ts +294 -63
- package/src/datepicker/createDatePickerGroup.ts +149 -0
- package/src/datepicker/createDateRangePicker.ts +294 -0
- package/src/datepicker/createDateSegment.ts +316 -75
- package/src/datepicker/createTimeField.ts +38 -34
- package/src/datepicker/createTimeSegment.ts +352 -0
- package/src/datepicker/index.ts +24 -11
- package/src/dialog/createDialog.ts +127 -120
- package/src/dialog/index.ts +2 -2
- package/src/dialog/types.ts +19 -19
- package/src/disclosure/createDisclosure.ts +138 -33
- package/src/disclosure/createDisclosureGroup.ts +8 -18
- package/src/disclosure/index.ts +2 -2
- package/src/dnd/createDrag.ts +218 -209
- package/src/dnd/createDraggableCollection.ts +96 -63
- package/src/dnd/createDraggableItem.ts +260 -243
- package/src/dnd/createDrop.ts +313 -321
- package/src/dnd/createDroppableCollection.ts +799 -293
- package/src/dnd/createDroppableItem.ts +215 -213
- package/src/dnd/index.ts +66 -47
- package/src/dnd/types.ts +86 -89
- package/src/dnd/utils.ts +281 -294
- package/src/focus/FocusScope.tsx +155 -164
- package/src/focus/createAutoFocus.ts +305 -321
- package/src/focus/createFocusRestore.ts +300 -313
- package/src/focus/createVirtualFocus.ts +380 -396
- package/src/focus/index.ts +4 -8
- package/src/form/createFormReset.ts +4 -4
- package/src/form/createFormValidation.ts +201 -224
- package/src/form/index.ts +8 -11
- package/src/grid/GridKeyboardDelegate.ts +30 -30
- package/src/grid/createGrid.ts +38 -36
- package/src/grid/createGridCell.ts +18 -18
- package/src/grid/createGridRow.ts +14 -14
- package/src/grid/index.ts +5 -5
- package/src/grid/types.ts +8 -8
- package/src/gridlist/createGridList.ts +45 -24
- package/src/gridlist/createGridListItem.ts +68 -23
- package/src/gridlist/createGridListSelectionCheckbox.ts +12 -9
- package/src/gridlist/index.ts +4 -4
- package/src/gridlist/types.ts +11 -7
- package/src/i18n/createCollator.ts +66 -79
- package/src/i18n/createDateFormatter.ts +75 -83
- package/src/i18n/createFilter.ts +118 -131
- package/src/i18n/createNumberFormatter.ts +50 -52
- package/src/i18n/createStringFormatter.ts +19 -15
- package/src/i18n/index.ts +37 -40
- package/src/i18n/locale.tsx +163 -188
- package/src/i18n/utils.ts +95 -99
- package/src/index.ts +114 -164
- package/src/interactions/FocusableProvider.tsx +3 -7
- package/src/interactions/PressEvent.ts +4 -4
- package/src/interactions/createFocus.ts +16 -11
- package/src/interactions/createFocusRing.ts +21 -19
- package/src/interactions/createFocusWithin.ts +24 -16
- package/src/interactions/createFocusable.ts +15 -16
- package/src/interactions/createHover.ts +70 -55
- package/src/interactions/createInteractionModality.ts +75 -82
- package/src/interactions/createKeyboard.ts +2 -2
- package/src/interactions/createLongPress.ts +174 -174
- package/src/interactions/createMove.ts +299 -289
- package/src/interactions/createPress.ts +168 -91
- package/src/interactions/index.ts +24 -16
- package/src/label/createField.ts +18 -19
- package/src/label/createLabel.ts +18 -30
- package/src/label/createLabels.ts +8 -12
- package/src/label/index.ts +5 -5
- package/src/landmark/createLandmark.ts +356 -377
- package/src/landmark/index.ts +8 -8
- package/src/link/createLink.ts +96 -54
- package/src/link/index.ts +1 -1
- package/src/listbox/createListBox.ts +319 -269
- package/src/listbox/createOption.ts +208 -151
- package/src/listbox/index.ts +8 -12
- package/src/live-announcer/announce.ts +295 -322
- package/src/live-announcer/index.ts +9 -9
- package/src/menu/createMenu.ts +434 -396
- package/src/menu/createMenuItem.ts +201 -149
- package/src/menu/createMenuTrigger.ts +88 -88
- package/src/menu/index.ts +9 -18
- package/src/meter/createMeter.ts +7 -20
- package/src/meter/index.ts +1 -1
- package/src/numberfield/createNumberField.ts +368 -268
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/ariaHideOutside.ts +223 -219
- package/src/overlays/createInteractOutside.ts +152 -149
- package/src/overlays/createModal.tsx +238 -202
- package/src/overlays/createOverlay.ts +195 -155
- package/src/overlays/createOverlayTrigger.ts +85 -85
- package/src/overlays/createPreventScroll.ts +288 -266
- package/src/overlays/index.ts +37 -44
- package/src/popover/calculatePosition.ts +117 -119
- package/src/popover/createOverlayPosition.ts +52 -43
- package/src/popover/createPopover.ts +63 -24
- package/src/popover/index.ts +3 -3
- package/src/progress/createProgressBar.ts +36 -32
- package/src/progress/index.ts +1 -1
- package/src/radio/createRadio.ts +95 -73
- package/src/radio/createRadioGroup.ts +142 -62
- package/src/radio/createRadioGroupState.ts +7 -31
- package/src/radio/index.ts +3 -8
- package/src/searchfield/createSearchField.ts +269 -186
- package/src/searchfield/index.ts +2 -2
- package/src/select/createHiddenSelect.tsx +276 -236
- package/src/select/createSelect.ts +430 -395
- package/src/select/index.ts +9 -14
- package/src/selection/createTypeSelect.ts +11 -11
- package/src/selection/index.ts +1 -1
- package/src/separator/createSeparator.ts +20 -25
- package/src/separator/index.ts +1 -1
- package/src/slider/createSlider.ts +333 -349
- package/src/slider/index.ts +2 -2
- package/src/ssr/index.tsx +331 -370
- package/src/steplist/createStepList.ts +106 -0
- package/src/steplist/index.ts +8 -0
- package/src/switch/createSwitch.ts +9 -14
- package/src/switch/index.ts +1 -1
- package/src/table/createTable.ts +155 -86
- package/src/table/createTableCell.ts +17 -16
- package/src/table/createTableColumnHeader.ts +67 -20
- package/src/table/createTableColumnResize.ts +256 -0
- package/src/table/createTableHeaderRow.ts +7 -7
- package/src/table/createTableRow.ts +149 -29
- package/src/table/createTableRowGroup.ts +5 -7
- package/src/table/createTableSelectAllCheckbox.ts +12 -11
- package/src/table/createTableSelectionCheckbox.ts +8 -8
- package/src/table/index.ts +14 -9
- package/src/table/types.ts +15 -7
- package/src/tabs/createTabs.ts +138 -127
- package/src/tabs/index.ts +1 -1
- package/src/tag/createTag.ts +171 -40
- package/src/tag/createTagGroup.ts +50 -39
- package/src/tag/index.ts +2 -6
- package/src/textfield/createTextField.ts +67 -35
- package/src/textfield/index.ts +1 -5
- package/src/toast/createToast.ts +34 -26
- package/src/toast/createToastRegion.ts +169 -27
- package/src/toast/index.ts +2 -6
- package/src/toggle/createToggle.ts +95 -53
- package/src/toggle/createToggleState.ts +2 -10
- package/src/toggle/index.ts +4 -5
- package/src/toolbar/createToolbar.ts +226 -169
- package/src/toolbar/index.ts +1 -1
- package/src/tooltip/createTooltip.ts +66 -79
- package/src/tooltip/createTooltipTrigger.ts +238 -222
- package/src/tooltip/index.ts +6 -6
- package/src/tree/createTree.ts +259 -246
- package/src/tree/createTreeItem.ts +282 -233
- package/src/tree/createTreeSelectionCheckbox.ts +71 -68
- package/src/tree/index.ts +16 -16
- package/src/tree/types.ts +95 -87
- package/src/utils/createDescription.ts +6 -23
- package/src/utils/dom.ts +61 -54
- package/src/utils/env.ts +53 -54
- package/src/utils/events.ts +7 -7
- package/src/utils/filterDOMProps.ts +49 -49
- package/src/utils/focus.ts +60 -68
- package/src/utils/geometry.ts +1 -4
- package/src/utils/globalListeners.ts +9 -9
- package/src/utils/index.ts +12 -22
- package/src/utils/mergeProps.ts +42 -15
- package/src/utils/platform.ts +16 -6
- package/src/utils/reactivity.ts +3 -3
- package/src/utils/textSelection.ts +16 -16
- package/src/visually-hidden/createVisuallyHidden.ts +127 -124
- package/src/visually-hidden/index.ts +6 -6
- package/dist/i18n/NumberFormatter.d.ts +0 -43
- package/dist/i18n/NumberFormatter.d.ts.map +0 -1
- package/dist/index.ssr.js +0 -15875
- package/dist/index.ssr.js.map +0 -7
- package/src/i18n/NumberFormatter.ts +0 -266
package/src/radio/createRadio.ts
CHANGED
|
@@ -7,20 +7,16 @@
|
|
|
7
7
|
* This is a 1:1 port of @react-aria/radio's useRadio hook.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { JSX, Accessor, createEffect } from
|
|
11
|
-
import { createPress } from
|
|
12
|
-
import { createFocusable } from
|
|
13
|
-
import { mergeProps } from
|
|
14
|
-
import { filterDOMProps } from
|
|
15
|
-
import { type MaybeAccessor, access } from
|
|
16
|
-
import { isDevEnv } from
|
|
17
|
-
import { type RadioGroupState, radioGroupSyncVersion } from
|
|
18
|
-
import { radioGroupData } from
|
|
19
|
-
import { type PressEvent } from
|
|
20
|
-
|
|
21
|
-
// ============================================
|
|
22
|
-
// TYPES
|
|
23
|
-
// ============================================
|
|
10
|
+
import { JSX, Accessor, createEffect } from "solid-js";
|
|
11
|
+
import { createPress } from "../interactions/createPress";
|
|
12
|
+
import { createFocusable } from "../interactions/createFocusable";
|
|
13
|
+
import { mergeProps } from "../utils/mergeProps";
|
|
14
|
+
import { filterDOMProps } from "../utils/filterDOMProps";
|
|
15
|
+
import { type MaybeAccessor, access } from "../utils/reactivity";
|
|
16
|
+
import { isDevEnv } from "../utils/env";
|
|
17
|
+
import { type RadioGroupState, radioGroupSyncVersion } from "@proyecto-viviana/solid-stately";
|
|
18
|
+
import { radioGroupData } from "./createRadioGroup";
|
|
19
|
+
import { type PressEvent } from "../interactions/PressEvent";
|
|
24
20
|
|
|
25
21
|
export interface AriaRadioProps {
|
|
26
22
|
/** The value of the radio button, used when submitting an HTML form. */
|
|
@@ -30,11 +26,11 @@ export interface AriaRadioProps {
|
|
|
30
26
|
/** The label for the radio button. */
|
|
31
27
|
children?: JSX.Element;
|
|
32
28
|
/** Defines a string value that labels the current element. */
|
|
33
|
-
|
|
29
|
+
"aria-label"?: string;
|
|
34
30
|
/** Identifies the element (or elements) that labels the current element. */
|
|
35
|
-
|
|
31
|
+
"aria-labelledby"?: string;
|
|
36
32
|
/** Identifies the element (or elements) that describes the object. */
|
|
37
|
-
|
|
33
|
+
"aria-describedby"?: string;
|
|
38
34
|
/** Handler that is called when the press is released over the target. */
|
|
39
35
|
onPress?: (e: PressEvent) => void;
|
|
40
36
|
/** Handler that is called when a press interaction starts. */
|
|
@@ -74,10 +70,6 @@ export interface RadioAria {
|
|
|
74
70
|
isPressed: Accessor<boolean>;
|
|
75
71
|
}
|
|
76
72
|
|
|
77
|
-
// ============================================
|
|
78
|
-
// IMPLEMENTATION
|
|
79
|
-
// ============================================
|
|
80
|
-
|
|
81
73
|
/**
|
|
82
74
|
* Provides the behavior and accessibility implementation for an individual
|
|
83
75
|
* radio button in a radio group.
|
|
@@ -85,7 +77,7 @@ export interface RadioAria {
|
|
|
85
77
|
export function createRadio(
|
|
86
78
|
props: MaybeAccessor<AriaRadioProps>,
|
|
87
79
|
state: RadioGroupState,
|
|
88
|
-
ref: () => HTMLInputElement | null
|
|
80
|
+
ref: () => HTMLInputElement | null,
|
|
89
81
|
): RadioAria {
|
|
90
82
|
const getProps = () => access(props);
|
|
91
83
|
|
|
@@ -97,13 +89,14 @@ export function createRadio(
|
|
|
97
89
|
return selected === v;
|
|
98
90
|
};
|
|
99
91
|
|
|
100
|
-
// Warn if no accessible label
|
|
101
92
|
createEffect(() => {
|
|
102
93
|
const p = getProps();
|
|
103
94
|
const hasChildren = p.children != null;
|
|
104
|
-
const hasAriaLabel = p[
|
|
95
|
+
const hasAriaLabel = p["aria-label"] != null || p["aria-labelledby"] != null;
|
|
105
96
|
if (!hasChildren && !hasAriaLabel && isDevEnv()) {
|
|
106
|
-
console.warn(
|
|
97
|
+
console.warn(
|
|
98
|
+
"If you do not provide children, you must specify an aria-label for accessibility",
|
|
99
|
+
);
|
|
107
100
|
}
|
|
108
101
|
});
|
|
109
102
|
|
|
@@ -120,25 +113,19 @@ export function createRadio(
|
|
|
120
113
|
// We track `syncVersion` to ensure this effect runs on EVERY selection attempt,
|
|
121
114
|
// even in controlled mode where isSelected() may not change.
|
|
122
115
|
createEffect(() => {
|
|
123
|
-
|
|
124
|
-
if (!inputEl) return;
|
|
125
|
-
|
|
126
|
-
// Track syncVersion to trigger on any selection attempt
|
|
127
|
-
// This is crucial for controlled mode where isSelected() may not change
|
|
128
|
-
// syncVersion is stored in an internal WeakMap to maintain API parity with React-Aria
|
|
116
|
+
// The WeakMap accessor is outside the public API to maintain React Aria parity.
|
|
129
117
|
const syncVersion = radioGroupSyncVersion.get(state);
|
|
130
118
|
syncVersion?.();
|
|
131
119
|
|
|
132
|
-
// Read the reactive state to establish tracking and get current value
|
|
133
120
|
const shouldBeChecked = isSelected();
|
|
121
|
+
const inputEl = ref();
|
|
122
|
+
if (!inputEl) return;
|
|
134
123
|
|
|
135
|
-
// Sync the DOM checked state immediately
|
|
136
124
|
if (inputEl.checked !== shouldBeChecked) {
|
|
137
125
|
inputEl.checked = shouldBeChecked;
|
|
138
126
|
}
|
|
139
127
|
});
|
|
140
128
|
|
|
141
|
-
// Handle input change
|
|
142
129
|
// SolidJS-specific: Unlike React, the input's `checked` state can get out of sync
|
|
143
130
|
// with our reactive state. This happens because:
|
|
144
131
|
// 1. A readonly `<input type="radio" />` is always "checkable" in the browser
|
|
@@ -172,49 +159,88 @@ export function createRadio(
|
|
|
172
159
|
|
|
173
160
|
// Handle press state for keyboard interactions and cases where labelProps is not used.
|
|
174
161
|
const { pressProps, isPressed } = createPress({
|
|
175
|
-
get onPressStart() {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
get
|
|
179
|
-
|
|
180
|
-
|
|
162
|
+
get onPressStart() {
|
|
163
|
+
return getProps().onPressStart;
|
|
164
|
+
},
|
|
165
|
+
get onPressEnd() {
|
|
166
|
+
return getProps().onPressEnd;
|
|
167
|
+
},
|
|
168
|
+
get onPressChange() {
|
|
169
|
+
return getProps().onPressChange;
|
|
170
|
+
},
|
|
171
|
+
get onPress() {
|
|
172
|
+
return getProps().onPress;
|
|
173
|
+
},
|
|
174
|
+
get onPressUp() {
|
|
175
|
+
return getProps().onPressUp;
|
|
176
|
+
},
|
|
177
|
+
get onClick() {
|
|
178
|
+
return getProps().onClick;
|
|
179
|
+
},
|
|
180
|
+
get isDisabled() {
|
|
181
|
+
return isDisabled();
|
|
182
|
+
},
|
|
181
183
|
});
|
|
182
184
|
|
|
183
|
-
// Handle press state on the label.
|
|
184
185
|
const { pressProps: labelPressProps, isPressed: isLabelPressed } = createPress({
|
|
185
|
-
get onPressStart() {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
get
|
|
186
|
+
get onPressStart() {
|
|
187
|
+
return getProps().onPressStart;
|
|
188
|
+
},
|
|
189
|
+
get onPressEnd() {
|
|
190
|
+
return getProps().onPressEnd;
|
|
191
|
+
},
|
|
192
|
+
get onPressChange() {
|
|
193
|
+
return getProps().onPressChange;
|
|
194
|
+
},
|
|
195
|
+
get onPressUp() {
|
|
196
|
+
return getProps().onPressUp;
|
|
197
|
+
},
|
|
198
|
+
get onClick() {
|
|
199
|
+
return getProps().onClick;
|
|
200
|
+
},
|
|
189
201
|
onPress(e: PressEvent) {
|
|
190
202
|
getProps().onPress?.(e);
|
|
191
203
|
state.setSelectedValue(value());
|
|
192
204
|
ref()?.focus();
|
|
193
205
|
},
|
|
194
|
-
get isDisabled() {
|
|
206
|
+
get isDisabled() {
|
|
207
|
+
return isDisabled();
|
|
208
|
+
},
|
|
195
209
|
});
|
|
196
210
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
211
|
+
const { focusableProps } = createFocusable(
|
|
212
|
+
{
|
|
213
|
+
get isDisabled() {
|
|
214
|
+
return isDisabled();
|
|
215
|
+
},
|
|
216
|
+
get autoFocus() {
|
|
217
|
+
return getProps().autoFocus;
|
|
218
|
+
},
|
|
219
|
+
onFocus(e: FocusEvent) {
|
|
220
|
+
getProps().onFocus?.(e);
|
|
221
|
+
state.setLastFocusedValue(value());
|
|
222
|
+
},
|
|
223
|
+
get onBlur() {
|
|
224
|
+
return getProps().onBlur;
|
|
225
|
+
},
|
|
226
|
+
get onFocusChange() {
|
|
227
|
+
return getProps().onFocusChange;
|
|
228
|
+
},
|
|
229
|
+
get onKeyDown() {
|
|
230
|
+
return getProps().onKeyDown;
|
|
231
|
+
},
|
|
232
|
+
get onKeyUp() {
|
|
233
|
+
return getProps().onKeyUp;
|
|
234
|
+
},
|
|
204
235
|
},
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
get onKeyDown() { return getProps().onKeyDown; },
|
|
208
|
-
get onKeyUp() { return getProps().onKeyUp; },
|
|
209
|
-
}, ref as unknown as (el: HTMLElement) => void);
|
|
236
|
+
ref as unknown as (el: HTMLElement) => void,
|
|
237
|
+
);
|
|
210
238
|
|
|
211
|
-
// Combine press and focusable props for input
|
|
212
239
|
const interactions = mergeProps(pressProps, focusableProps);
|
|
213
240
|
|
|
214
|
-
|
|
215
|
-
|
|
241
|
+
const domProps = () =>
|
|
242
|
+
filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
|
|
216
243
|
|
|
217
|
-
// Calculate tabIndex based on selection and focus state
|
|
218
244
|
const getTabIndex = (): number | undefined => {
|
|
219
245
|
if (isDisabled()) {
|
|
220
246
|
return undefined;
|
|
@@ -225,13 +251,11 @@ export function createRadio(
|
|
|
225
251
|
const currentValue = value();
|
|
226
252
|
|
|
227
253
|
if (selected != null) {
|
|
228
|
-
// If there's a selection, only the selected radio is focusable
|
|
229
254
|
if (selected === currentValue) {
|
|
230
255
|
return 0;
|
|
231
256
|
}
|
|
232
257
|
return -1;
|
|
233
258
|
} else {
|
|
234
|
-
// If no selection, the last focused or first radio is focusable
|
|
235
259
|
if (lastFocused === currentValue || lastFocused == null) {
|
|
236
260
|
return 0;
|
|
237
261
|
}
|
|
@@ -239,10 +263,8 @@ export function createRadio(
|
|
|
239
263
|
}
|
|
240
264
|
};
|
|
241
265
|
|
|
242
|
-
// Get group data
|
|
243
266
|
const getGroupData = () => radioGroupData.get(state);
|
|
244
267
|
|
|
245
|
-
// Combined pressed state
|
|
246
268
|
const combinedIsPressed: Accessor<boolean> = () => isPressed() || isLabelPressed();
|
|
247
269
|
|
|
248
270
|
return {
|
|
@@ -254,10 +276,9 @@ export function createRadio(
|
|
|
254
276
|
const p = getProps();
|
|
255
277
|
const groupData = getGroupData();
|
|
256
278
|
|
|
257
|
-
// Build aria-describedby
|
|
258
279
|
const describedByIds: string[] = [];
|
|
259
|
-
if (p[
|
|
260
|
-
describedByIds.push(p[
|
|
280
|
+
if (p["aria-describedby"]) {
|
|
281
|
+
describedByIds.push(p["aria-describedby"]);
|
|
261
282
|
}
|
|
262
283
|
if (state.isInvalid && groupData?.errorMessageId) {
|
|
263
284
|
describedByIds.push(groupData.errorMessageId);
|
|
@@ -265,19 +286,20 @@ export function createRadio(
|
|
|
265
286
|
if (groupData?.descriptionId) {
|
|
266
287
|
describedByIds.push(groupData.descriptionId);
|
|
267
288
|
}
|
|
268
|
-
const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(
|
|
289
|
+
const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(" ") : undefined;
|
|
290
|
+
const validationBehavior = groupData?.validationBehavior ?? "native";
|
|
269
291
|
|
|
270
292
|
return mergeProps(domProps(), interactions, {
|
|
271
|
-
type:
|
|
293
|
+
type: "radio" as const,
|
|
272
294
|
name: groupData?.name,
|
|
273
295
|
form: groupData?.form,
|
|
274
296
|
tabIndex: getTabIndex(),
|
|
275
297
|
disabled: isDisabled(),
|
|
276
|
-
required: state.isRequired
|
|
298
|
+
required: validationBehavior === "native" ? state.isRequired : undefined,
|
|
277
299
|
checked: isSelected(),
|
|
278
300
|
value: value(),
|
|
279
301
|
onChange,
|
|
280
|
-
|
|
302
|
+
"aria-describedby": ariaDescribedBy,
|
|
281
303
|
}) as JSX.InputHTMLAttributes<HTMLInputElement>;
|
|
282
304
|
},
|
|
283
305
|
isDisabled: isDisabled(),
|
|
@@ -7,18 +7,16 @@
|
|
|
7
7
|
* This is a 1:1 port of @react-aria/radio's useRadioGroup hook.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { JSX } from
|
|
11
|
-
import { createField } from
|
|
12
|
-
import { createFocusWithin } from
|
|
13
|
-
import { mergeProps } from
|
|
14
|
-
import { filterDOMProps } from
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// TYPES
|
|
21
|
-
// ============================================
|
|
10
|
+
import { JSX } from "solid-js";
|
|
11
|
+
import { createField } from "../label/createField";
|
|
12
|
+
import { createFocusWithin } from "../interactions/createFocusWithin";
|
|
13
|
+
import { mergeProps } from "../utils/mergeProps";
|
|
14
|
+
import { filterDOMProps } from "../utils/filterDOMProps";
|
|
15
|
+
import { focusSafely, getEventTarget } from "../utils";
|
|
16
|
+
import { useLocale } from "../i18n";
|
|
17
|
+
import { createId } from "../ssr";
|
|
18
|
+
import { type MaybeAccessor, access } from "../utils/reactivity";
|
|
19
|
+
import { type RadioGroupState, type ValidityState } from "@proyecto-viviana/solid-stately";
|
|
22
20
|
|
|
23
21
|
export interface AriaRadioGroupProps {
|
|
24
22
|
/** The content to display as the label. */
|
|
@@ -26,7 +24,9 @@ export interface AriaRadioGroupProps {
|
|
|
26
24
|
/** A description for the radio group. Provides additional context. */
|
|
27
25
|
description?: JSX.Element;
|
|
28
26
|
/** An error message for the radio group. */
|
|
29
|
-
errorMessage?:
|
|
27
|
+
errorMessage?:
|
|
28
|
+
| JSX.Element
|
|
29
|
+
| ((validation: { isInvalid: boolean; validationErrors: string[] }) => JSX.Element);
|
|
30
30
|
/** Whether the radio group is disabled. */
|
|
31
31
|
isDisabled?: boolean;
|
|
32
32
|
/** Whether the radio group is read only. */
|
|
@@ -36,13 +36,13 @@ export interface AriaRadioGroupProps {
|
|
|
36
36
|
/** Whether the radio group is invalid. */
|
|
37
37
|
isInvalid?: boolean;
|
|
38
38
|
/** The axis the Radio Button(s) should align with. Defaults to 'vertical'. */
|
|
39
|
-
orientation?:
|
|
39
|
+
orientation?: "horizontal" | "vertical";
|
|
40
40
|
/** The name of the radio group, used when submitting an HTML form. */
|
|
41
41
|
name?: string;
|
|
42
42
|
/** The form to associate the radio group with. */
|
|
43
43
|
form?: string;
|
|
44
44
|
/** Validation behavior for the radio group. */
|
|
45
|
-
validationBehavior?:
|
|
45
|
+
validationBehavior?: "aria" | "native";
|
|
46
46
|
/** Handler that is called when the radio group receives focus. */
|
|
47
47
|
onFocus?: (e: FocusEvent) => void;
|
|
48
48
|
/** Handler that is called when the radio group loses focus. */
|
|
@@ -50,13 +50,13 @@ export interface AriaRadioGroupProps {
|
|
|
50
50
|
/** Handler that is called when the radio group's focus status changes. */
|
|
51
51
|
onFocusChange?: (isFocused: boolean) => void;
|
|
52
52
|
/** Defines a string value that labels the current element. */
|
|
53
|
-
|
|
53
|
+
"aria-label"?: string;
|
|
54
54
|
/** Identifies the element (or elements) that labels the current element. */
|
|
55
|
-
|
|
55
|
+
"aria-labelledby"?: string;
|
|
56
56
|
/** Identifies the element (or elements) that describes the object. */
|
|
57
|
-
|
|
57
|
+
"aria-describedby"?: string;
|
|
58
58
|
/** Identifies the element (or elements) that provide an error message for the object. */
|
|
59
|
-
|
|
59
|
+
"aria-errormessage"?: string;
|
|
60
60
|
/** The element's unique identifier. */
|
|
61
61
|
id?: string;
|
|
62
62
|
}
|
|
@@ -75,7 +75,7 @@ export interface RadioGroupAria {
|
|
|
75
75
|
/** Validation errors, if any. */
|
|
76
76
|
validationErrors: string[];
|
|
77
77
|
/** Validation details, if any. */
|
|
78
|
-
validationDetails:
|
|
78
|
+
validationDetails: ValidityState;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
// WeakMap to share data between radio group and radio items
|
|
@@ -84,40 +84,61 @@ interface RadioGroupData {
|
|
|
84
84
|
form: string | undefined;
|
|
85
85
|
descriptionId: string | undefined;
|
|
86
86
|
errorMessageId: string | undefined;
|
|
87
|
-
validationBehavior:
|
|
87
|
+
validationBehavior: "aria" | "native";
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
export const radioGroupData: WeakMap<RadioGroupState, RadioGroupData> = new WeakMap();
|
|
91
91
|
|
|
92
|
-
// ============================================
|
|
93
|
-
// IMPLEMENTATION
|
|
94
|
-
// ============================================
|
|
95
|
-
|
|
96
92
|
/**
|
|
97
93
|
* Provides the behavior and accessibility implementation for a radio group component.
|
|
98
94
|
* Radio groups allow users to select a single item from a list of mutually exclusive options.
|
|
99
95
|
*/
|
|
100
96
|
export function createRadioGroup(
|
|
101
97
|
props: MaybeAccessor<AriaRadioGroupProps>,
|
|
102
|
-
state: RadioGroupState
|
|
98
|
+
state: RadioGroupState,
|
|
103
99
|
): RadioGroupAria {
|
|
104
100
|
const getProps = () => access(props);
|
|
101
|
+
const locale = useLocale();
|
|
105
102
|
|
|
106
|
-
const orientation = () => getProps().orientation ??
|
|
103
|
+
const orientation = () => getProps().orientation ?? "vertical";
|
|
107
104
|
const isReadOnly = () => getProps().isReadOnly ?? false;
|
|
108
105
|
const isRequired = () => getProps().isRequired ?? false;
|
|
109
106
|
const isDisabled = () => getProps().isDisabled ?? false;
|
|
110
|
-
const validationBehavior = () => getProps().validationBehavior ??
|
|
107
|
+
const validationBehavior = () => getProps().validationBehavior ?? "native";
|
|
108
|
+
const displayValidation = () => state.displayValidation();
|
|
109
|
+
const validationErrors = () => displayValidation().validationErrors;
|
|
110
|
+
const validationDetails = () => displayValidation().validationDetails;
|
|
111
|
+
const isInvalid = () => displayValidation().isInvalid;
|
|
112
|
+
const fallbackErrorMessage = () => {
|
|
113
|
+
const errors = validationErrors();
|
|
114
|
+
return errors.length > 0 ? errors : undefined;
|
|
115
|
+
};
|
|
111
116
|
|
|
112
|
-
// Use field for label, description, error message
|
|
113
117
|
const { labelProps, fieldProps, descriptionProps, errorMessageProps } = createField({
|
|
114
|
-
get
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
get
|
|
118
|
+
get id() {
|
|
119
|
+
return getProps().id;
|
|
120
|
+
},
|
|
121
|
+
get label() {
|
|
122
|
+
return getProps().label;
|
|
123
|
+
},
|
|
124
|
+
get "aria-label"() {
|
|
125
|
+
return getProps()["aria-label"];
|
|
126
|
+
},
|
|
127
|
+
get "aria-labelledby"() {
|
|
128
|
+
return getProps()["aria-labelledby"];
|
|
129
|
+
},
|
|
130
|
+
get description() {
|
|
131
|
+
return getProps().description;
|
|
132
|
+
},
|
|
133
|
+
get errorMessage() {
|
|
134
|
+
return getProps().errorMessage ?? fallbackErrorMessage();
|
|
135
|
+
},
|
|
136
|
+
get isInvalid() {
|
|
137
|
+
return isInvalid();
|
|
138
|
+
},
|
|
118
139
|
// Radio group is not an HTML input element so it
|
|
119
140
|
// shouldn't be labeled by a <label> element.
|
|
120
|
-
labelElementType:
|
|
141
|
+
labelElementType: "span",
|
|
121
142
|
});
|
|
122
143
|
|
|
123
144
|
// Handle focus within - reset focusable radio when group loses focus and no selection
|
|
@@ -132,13 +153,11 @@ export function createRadioGroup(
|
|
|
132
153
|
onFocusWithinChange: (isFocused: boolean) => getProps().onFocusChange?.(isFocused),
|
|
133
154
|
});
|
|
134
155
|
|
|
135
|
-
|
|
136
|
-
|
|
156
|
+
const domProps = () =>
|
|
157
|
+
filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
|
|
137
158
|
|
|
138
|
-
// Generate group name
|
|
139
159
|
const groupName = getProps().name ?? createId();
|
|
140
160
|
|
|
141
|
-
// Store data for radio items to access
|
|
142
161
|
radioGroupData.set(state, {
|
|
143
162
|
name: groupName,
|
|
144
163
|
form: getProps().form,
|
|
@@ -147,43 +166,104 @@ export function createRadioGroup(
|
|
|
147
166
|
validationBehavior: validationBehavior(),
|
|
148
167
|
});
|
|
149
168
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
169
|
+
const getNavigableRadios = (root: HTMLElement): HTMLInputElement[] => {
|
|
170
|
+
return Array.from(root.querySelectorAll('input[type="radio"]')).filter(
|
|
171
|
+
(el): el is HTMLInputElement => {
|
|
172
|
+
return el instanceof HTMLInputElement && !el.matches(":disabled");
|
|
173
|
+
},
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// Keyboard navigation parity with React Aria.
|
|
178
|
+
const onKeyDown: JSX.EventHandler<HTMLDivElement, KeyboardEvent> = (e) => {
|
|
179
|
+
let nextDir: "next" | "prev" | null = null;
|
|
180
|
+
const currentOrientation = orientation();
|
|
181
|
+
const isHorizontal = currentOrientation !== "vertical";
|
|
182
|
+
const isRTL = locale().direction === "rtl" && isHorizontal;
|
|
183
|
+
|
|
184
|
+
switch (e.key) {
|
|
185
|
+
case "ArrowRight":
|
|
186
|
+
nextDir = isRTL ? "prev" : "next";
|
|
187
|
+
break;
|
|
188
|
+
case "ArrowLeft":
|
|
189
|
+
nextDir = isRTL ? "next" : "prev";
|
|
190
|
+
break;
|
|
191
|
+
case "ArrowDown":
|
|
192
|
+
nextDir = "next";
|
|
193
|
+
break;
|
|
194
|
+
case "ArrowUp":
|
|
195
|
+
nextDir = "prev";
|
|
196
|
+
break;
|
|
197
|
+
default:
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
e.preventDefault();
|
|
202
|
+
|
|
203
|
+
const root = e.currentTarget;
|
|
204
|
+
if (!(root instanceof HTMLElement)) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const radios = getNavigableRadios(root);
|
|
209
|
+
if (radios.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const eventTarget = getEventTarget<Element>(e);
|
|
214
|
+
const activeElement = root.ownerDocument.activeElement;
|
|
215
|
+
|
|
216
|
+
const currentRadio =
|
|
217
|
+
eventTarget instanceof HTMLInputElement && eventTarget.type === "radio"
|
|
218
|
+
? eventTarget
|
|
219
|
+
: activeElement instanceof HTMLInputElement && activeElement.type === "radio"
|
|
220
|
+
? activeElement
|
|
221
|
+
: null;
|
|
222
|
+
|
|
223
|
+
const currentIndex = currentRadio ? radios.indexOf(currentRadio) : -1;
|
|
224
|
+
|
|
225
|
+
let nextIndex: number;
|
|
226
|
+
if (nextDir === "next") {
|
|
227
|
+
nextIndex = currentIndex >= 0 ? (currentIndex + 1) % radios.length : 0;
|
|
228
|
+
} else {
|
|
229
|
+
nextIndex =
|
|
230
|
+
currentIndex >= 0 ? (currentIndex - 1 + radios.length) % radios.length : radios.length - 1;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const nextRadio = radios[nextIndex];
|
|
234
|
+
if (!nextRadio) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
focusSafely(nextRadio);
|
|
239
|
+
state.setSelectedValue(nextRadio.value);
|
|
156
240
|
};
|
|
157
241
|
|
|
158
242
|
return {
|
|
159
243
|
get radioGroupProps() {
|
|
160
|
-
return mergeProps(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
'aria-orientation': orientation(),
|
|
172
|
-
...fieldProps,
|
|
173
|
-
}
|
|
174
|
-
) as JSX.HTMLAttributes<HTMLDivElement>;
|
|
244
|
+
return mergeProps(domProps(), focusWithinProps as unknown as Record<string, unknown>, {
|
|
245
|
+
role: "radiogroup",
|
|
246
|
+
onKeyDown,
|
|
247
|
+
"aria-invalid": isInvalid() || undefined,
|
|
248
|
+
"aria-errormessage": getProps()["aria-errormessage"],
|
|
249
|
+
"aria-readonly": isReadOnly() || undefined,
|
|
250
|
+
"aria-required": isRequired() || undefined,
|
|
251
|
+
"aria-disabled": isDisabled() || undefined,
|
|
252
|
+
"aria-orientation": orientation(),
|
|
253
|
+
...fieldProps,
|
|
254
|
+
}) as JSX.HTMLAttributes<HTMLDivElement>;
|
|
175
255
|
},
|
|
176
256
|
labelProps: labelProps as JSX.HTMLAttributes<HTMLElement>,
|
|
177
257
|
descriptionProps,
|
|
178
258
|
errorMessageProps,
|
|
179
259
|
get isInvalid() {
|
|
180
|
-
return
|
|
260
|
+
return isInvalid();
|
|
181
261
|
},
|
|
182
262
|
get validationErrors() {
|
|
183
|
-
return
|
|
263
|
+
return validationErrors();
|
|
184
264
|
},
|
|
185
265
|
get validationDetails() {
|
|
186
|
-
return
|
|
266
|
+
return validationDetails();
|
|
187
267
|
},
|
|
188
268
|
};
|
|
189
269
|
}
|