@proyecto-viviana/solid-stately 0.5.1 → 0.6.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-APACHE-2.0 +201 -0
- package/NOTICE +91 -0
- package/README.md +59 -29
- package/dist/autocomplete/createAutocompleteState.d.ts +2 -1
- package/dist/autocomplete/createAutocompleteState.d.ts.map +1 -0
- package/dist/autocomplete/index.d.ts +1 -0
- package/dist/autocomplete/index.d.ts.map +1 -0
- package/dist/calendar/IncompleteDate.d.ts +2 -1
- package/dist/calendar/IncompleteDate.d.ts.map +1 -0
- package/dist/calendar/createCalendarState.d.ts +10 -9
- package/dist/calendar/createCalendarState.d.ts.map +1 -0
- package/dist/calendar/createDateFieldState.d.ts +4 -20
- package/dist/calendar/createDateFieldState.d.ts.map +1 -0
- package/dist/calendar/createDatePickerState.d.ts +4 -7
- package/dist/calendar/createDatePickerState.d.ts.map +1 -0
- package/dist/calendar/createRangeCalendarState.d.ts +9 -7
- package/dist/calendar/createRangeCalendarState.d.ts.map +1 -0
- package/dist/calendar/createTimeFieldState.d.ts +5 -24
- package/dist/calendar/createTimeFieldState.d.ts.map +1 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/intl/index.d.ts +1 -0
- package/dist/calendar/intl/index.d.ts.map +1 -0
- package/dist/checkbox/createCheckboxGroupState.d.ts +3 -0
- package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -0
- package/dist/checkbox/index.d.ts +1 -0
- package/dist/checkbox/index.d.ts.map +1 -0
- package/dist/collections/ListCollection.d.ts +5 -0
- package/dist/collections/ListCollection.d.ts.map +1 -0
- package/dist/collections/createListState.d.ts +2 -6
- package/dist/collections/createListState.d.ts.map +1 -0
- package/dist/collections/createMenuState.d.ts +74 -13
- package/dist/collections/createMenuState.d.ts.map +1 -0
- package/dist/collections/createSelectionState.d.ts +2 -5
- package/dist/collections/createSelectionState.d.ts.map +1 -0
- package/dist/collections/getChildNodes.d.ts +6 -3
- package/dist/collections/getChildNodes.d.ts.map +1 -0
- package/dist/collections/index.d.ts +2 -1
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/types.d.ts +36 -2
- package/dist/collections/types.d.ts.map +1 -0
- package/dist/color/Color.d.ts +7 -1
- package/dist/color/Color.d.ts.map +1 -0
- package/dist/color/createColorAreaState.d.ts +6 -5
- package/dist/color/createColorAreaState.d.ts.map +1 -0
- package/dist/color/createColorFieldState.d.ts +4 -5
- package/dist/color/createColorFieldState.d.ts.map +1 -0
- package/dist/color/createColorSliderState.d.ts +4 -5
- package/dist/color/createColorSliderState.d.ts.map +1 -0
- package/dist/color/createColorWheelState.d.ts +2 -5
- package/dist/color/createColorWheelState.d.ts.map +1 -0
- package/dist/color/getColorChannels.d.ts +3 -0
- package/dist/color/getColorChannels.d.ts.map +1 -0
- package/dist/color/index.d.ts +2 -1
- package/dist/color/index.d.ts.map +1 -0
- package/dist/color/intl/index.d.ts +1 -0
- package/dist/color/intl/index.d.ts.map +1 -0
- package/dist/color/types.d.ts +2 -1
- package/dist/color/types.d.ts.map +1 -0
- package/dist/combobox/createComboBoxState.d.ts +92 -29
- package/dist/combobox/createComboBoxState.d.ts.map +1 -0
- package/dist/combobox/index.d.ts +2 -1
- package/dist/combobox/index.d.ts.map +1 -0
- package/dist/data/createAsyncList.d.ts +1 -7
- package/dist/data/createAsyncList.d.ts.map +1 -0
- package/dist/data/createListData.d.ts +1 -6
- package/dist/data/createListData.d.ts.map +1 -0
- package/dist/data/createTreeData.d.ts +1 -6
- package/dist/data/createTreeData.d.ts.map +1 -0
- package/dist/data/index.d.ts +1 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/datepicker/index.d.ts +1 -0
- package/dist/datepicker/index.d.ts.map +1 -0
- package/dist/disclosure/createDisclosureState.d.ts +2 -5
- package/dist/disclosure/createDisclosureState.d.ts.map +1 -0
- package/dist/disclosure/index.d.ts +1 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/dnd/createDragState.d.ts +2 -6
- package/dist/dnd/createDragState.d.ts.map +1 -0
- package/dist/dnd/createDraggableCollectionState.d.ts +44 -11
- package/dist/dnd/createDraggableCollectionState.d.ts.map +1 -0
- package/dist/dnd/createDropState.d.ts +2 -6
- package/dist/dnd/createDropState.d.ts.map +1 -0
- package/dist/dnd/createDroppableCollectionState.d.ts +34 -11
- package/dist/dnd/createDroppableCollectionState.d.ts.map +1 -0
- package/dist/dnd/index.d.ts +3 -2
- package/dist/dnd/index.d.ts.map +1 -0
- package/dist/dnd/types.d.ts +17 -0
- package/dist/dnd/types.d.ts.map +1 -0
- package/dist/form/createFormValidationState.d.ts +2 -9
- package/{src → dist}/form/createFormValidationState.d.ts.map +1 -1
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/grid/createGridState.d.ts +4 -3
- package/dist/grid/createGridState.d.ts.map +1 -0
- package/dist/grid/index.d.ts +1 -0
- package/dist/grid/index.d.ts.map +1 -0
- package/dist/grid/types.d.ts +23 -1
- package/dist/grid/types.d.ts.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2947 -969
- package/dist/index.js.map +1 -1
- package/dist/menu/index.d.ts +3 -1
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/numberfield/createNumberFieldState.d.ts +37 -9
- package/dist/numberfield/createNumberFieldState.d.ts.map +1 -0
- package/dist/numberfield/index.d.ts +1 -0
- package/dist/numberfield/index.d.ts.map +1 -0
- package/dist/overlays/createOverlayTriggerState.d.ts +12 -1
- package/dist/overlays/createOverlayTriggerState.d.ts.map +1 -0
- package/dist/overlays/index.d.ts +1 -0
- package/dist/overlays/index.d.ts.map +1 -0
- package/dist/private/flags/flags.d.ts +5 -0
- package/dist/private/flags/flags.d.ts.map +1 -0
- package/dist/private/flags/flags.js +26 -0
- package/dist/private/flags/flags.js.map +1 -0
- package/dist/radio/createRadioGroupState.d.ts +1 -0
- package/dist/radio/createRadioGroupState.d.ts.map +1 -0
- package/dist/radio/index.d.ts +1 -0
- package/dist/radio/index.d.ts.map +1 -0
- package/dist/searchfield/createSearchFieldState.d.ts +2 -5
- package/dist/searchfield/createSearchFieldState.d.ts.map +1 -0
- package/dist/searchfield/index.d.ts +1 -0
- package/dist/searchfield/index.d.ts.map +1 -0
- package/dist/select/createSelectState.d.ts +100 -33
- package/dist/select/createSelectState.d.ts.map +1 -0
- package/dist/select/index.d.ts +2 -1
- package/dist/select/index.d.ts.map +1 -0
- package/dist/selection/Selection.d.ts +2 -1
- package/dist/selection/Selection.d.ts.map +1 -0
- package/dist/selection/SelectionManager.d.ts +1 -19
- package/dist/selection/SelectionManager.d.ts.map +1 -0
- package/dist/selection/createMultipleSelectionState.d.ts +2 -13
- package/dist/selection/createMultipleSelectionState.d.ts.map +1 -0
- package/dist/selection/index.d.ts +1 -0
- package/dist/selection/index.d.ts.map +1 -0
- package/dist/slider/createSliderState.d.ts +37 -14
- package/dist/slider/createSliderState.d.ts.map +1 -0
- package/dist/slider/index.d.ts +1 -0
- package/dist/slider/index.d.ts.map +1 -0
- package/dist/ssr/index.d.ts +2 -13
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/steplist/createStepListState.d.ts +10 -18
- package/dist/steplist/createStepListState.d.ts.map +1 -0
- package/dist/steplist/index.d.ts +1 -0
- package/dist/steplist/index.d.ts.map +1 -0
- package/dist/table/TableCollection.d.ts +1 -0
- package/dist/table/TableCollection.d.ts.map +1 -0
- package/dist/table/createTableColumnResizeState.d.ts +2 -9
- package/dist/table/createTableColumnResizeState.d.ts.map +1 -0
- package/dist/table/createTableState.d.ts +3 -6
- package/dist/table/createTableState.d.ts.map +1 -0
- package/dist/table/createTreeGridState.d.ts +3 -9
- package/dist/table/createTreeGridState.d.ts.map +1 -0
- package/dist/table/index.d.ts +1 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/types.d.ts +37 -3
- package/dist/table/types.d.ts.map +1 -0
- package/dist/tabs/createTabListState.d.ts +2 -5
- package/dist/tabs/createTabListState.d.ts.map +1 -0
- package/dist/tabs/index.d.ts +1 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/textfield/createTextFieldState.d.ts +1 -0
- package/dist/textfield/createTextFieldState.d.ts.map +1 -0
- package/dist/textfield/index.d.ts +1 -0
- package/dist/textfield/index.d.ts.map +1 -0
- package/dist/toast/createToastState.d.ts +2 -5
- package/dist/toast/createToastState.d.ts.map +1 -0
- package/dist/toast/index.d.ts +1 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toggle/createToggleGroupState.d.ts +1 -0
- package/dist/toggle/createToggleGroupState.d.ts.map +1 -0
- package/dist/toggle/createToggleState.d.ts +1 -0
- package/dist/toggle/createToggleState.d.ts.map +1 -0
- package/dist/toggle/index.d.ts +1 -0
- package/dist/toggle/index.d.ts.map +1 -0
- package/dist/tokenfield/TokenFieldValue.d.ts +96 -0
- package/dist/tokenfield/TokenFieldValue.d.ts.map +1 -0
- package/dist/tokenfield/createTokenFieldState.d.ts +33 -0
- package/dist/tokenfield/createTokenFieldState.d.ts.map +1 -0
- package/dist/tokenfield/index.d.ts +3 -0
- package/dist/tokenfield/index.d.ts.map +1 -0
- package/dist/tooltip/createTooltipTriggerState.d.ts +9 -8
- package/dist/tooltip/createTooltipTriggerState.d.ts.map +1 -0
- package/dist/tooltip/index.d.ts +1 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tree/TreeCollection.d.ts +1 -0
- package/dist/tree/TreeCollection.d.ts.map +1 -0
- package/dist/tree/createTreeState.d.ts +3 -8
- package/dist/tree/createTreeState.d.ts.map +1 -0
- package/dist/tree/index.d.ts +1 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/types.d.ts +19 -1
- package/dist/tree/types.d.ts.map +1 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/owner.d.ts +9 -0
- package/dist/utils/owner.d.ts.map +1 -0
- package/dist/utils/reactivity.d.ts +24 -0
- package/dist/utils/reactivity.d.ts.map +1 -0
- package/package.json +21 -9
- package/src/autocomplete/createAutocompleteState.ts +18 -4
- package/src/calendar/IncompleteDate.ts +15 -1
- package/src/calendar/createCalendarState.ts +321 -125
- package/src/calendar/createDateFieldState.ts +45 -31
- package/src/calendar/createDatePickerState.ts +47 -26
- package/src/calendar/createRangeCalendarState.ts +173 -86
- package/src/calendar/createTimeFieldState.ts +26 -7
- package/src/calendar/intl/index.ts +37 -2
- package/src/checkbox/createCheckboxGroupState.ts +45 -13
- package/src/collections/ListCollection.ts +31 -0
- package/src/collections/createListState.ts +27 -10
- package/src/collections/createMenuState.ts +190 -15
- package/src/collections/createSelectionState.ts +33 -13
- package/src/collections/getChildNodes.ts +20 -3
- package/src/collections/index.ts +6 -0
- package/src/collections/types.ts +35 -2
- package/src/color/Color.ts +61 -22
- package/src/color/createColorAreaState.ts +48 -4
- package/src/color/createColorFieldState.ts +114 -38
- package/src/color/createColorSliderState.ts +61 -9
- package/src/color/createColorWheelState.ts +29 -9
- package/src/color/getColorChannels.ts +16 -0
- package/src/color/index.ts +1 -0
- package/src/color/intl/index.ts +38 -3
- package/src/color/types.ts +1 -1
- package/src/combobox/createComboBoxState.ts +530 -297
- package/src/combobox/index.ts +4 -0
- package/src/data/createAsyncList.ts +41 -6
- package/src/data/createListData.ts +27 -4
- package/src/data/createTreeData.ts +30 -6
- package/src/disclosure/createDisclosureState.ts +40 -19
- package/src/dnd/createDragState.ts +22 -4
- package/src/dnd/createDraggableCollectionState.ts +145 -11
- package/src/dnd/createDropState.ts +21 -3
- package/src/dnd/createDroppableCollectionState.ts +127 -11
- package/src/dnd/index.ts +4 -0
- package/src/dnd/types.ts +16 -0
- package/src/form/createFormValidationState.ts +69 -37
- package/src/grid/createGridState.ts +196 -111
- package/src/grid/types.ts +22 -1
- package/src/index.ts +33 -2
- package/src/menu/index.ts +7 -0
- package/src/numberfield/createNumberFieldState.ts +247 -98
- package/src/overlays/createOverlayTriggerState.ts +31 -4
- package/src/private/flags/flags.ts +25 -0
- package/src/radio/createRadioGroupState.ts +23 -6
- package/src/searchfield/createSearchFieldState.ts +18 -3
- package/src/select/createSelectState.ts +317 -130
- package/src/select/index.ts +8 -1
- package/src/selection/Selection.ts +15 -1
- package/src/selection/SelectionManager.ts +17 -1
- package/src/selection/createMultipleSelectionState.ts +45 -26
- package/src/slider/createSliderState.ts +243 -104
- package/src/ssr/index.ts +34 -4
- package/src/steplist/createStepListState.ts +184 -130
- package/src/table/TableCollection.ts +14 -0
- package/src/table/createTableColumnResizeState.ts +71 -14
- package/src/table/createTableState.ts +26 -4
- package/src/table/createTreeGridState.ts +22 -6
- package/src/table/types.ts +38 -5
- package/src/tabs/createTabListState.ts +63 -43
- package/src/textfield/createTextFieldState.ts +17 -3
- package/src/toast/createToastState.ts +28 -3
- package/src/toggle/createToggleGroupState.ts +20 -5
- package/src/toggle/createToggleState.ts +19 -4
- package/src/tokenfield/TokenFieldValue.ts +499 -0
- package/src/tokenfield/createTokenFieldState.ts +88 -0
- package/src/tokenfield/index.ts +15 -0
- package/src/tooltip/createTooltipTriggerState.ts +49 -13
- package/src/tree/TreeCollection.ts +14 -0
- package/src/tree/createTreeState.ts +70 -36
- package/src/tree/types.ts +18 -1
- package/src/utils/index.ts +10 -1
- package/src/utils/owner.ts +20 -0
- package/src/utils/reactivity.ts +53 -1
- package/src/autocomplete/createAutocompleteState.d.ts +0 -48
- package/src/autocomplete/createAutocompleteState.d.ts.map +0 -1
- package/src/autocomplete/index.d.ts +0 -6
- package/src/autocomplete/index.d.ts.map +0 -1
- package/src/calendar/createCalendarState.d.ts +0 -152
- package/src/calendar/createCalendarState.d.ts.map +0 -1
- package/src/calendar/createDateFieldState.d.ts +0 -145
- package/src/calendar/createDateFieldState.d.ts.map +0 -1
- package/src/calendar/createRangeCalendarState.d.ts +0 -171
- package/src/calendar/createRangeCalendarState.d.ts.map +0 -1
- package/src/calendar/createTimeFieldState.d.ts +0 -97
- package/src/calendar/createTimeFieldState.d.ts.map +0 -1
- package/src/calendar/index.d.ts +0 -80
- package/src/calendar/index.d.ts.map +0 -1
- package/src/checkbox/createCheckboxGroupState.d.ts +0 -73
- package/src/checkbox/createCheckboxGroupState.d.ts.map +0 -1
- package/src/checkbox/index.d.ts +0 -6
- package/src/checkbox/index.d.ts.map +0 -1
- package/src/collections/ListCollection.d.ts +0 -40
- package/src/collections/ListCollection.d.ts.map +0 -1
- package/src/collections/createListState.d.ts +0 -94
- package/src/collections/createListState.d.ts.map +0 -1
- package/src/collections/createMenuState.d.ts +0 -55
- package/src/collections/createMenuState.d.ts.map +0 -1
- package/src/collections/createSelectionState.d.ts +0 -89
- package/src/collections/createSelectionState.d.ts.map +0 -1
- package/src/collections/index.d.ts +0 -38
- package/src/collections/index.d.ts.map +0 -1
- package/src/collections/types.d.ts +0 -147
- package/src/collections/types.d.ts.map +0 -1
- package/src/color/Color.d.ts +0 -43
- package/src/color/Color.d.ts.map +0 -1
- package/src/color/createColorAreaState.d.ts +0 -78
- package/src/color/createColorAreaState.d.ts.map +0 -1
- package/src/color/createColorFieldState.d.ts +0 -57
- package/src/color/createColorFieldState.d.ts.map +0 -1
- package/src/color/createColorSliderState.d.ts +0 -69
- package/src/color/createColorSliderState.d.ts.map +0 -1
- package/src/color/createColorWheelState.d.ts +0 -53
- package/src/color/createColorWheelState.d.ts.map +0 -1
- package/src/color/index.d.ts +0 -39
- package/src/color/index.d.ts.map +0 -1
- package/src/color/types.d.ts +0 -111
- package/src/color/types.d.ts.map +0 -1
- package/src/combobox/createComboBoxState.d.ts +0 -127
- package/src/combobox/createComboBoxState.d.ts.map +0 -1
- package/src/combobox/index.d.ts +0 -13
- package/src/combobox/index.d.ts.map +0 -1
- package/src/disclosure/createDisclosureState.d.ts +0 -68
- package/src/disclosure/createDisclosureState.d.ts.map +0 -1
- package/src/disclosure/index.d.ts +0 -10
- package/src/disclosure/index.d.ts.map +0 -1
- package/src/dnd/createDragState.d.ts +0 -68
- package/src/dnd/createDragState.d.ts.map +0 -1
- package/src/dnd/createDraggableCollectionState.d.ts +0 -68
- package/src/dnd/createDraggableCollectionState.d.ts.map +0 -1
- package/src/dnd/createDropState.d.ts +0 -80
- package/src/dnd/createDropState.d.ts.map +0 -1
- package/src/dnd/createDroppableCollectionState.d.ts +0 -107
- package/src/dnd/createDroppableCollectionState.d.ts.map +0 -1
- package/src/dnd/index.d.ts +0 -60
- package/src/dnd/index.d.ts.map +0 -1
- package/src/dnd/types.d.ts +0 -277
- package/src/dnd/types.d.ts.map +0 -1
- package/src/form/createFormValidationState.d.ts +0 -102
- package/src/form/index.d.ts +0 -16
- package/src/form/index.d.ts.map +0 -1
- package/src/grid/createGridState.d.ts +0 -15
- package/src/grid/createGridState.d.ts.map +0 -1
- package/src/grid/index.d.ts +0 -7
- package/src/grid/index.d.ts.map +0 -1
- package/src/grid/types.d.ts +0 -163
- package/src/grid/types.d.ts.map +0 -1
- package/src/index.d.ts +0 -311
- package/src/index.d.ts.map +0 -1
- package/src/numberfield/createNumberFieldState.d.ts +0 -67
- package/src/numberfield/createNumberFieldState.d.ts.map +0 -1
- package/src/numberfield/index.d.ts +0 -6
- package/src/numberfield/index.d.ts.map +0 -1
- package/src/overlays/createOverlayTriggerState.d.ts +0 -34
- package/src/overlays/createOverlayTriggerState.d.ts.map +0 -1
- package/src/overlays/index.d.ts +0 -6
- package/src/overlays/index.d.ts.map +0 -1
- package/src/radio/createRadioGroupState.d.ts +0 -79
- package/src/radio/createRadioGroupState.d.ts.map +0 -1
- package/src/radio/index.d.ts +0 -7
- package/src/radio/index.d.ts.map +0 -1
- package/src/searchfield/createSearchFieldState.d.ts +0 -27
- package/src/searchfield/createSearchFieldState.d.ts.map +0 -1
- package/src/searchfield/index.d.ts +0 -3
- package/src/searchfield/index.d.ts.map +0 -1
- package/src/select/createSelectState.d.ts +0 -75
- package/src/select/createSelectState.d.ts.map +0 -1
- package/src/select/index.d.ts +0 -2
- package/src/select/index.d.ts.map +0 -1
- package/src/slider/createSliderState.d.ts +0 -72
- package/src/slider/createSliderState.d.ts.map +0 -1
- package/src/slider/index.d.ts +0 -3
- package/src/slider/index.d.ts.map +0 -1
- package/src/ssr/index.d.ts +0 -28
- package/src/ssr/index.d.ts.map +0 -1
- package/src/table/TableCollection.d.ts +0 -54
- package/src/table/TableCollection.d.ts.map +0 -1
- package/src/table/createTableState.d.ts +0 -15
- package/src/table/createTableState.d.ts.map +0 -1
- package/src/table/index.d.ts +0 -18
- package/src/table/index.d.ts.map +0 -1
- package/src/table/types.d.ts +0 -145
- package/src/table/types.d.ts.map +0 -1
- package/src/tabs/createTabListState.d.ts +0 -70
- package/src/tabs/createTabListState.d.ts.map +0 -1
- package/src/tabs/index.d.ts +0 -8
- package/src/tabs/index.d.ts.map +0 -1
- package/src/textfield/createTextFieldState.d.ts +0 -32
- package/src/textfield/createTextFieldState.d.ts.map +0 -1
- package/src/textfield/index.d.ts +0 -6
- package/src/textfield/index.d.ts.map +0 -1
- package/src/toast/createToastState.d.ts +0 -129
- package/src/toast/createToastState.d.ts.map +0 -1
- package/src/toast/index.d.ts +0 -12
- package/src/toast/index.d.ts.map +0 -1
- package/src/toggle/createToggleState.d.ts +0 -34
- package/src/toggle/createToggleState.d.ts.map +0 -1
- package/src/toggle/index.d.ts +0 -2
- package/src/toggle/index.d.ts.map +0 -1
- package/src/tooltip/createTooltipTriggerState.d.ts +0 -39
- package/src/tooltip/createTooltipTriggerState.d.ts.map +0 -1
- package/src/tooltip/index.d.ts +0 -7
- package/src/tooltip/index.d.ts.map +0 -1
- package/src/tree/TreeCollection.d.ts +0 -43
- package/src/tree/TreeCollection.d.ts.map +0 -1
- package/src/tree/createTreeState.d.ts +0 -17
- package/src/tree/createTreeState.d.ts.map +0 -1
- package/src/tree/index.d.ts +0 -13
- package/src/tree/index.d.ts.map +0 -1
- package/src/tree/types.d.ts +0 -162
- package/src/tree/types.d.ts.map +0 -1
- package/src/utils/index.d.ts +0 -2
- package/src/utils/index.d.ts.map +0 -1
- package/src/utils/reactivity.d.ts +0 -28
- package/src/utils/reactivity.d.ts.map +0 -1
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Ported to SolidJS for Proyecto Viviana; based on packages/react-stately/src/radio/useRadioGroupState.ts
|
|
14
|
+
|
|
1
15
|
/**
|
|
2
16
|
* Radio group state for Solid Stately
|
|
3
17
|
*
|
|
@@ -7,8 +21,8 @@
|
|
|
7
21
|
* This is a 1:1 port of @react-stately/radio's useRadioGroupState.
|
|
8
22
|
*/
|
|
9
23
|
|
|
10
|
-
import { createMemo,
|
|
11
|
-
import { type MaybeAccessor, access } from "../utils";
|
|
24
|
+
import { createMemo, Accessor, untrack } from "solid-js";
|
|
25
|
+
import { createInternalSignal, type MaybeAccessor, access } from "../utils";
|
|
12
26
|
import { createId } from "../ssr";
|
|
13
27
|
import {
|
|
14
28
|
createFormValidationState,
|
|
@@ -123,15 +137,15 @@ export function createRadioGroupState(props: MaybeAccessor<RadioGroupProps> = {}
|
|
|
123
137
|
|
|
124
138
|
// Create internal signal for uncontrolled mode
|
|
125
139
|
// Initialize with defaultValue only (not value, which is for controlled mode)
|
|
126
|
-
const [internalValue, setInternalValue] =
|
|
140
|
+
const [internalValue, setInternalValue] = createInternalSignal<string | null>(
|
|
127
141
|
initialProps.defaultValue ?? null,
|
|
128
142
|
);
|
|
129
|
-
const [lastFocusedValue, setLastFocusedValueInternal] =
|
|
143
|
+
const [lastFocusedValue, setLastFocusedValueInternal] = createInternalSignal<string | null>(null);
|
|
130
144
|
|
|
131
145
|
// SolidJS-specific: Version counter for triggering DOM sync across all radios
|
|
132
146
|
// This handles the case where native radio behavior causes DOM state to desync
|
|
133
147
|
// from our reactive state (e.g., clicking a radio unchecks siblings in the DOM)
|
|
134
|
-
const [syncVersion, setSyncVersion] =
|
|
148
|
+
const [syncVersion, setSyncVersion] = createInternalSignal(0);
|
|
135
149
|
|
|
136
150
|
const controlledValue = createMemo<string | null | undefined>(() => {
|
|
137
151
|
const value = getProps().value;
|
|
@@ -206,7 +220,10 @@ export function createRadioGroupState(props: MaybeAccessor<RadioGroupProps> = {}
|
|
|
206
220
|
const state: RadioGroupState = {
|
|
207
221
|
name,
|
|
208
222
|
selectedValue,
|
|
209
|
-
|
|
223
|
+
// useRadioGroupState.ts:125 — a controlled value, including null, is the
|
|
224
|
+
// reset default. defaultValue applies only while uncontrolled.
|
|
225
|
+
defaultSelectedValue:
|
|
226
|
+
initialProps.value !== undefined ? initialProps.value : (initialProps.defaultValue ?? null),
|
|
210
227
|
setSelectedValue,
|
|
211
228
|
lastFocusedValue,
|
|
212
229
|
setLastFocusedValue,
|
|
@@ -1,10 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Ported to SolidJS for Proyecto Viviana; based on packages/react-stately/src/searchfield/useSearchFieldState.ts
|
|
14
|
+
|
|
1
15
|
/**
|
|
2
16
|
* Creates state for a search field component.
|
|
3
17
|
* Based on @react-stately/searchfield useSearchFieldState.
|
|
4
18
|
*/
|
|
5
19
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
20
|
+
import { createMemo } from "solid-js";
|
|
21
|
+
import type { Accessor } from "solid-js";
|
|
22
|
+
import { createInternalSignal, access, type MaybeAccessor } from "../utils";
|
|
8
23
|
|
|
9
24
|
export interface SearchFieldStateProps {
|
|
10
25
|
/** The current value (controlled). */
|
|
@@ -32,7 +47,7 @@ export function createSearchFieldState(
|
|
|
32
47
|
|
|
33
48
|
const isControlled = () => getProps().value !== undefined;
|
|
34
49
|
|
|
35
|
-
const [internalValue, setInternalValue] =
|
|
50
|
+
const [internalValue, setInternalValue] = createInternalSignal(getProps().defaultValue ?? "");
|
|
36
51
|
|
|
37
52
|
const value = createMemo(() => {
|
|
38
53
|
const p = getProps();
|
|
@@ -1,17 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Ported to SolidJS for Proyecto Viviana; based on packages/react-stately/src/select/useSelectState.ts
|
|
14
|
+
|
|
1
15
|
/**
|
|
2
16
|
* State management for select components.
|
|
3
17
|
* Based on @react-stately/select useSelectState.
|
|
4
18
|
*/
|
|
5
19
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
20
|
+
import { createMemo, untrack } from "solid-js";
|
|
21
|
+
import type { Accessor } from "solid-js";
|
|
22
|
+
import { createInternalSignal, propsAccessor, type MaybeAccessor } from "../utils";
|
|
8
23
|
import { createListState } from "../collections/createListState";
|
|
9
24
|
import { createOverlayTriggerState } from "../overlays";
|
|
10
|
-
import type { Key, CollectionNode, Collection } from "../collections/types";
|
|
11
|
-
import type { SelectionMode, Selection } from "../collections/types";
|
|
25
|
+
import type { Key, CollectionNode, Collection, FocusStrategy } from "../collections/types";
|
|
12
26
|
import type { SelectionManager } from "../selection/SelectionManager";
|
|
27
|
+
import {
|
|
28
|
+
createFormValidationState,
|
|
29
|
+
type FormValidationState,
|
|
30
|
+
type ValidationFunction,
|
|
31
|
+
} from "../form";
|
|
32
|
+
|
|
33
|
+
/** Select never uses the collection `"none"` mode. */
|
|
34
|
+
export type SelectSelectionMode = "single" | "multiple";
|
|
35
|
+
|
|
36
|
+
/** Single mode is `Key | null`. Multiple mode is `readonly Key[]`. */
|
|
37
|
+
export type SelectValueType<M extends SelectSelectionMode> = M extends "single"
|
|
38
|
+
? Key | null
|
|
39
|
+
: readonly Key[];
|
|
40
|
+
|
|
41
|
+
/** `onChange` receives a mutable `Key[]` in multiple mode. */
|
|
42
|
+
export type SelectChangeValueType<M extends SelectSelectionMode> = M extends "single"
|
|
43
|
+
? Key | null
|
|
44
|
+
: Key[];
|
|
13
45
|
|
|
14
|
-
|
|
46
|
+
type SelectValidationType<M extends SelectSelectionMode> = M extends "single" ? Key : Key[];
|
|
47
|
+
|
|
48
|
+
export interface SelectStateProps<T = unknown, M extends SelectSelectionMode = "single"> {
|
|
15
49
|
/** The items to display in the select. */
|
|
16
50
|
items: T[];
|
|
17
51
|
/** Function to get the key for an item. */
|
|
@@ -22,33 +56,71 @@ export interface SelectStateProps<T = unknown> {
|
|
|
22
56
|
getDisabled?: (item: T) => boolean;
|
|
23
57
|
/** Keys of disabled items. */
|
|
24
58
|
disabledKeys?: Iterable<Key>;
|
|
25
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Whether single or multiple selection is enabled.
|
|
61
|
+
* @default 'single'
|
|
62
|
+
*/
|
|
63
|
+
selectionMode?: M;
|
|
64
|
+
/**
|
|
65
|
+
* The current value (controlled).
|
|
66
|
+
* Single mode is `Key | null`. Multiple mode is `readonly Key[]`.
|
|
67
|
+
*/
|
|
68
|
+
value?: SelectValueType<M>;
|
|
69
|
+
/** The default value (uncontrolled). */
|
|
70
|
+
defaultValue?: SelectValueType<M>;
|
|
71
|
+
/** Handler called when the value changes. */
|
|
72
|
+
onChange?: (value: SelectChangeValueType<M>) => void;
|
|
73
|
+
/**
|
|
74
|
+
* The currently selected key in the collection (controlled).
|
|
75
|
+
* @deprecated Use `value`.
|
|
76
|
+
*/
|
|
26
77
|
selectedKey?: Key | null;
|
|
27
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* The initial selected key in the collection (uncontrolled).
|
|
80
|
+
* @deprecated Use `defaultValue`.
|
|
81
|
+
*/
|
|
28
82
|
defaultSelectedKey?: Key | null;
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
/** Handler called when the selection changes. */
|
|
83
|
+
/**
|
|
84
|
+
* Handler that is called when the selection changes.
|
|
85
|
+
* @deprecated Use `onChange`.
|
|
86
|
+
*/
|
|
34
87
|
onSelectionChange?: (key: Key | null) => void;
|
|
35
|
-
/** Handler called when selected keys change. */
|
|
36
|
-
onSelectionChangeKeys?: (keys: Selection) => void;
|
|
37
|
-
/** Selection mode for the select. */
|
|
38
|
-
selectionMode?: Extract<SelectionMode, "single" | "multiple">;
|
|
39
88
|
/** Whether the select is open (controlled). */
|
|
40
89
|
isOpen?: boolean;
|
|
41
90
|
/** Whether the select is open by default (uncontrolled). */
|
|
42
91
|
defaultOpen?: boolean;
|
|
43
92
|
/** Handler called when the open state changes. */
|
|
44
93
|
onOpenChange?: (isOpen: boolean) => void;
|
|
94
|
+
/**
|
|
95
|
+
* Whether the Select should close when an item is selected. Defaults to true
|
|
96
|
+
* when selectionMode is single, false otherwise.
|
|
97
|
+
*/
|
|
98
|
+
shouldCloseOnSelect?: boolean;
|
|
99
|
+
/** Whether the select should be allowed to be open when the collection is empty. */
|
|
100
|
+
allowsEmptyCollection?: boolean;
|
|
45
101
|
/** Whether the select is disabled. */
|
|
46
102
|
isDisabled?: boolean;
|
|
47
103
|
/** Whether the select is required. */
|
|
48
104
|
isRequired?: boolean;
|
|
105
|
+
/** Whether the select is invalid (controlled). */
|
|
106
|
+
isInvalid?: boolean;
|
|
107
|
+
/** @deprecated Use isInvalid instead. */
|
|
108
|
+
validationState?: "valid" | "invalid";
|
|
109
|
+
/** Custom validation function. */
|
|
110
|
+
validate?: ValidationFunction<SelectValidationType<M> | null>;
|
|
111
|
+
/**
|
|
112
|
+
* Whether to use native HTML form validation or ARIA validation semantics.
|
|
113
|
+
* @default "native"
|
|
114
|
+
*/
|
|
115
|
+
validationBehavior?: "aria" | "native";
|
|
116
|
+
/** Field name(s) for server error lookup. */
|
|
117
|
+
name?: string | string[];
|
|
49
118
|
}
|
|
50
119
|
|
|
51
|
-
export interface SelectState<
|
|
120
|
+
export interface SelectState<
|
|
121
|
+
T = unknown,
|
|
122
|
+
M extends SelectSelectionMode = "single",
|
|
123
|
+
> extends FormValidationState {
|
|
52
124
|
/** The collection of items. */
|
|
53
125
|
readonly collection: Accessor<Collection<T>>;
|
|
54
126
|
/**
|
|
@@ -59,23 +131,48 @@ export interface SelectState<T = unknown> {
|
|
|
59
131
|
/** Whether the select dropdown is open. */
|
|
60
132
|
readonly isOpen: Accessor<boolean>;
|
|
61
133
|
/** Open the select dropdown. */
|
|
62
|
-
open(): void;
|
|
134
|
+
open(focusStrategy?: FocusStrategy | null): void;
|
|
63
135
|
/** Close the select dropdown. */
|
|
64
136
|
close(): void;
|
|
65
137
|
/** Toggle the select dropdown. */
|
|
66
|
-
toggle(): void;
|
|
67
|
-
/**
|
|
138
|
+
toggle(focusStrategy?: FocusStrategy | null): void;
|
|
139
|
+
/** Controls which item will be auto focused when the menu opens. */
|
|
140
|
+
readonly focusStrategy: Accessor<FocusStrategy | null>;
|
|
141
|
+
/**
|
|
142
|
+
* The key for the first selected item.
|
|
143
|
+
* @deprecated Use `value`.
|
|
144
|
+
*/
|
|
68
145
|
readonly selectedKey: Accessor<Key | null>;
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
146
|
+
/**
|
|
147
|
+
* The default selected key.
|
|
148
|
+
* @deprecated Use `defaultValue`.
|
|
149
|
+
*/
|
|
150
|
+
readonly defaultSelectedKey: Key | null;
|
|
151
|
+
/**
|
|
152
|
+
* Sets the selected key.
|
|
153
|
+
* @deprecated Use `setValue`.
|
|
154
|
+
*/
|
|
76
155
|
setSelectedKey(key: Key | null): void;
|
|
77
|
-
/**
|
|
156
|
+
/** The current select value. */
|
|
157
|
+
readonly value: Accessor<SelectValueType<M>>;
|
|
158
|
+
/** The default select value. */
|
|
159
|
+
readonly defaultValue: SelectValueType<M>;
|
|
160
|
+
/** Sets the select value. */
|
|
161
|
+
setValue(value: Key | readonly Key[] | null): void;
|
|
162
|
+
/**
|
|
163
|
+
* Selected keys derived from `value`.
|
|
164
|
+
* Kept for list and hidden-select adapters. Never `"all"`.
|
|
165
|
+
*/
|
|
166
|
+
readonly selectedKeys: Accessor<Set<Key>>;
|
|
167
|
+
/** Replace the selected keys. */
|
|
78
168
|
setSelectedKeys(keys: Iterable<Key>): void;
|
|
169
|
+
/**
|
|
170
|
+
* The value of the first selected item.
|
|
171
|
+
* @deprecated Use `selectedItems`.
|
|
172
|
+
*/
|
|
173
|
+
readonly selectedItem: Accessor<CollectionNode<T> | null>;
|
|
174
|
+
/** The value of the selected items. */
|
|
175
|
+
readonly selectedItems: Accessor<CollectionNode<T>[]>;
|
|
79
176
|
/** The currently focused key. */
|
|
80
177
|
readonly focusedKey: Accessor<Key | null>;
|
|
81
178
|
/** Set the focused key. */
|
|
@@ -91,20 +188,29 @@ export interface SelectState<T = unknown> {
|
|
|
91
188
|
/** Whether the select is required. */
|
|
92
189
|
readonly isRequired: boolean;
|
|
93
190
|
/** The selection mode. */
|
|
94
|
-
readonly selectionMode: Accessor<
|
|
191
|
+
readonly selectionMode: Accessor<M>;
|
|
192
|
+
/** Whether selecting an item closes the menu. */
|
|
193
|
+
readonly shouldCloseOnSelect: Accessor<boolean>;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function convertValue(value: Key | readonly Key[] | null | undefined): readonly Key[] | undefined {
|
|
197
|
+
if (value === undefined) return undefined;
|
|
198
|
+
if (value === null || typeof value === "string" || typeof value === "number") {
|
|
199
|
+
return value == null ? [] : [value];
|
|
200
|
+
}
|
|
201
|
+
return value;
|
|
95
202
|
}
|
|
96
203
|
|
|
97
204
|
/**
|
|
98
205
|
* Creates state for a select component.
|
|
99
206
|
* Combines list state with overlay trigger state for dropdown behavior.
|
|
100
207
|
*/
|
|
101
|
-
export function createSelectState<T = unknown>(
|
|
102
|
-
props: MaybeAccessor<SelectStateProps<T>>,
|
|
103
|
-
): SelectState<T> {
|
|
104
|
-
const getProps = (
|
|
105
|
-
const selectionMode: Accessor<
|
|
208
|
+
export function createSelectState<T = unknown, M extends SelectSelectionMode = "single">(
|
|
209
|
+
props: MaybeAccessor<SelectStateProps<T, M>>,
|
|
210
|
+
): SelectState<T, M> {
|
|
211
|
+
const getProps = propsAccessor(props);
|
|
212
|
+
const selectionMode: Accessor<M> = () => (getProps().selectionMode ?? "single") as M;
|
|
106
213
|
|
|
107
|
-
// Overlay trigger state for open/close
|
|
108
214
|
const overlayState = createOverlayTriggerState({
|
|
109
215
|
get isOpen() {
|
|
110
216
|
return getProps().isOpen;
|
|
@@ -117,83 +223,155 @@ export function createSelectState<T = unknown>(
|
|
|
117
223
|
},
|
|
118
224
|
});
|
|
119
225
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
? "all"
|
|
129
|
-
: new Set(getProps().defaultSelectedKeys ?? []),
|
|
130
|
-
);
|
|
226
|
+
const resolvedDefault = untrack((): Key | readonly Key[] | null => {
|
|
227
|
+
const current = getProps();
|
|
228
|
+
if (current.defaultValue !== undefined) {
|
|
229
|
+
return current.defaultValue as Key | readonly Key[] | null;
|
|
230
|
+
}
|
|
231
|
+
const mode = current.selectionMode ?? "single";
|
|
232
|
+
return mode === "single" ? (current.defaultSelectedKey ?? null) : [];
|
|
233
|
+
});
|
|
131
234
|
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return
|
|
235
|
+
const controlledProp = (): SelectValueType<M> | undefined => {
|
|
236
|
+
const current = getProps();
|
|
237
|
+
if (current.value !== undefined) return current.value;
|
|
238
|
+
if (selectionMode() === "single" && current.selectedKey !== undefined) {
|
|
239
|
+
return (current.selectedKey ?? null) as SelectValueType<M>;
|
|
137
240
|
}
|
|
241
|
+
return undefined;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
const [internalValue, setInternalValue] = createInternalSignal<Key | readonly Key[] | null>(
|
|
245
|
+
resolvedDefault,
|
|
246
|
+
);
|
|
138
247
|
|
|
139
|
-
|
|
248
|
+
const readControlled = (): Key | readonly Key[] | null | undefined => {
|
|
249
|
+
const controlled = controlledProp();
|
|
250
|
+
return controlled === undefined ? undefined : (controlled as Key | readonly Key[] | null);
|
|
140
251
|
};
|
|
141
252
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
253
|
+
let valueRef: Key | readonly Key[] | null = untrack(() => {
|
|
254
|
+
const controlled = readControlled();
|
|
255
|
+
return controlled !== undefined ? controlled : internalValue();
|
|
256
|
+
});
|
|
257
|
+
let wroteThisTurn = false;
|
|
258
|
+
|
|
259
|
+
const syncValueRef = () => {
|
|
260
|
+
if (wroteThisTurn) return;
|
|
261
|
+
const controlled = readControlled();
|
|
262
|
+
valueRef = controlled !== undefined ? controlled : untrack(internalValue);
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const displayValue = (): Key | readonly Key[] | null => {
|
|
266
|
+
const controlled = readControlled();
|
|
267
|
+
const raw = controlled !== undefined ? controlled : internalValue();
|
|
268
|
+
if (
|
|
269
|
+
selectionMode() === "single" &&
|
|
270
|
+
raw !== null &&
|
|
271
|
+
typeof raw !== "string" &&
|
|
272
|
+
typeof raw !== "number"
|
|
273
|
+
) {
|
|
274
|
+
return raw[0] ?? null;
|
|
275
|
+
}
|
|
276
|
+
return raw;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const setValue = (next: Key | readonly Key[] | null) => {
|
|
280
|
+
syncValueRef();
|
|
281
|
+
if (selectionMode() === "single") {
|
|
282
|
+
const key: Key | null =
|
|
283
|
+
typeof next === "string" || typeof next === "number"
|
|
284
|
+
? next
|
|
285
|
+
: next === null
|
|
286
|
+
? null
|
|
287
|
+
: (next[0] ?? null);
|
|
288
|
+
// Both callbacks follow this request, not a comparison with displayValue.
|
|
289
|
+
// A refused controlled value stays stale for the turn, so a second
|
|
290
|
+
// same-key call would notify the legacy callback again. React Stately
|
|
291
|
+
// still compares displayValue; this is the Solid same-turn adaptation.
|
|
292
|
+
// A later turn resyncs valueRef, and a different key is its own request.
|
|
293
|
+
if (!Object.is(valueRef, key)) {
|
|
294
|
+
valueRef = key;
|
|
295
|
+
wroteThisTurn = true;
|
|
296
|
+
queueMicrotask(() => {
|
|
297
|
+
wroteThisTurn = false;
|
|
298
|
+
});
|
|
299
|
+
if (controlledProp() === undefined) {
|
|
300
|
+
setInternalValue(key);
|
|
154
301
|
}
|
|
155
|
-
getProps().
|
|
302
|
+
getProps().onChange?.(key as SelectChangeValueType<M>);
|
|
156
303
|
getProps().onSelectionChange?.(key);
|
|
157
304
|
}
|
|
158
305
|
return;
|
|
159
306
|
}
|
|
160
307
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
return keys === "all" ? "all" : new Set<Key>(keys ?? []);
|
|
308
|
+
// Keep the readonly list for state. `onChange` receives its own mutable copy.
|
|
309
|
+
const keys: readonly Key[] =
|
|
310
|
+
typeof next === "string" || typeof next === "number" ? [next] : next === null ? [] : next;
|
|
311
|
+
if (!Object.is(valueRef, keys)) {
|
|
312
|
+
valueRef = keys;
|
|
313
|
+
wroteThisTurn = true;
|
|
314
|
+
queueMicrotask(() => {
|
|
315
|
+
wroteThisTurn = false;
|
|
316
|
+
});
|
|
317
|
+
if (controlledProp() === undefined) {
|
|
318
|
+
setInternalValue(keys);
|
|
173
319
|
}
|
|
174
|
-
|
|
320
|
+
getProps().onChange?.([...keys] as SelectChangeValueType<M>);
|
|
175
321
|
}
|
|
176
|
-
|
|
177
|
-
const key = selectedKey();
|
|
178
|
-
return key != null ? new Set<Key>([key]) : new Set<Key>();
|
|
179
|
-
});
|
|
322
|
+
};
|
|
180
323
|
|
|
181
324
|
const setSelectedKeys = (keys: Iterable<Key>) => {
|
|
182
|
-
const next = new Set(keys);
|
|
183
325
|
if (selectionMode() === "multiple") {
|
|
184
|
-
|
|
185
|
-
setInternalSelectedKeys(next);
|
|
186
|
-
}
|
|
187
|
-
getProps().onSelectionChangeKeys?.(next);
|
|
188
|
-
getProps().onSelectionChange?.(next.size > 0 ? Array.from(next)[0] : null);
|
|
326
|
+
setValue([...keys]);
|
|
189
327
|
return;
|
|
190
328
|
}
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
329
|
+
let key: Key | null = null;
|
|
330
|
+
for (const item of keys) {
|
|
331
|
+
key = item;
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
setValue(key);
|
|
194
335
|
};
|
|
195
336
|
|
|
196
|
-
|
|
337
|
+
const initialDisplay = untrack(displayValue);
|
|
338
|
+
const stateDefaultValue = (resolvedDefault ?? initialDisplay) as SelectValueType<M>;
|
|
339
|
+
const defaultSelectedKey =
|
|
340
|
+
untrack(() => getProps().defaultSelectedKey) ??
|
|
341
|
+
(untrack(() => getProps().selectionMode) === "single" ? (initialDisplay as Key) : null);
|
|
342
|
+
|
|
343
|
+
const shouldCloseOnSelect = () => getProps().shouldCloseOnSelect ?? selectionMode() === "single";
|
|
344
|
+
|
|
345
|
+
const validation = createFormValidationState({
|
|
346
|
+
get value() {
|
|
347
|
+
const display = displayValue();
|
|
348
|
+
if (
|
|
349
|
+
display !== null &&
|
|
350
|
+
typeof display !== "string" &&
|
|
351
|
+
typeof display !== "number" &&
|
|
352
|
+
display.length === 0
|
|
353
|
+
) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
return display;
|
|
357
|
+
},
|
|
358
|
+
get isInvalid() {
|
|
359
|
+
return getProps().isInvalid;
|
|
360
|
+
},
|
|
361
|
+
get validationState() {
|
|
362
|
+
return getProps().validationState;
|
|
363
|
+
},
|
|
364
|
+
get validate() {
|
|
365
|
+
return getProps().validate as ValidationFunction<unknown> | undefined;
|
|
366
|
+
},
|
|
367
|
+
get name() {
|
|
368
|
+
return getProps().name;
|
|
369
|
+
},
|
|
370
|
+
get validationBehavior() {
|
|
371
|
+
return getProps().validationBehavior ?? "native";
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
|
|
197
375
|
const listState = createListState<T>({
|
|
198
376
|
get items() {
|
|
199
377
|
return getProps().items;
|
|
@@ -213,40 +391,39 @@ export function createSelectState<T = unknown>(
|
|
|
213
391
|
get selectionMode() {
|
|
214
392
|
return selectionMode();
|
|
215
393
|
},
|
|
216
|
-
|
|
394
|
+
// Upstream only requires a value in single-selection mode. Multiple
|
|
395
|
+
// selection must permit toggling the last selected option off.
|
|
396
|
+
get disallowEmptySelection() {
|
|
397
|
+
return selectionMode() === "single";
|
|
398
|
+
},
|
|
399
|
+
allowDuplicateSelectionEvents: true,
|
|
217
400
|
get selectedKeys() {
|
|
218
|
-
|
|
219
|
-
if (keys === "all") return "all";
|
|
220
|
-
return keys;
|
|
401
|
+
return convertValue(displayValue()) ?? [];
|
|
221
402
|
},
|
|
222
403
|
onSelectionChange(keys) {
|
|
223
|
-
if (selectionMode() === "multiple") {
|
|
224
|
-
if (!isControlledMultiple()) {
|
|
225
|
-
setInternalSelectedKeys(keys);
|
|
226
|
-
}
|
|
227
|
-
getProps().onSelectionChangeKeys?.(keys);
|
|
228
|
-
if (keys !== "all") {
|
|
229
|
-
getProps().onSelectionChange?.(keys.size > 0 ? Array.from(keys)[0] : null);
|
|
230
|
-
}
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Get the first (and only) selected key
|
|
235
404
|
if (keys === "all") return;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
405
|
+
if (selectionMode() === "single") {
|
|
406
|
+
setValue(keys.values().next().value ?? null);
|
|
407
|
+
} else {
|
|
408
|
+
setValue([...keys]);
|
|
409
|
+
}
|
|
410
|
+
if (shouldCloseOnSelect()) {
|
|
411
|
+
overlayState.close();
|
|
412
|
+
}
|
|
413
|
+
validation.commitValidation();
|
|
240
414
|
},
|
|
241
415
|
});
|
|
242
416
|
|
|
417
|
+
const [focusStrategy, setFocusStrategy] = createInternalSignal<FocusStrategy | null>(null);
|
|
243
418
|
// The select's own focus state (the trigger), separate from the collection's
|
|
244
419
|
// focus-within state on the selection manager — upstream useSelectState keeps
|
|
245
420
|
// these apart with a dedicated useState. Sharing the manager's signal makes
|
|
246
421
|
// trigger focus re-arm the item roving-focus effect and steal focus back.
|
|
247
|
-
const [isFocused, setFocused] =
|
|
422
|
+
const [isFocused, setFocused] = createInternalSignal(false);
|
|
423
|
+
|
|
424
|
+
const selectedKey: Accessor<Key | null> = () => listState.selectionManager.firstSelectedKey;
|
|
425
|
+
const selectedKeys: Accessor<Set<Key>> = () => new Set(convertValue(displayValue()) ?? []);
|
|
248
426
|
|
|
249
|
-
// Get the selected item from the collection (memoized)
|
|
250
427
|
const selectedItem: Accessor<CollectionNode<T> | null> = createMemo(() => {
|
|
251
428
|
const key = selectedKey();
|
|
252
429
|
if (key == null) return null;
|
|
@@ -254,43 +431,53 @@ export function createSelectState<T = unknown>(
|
|
|
254
431
|
});
|
|
255
432
|
|
|
256
433
|
const selectedItems: Accessor<CollectionNode<T>[]> = createMemo(() => {
|
|
257
|
-
const keys = selectedKeys();
|
|
258
|
-
if (keys === "all") {
|
|
259
|
-
return Array.from(listState.collection());
|
|
260
|
-
}
|
|
261
|
-
|
|
262
434
|
const items: CollectionNode<T>[] = [];
|
|
263
|
-
for (const key of
|
|
435
|
+
for (const key of listState.selectionManager.selectedKeys) {
|
|
264
436
|
const item = listState.collection().getItem(key);
|
|
265
437
|
if (item) items.push(item);
|
|
266
438
|
}
|
|
267
439
|
return items;
|
|
268
440
|
});
|
|
269
441
|
|
|
442
|
+
const canOpenMenu = () =>
|
|
443
|
+
listState.collection().size !== 0 || getProps().allowsEmptyCollection === true;
|
|
444
|
+
|
|
270
445
|
return {
|
|
271
|
-
|
|
446
|
+
realtimeValidation: validation.realtimeValidation,
|
|
447
|
+
displayValidation: validation.displayValidation,
|
|
448
|
+
updateValidation: validation.updateValidation,
|
|
449
|
+
resetValidation: validation.resetValidation,
|
|
450
|
+
commitValidation: validation.commitValidation,
|
|
272
451
|
collection: listState.collection,
|
|
273
452
|
selectionManager: listState.selectionManager,
|
|
274
|
-
|
|
275
|
-
// Focus management
|
|
276
453
|
focusedKey: listState.focusedKey,
|
|
277
454
|
setFocusedKey: listState.setFocusedKey,
|
|
278
455
|
isFocused,
|
|
279
456
|
setFocused,
|
|
280
|
-
|
|
281
|
-
// Overlay state
|
|
282
457
|
isOpen: overlayState.isOpen,
|
|
283
|
-
open:
|
|
458
|
+
open(strategy: FocusStrategy | null = null) {
|
|
459
|
+
if (!canOpenMenu()) return;
|
|
460
|
+
setFocusStrategy(strategy);
|
|
461
|
+
overlayState.open();
|
|
462
|
+
},
|
|
284
463
|
close: overlayState.close,
|
|
285
|
-
toggle:
|
|
286
|
-
|
|
287
|
-
|
|
464
|
+
toggle(strategy: FocusStrategy | null = null) {
|
|
465
|
+
if (!canOpenMenu()) return;
|
|
466
|
+
setFocusStrategy(strategy);
|
|
467
|
+
overlayState.toggle();
|
|
468
|
+
},
|
|
469
|
+
focusStrategy,
|
|
288
470
|
selectionMode,
|
|
471
|
+
shouldCloseOnSelect,
|
|
472
|
+
value: () => displayValue() as SelectValueType<M>,
|
|
473
|
+
defaultValue: stateDefaultValue,
|
|
474
|
+
setValue,
|
|
289
475
|
selectedKey,
|
|
476
|
+
defaultSelectedKey,
|
|
477
|
+
setSelectedKey: setValue,
|
|
290
478
|
selectedKeys,
|
|
291
479
|
selectedItem,
|
|
292
480
|
selectedItems,
|
|
293
|
-
setSelectedKey,
|
|
294
481
|
setSelectedKeys,
|
|
295
482
|
isKeyDisabled: (key: Key) => listState.isDisabled(key),
|
|
296
483
|
get isDisabled() {
|