@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/calendar/useCalendarState.ts
|
|
14
|
+
|
|
1
15
|
/**
|
|
2
16
|
* CalendarState for Solid-Stately
|
|
3
17
|
*
|
|
@@ -5,7 +19,8 @@
|
|
|
5
19
|
* Based on @react-stately/calendar useCalendarState
|
|
6
20
|
*/
|
|
7
21
|
|
|
8
|
-
import {
|
|
22
|
+
import { createMemo, createEffect } from "solid-js";
|
|
23
|
+
import type { Accessor } from "solid-js";
|
|
9
24
|
import {
|
|
10
25
|
type Calendar as InternationalizedCalendar,
|
|
11
26
|
type CalendarDate,
|
|
@@ -25,8 +40,9 @@ import {
|
|
|
25
40
|
createCalendar as intlCreateCalendar,
|
|
26
41
|
toCalendar as intlToCalendar,
|
|
27
42
|
toCalendarDate as intlToCalendarDate,
|
|
43
|
+
minDate,
|
|
28
44
|
} from "@internationalized/date";
|
|
29
|
-
import { access, type MaybeAccessor } from "../utils";
|
|
45
|
+
import { access, createInternalSignal, propsAccessor, readNow, type MaybeAccessor } from "../utils";
|
|
30
46
|
|
|
31
47
|
export type ValidationState = "valid" | "invalid";
|
|
32
48
|
export type CalendarPageBehavior = "single" | "visible";
|
|
@@ -75,7 +91,7 @@ export interface CalendarStateProps<
|
|
|
75
91
|
/** Callback that is called for each date in the calendar to determine if it is unavailable. */
|
|
76
92
|
isDateUnavailable?: (date: DateValue) => boolean;
|
|
77
93
|
/** The number of months to display at once. */
|
|
78
|
-
visibleMonths?: number
|
|
94
|
+
visibleMonths?: MaybeAccessor<number | undefined>;
|
|
79
95
|
/** Controls whether paging advances by one month or by the visible month range. */
|
|
80
96
|
pageBehavior?: CalendarPageBehavior;
|
|
81
97
|
/** Determines how the visible months align around the initial focused date. */
|
|
@@ -86,6 +102,8 @@ export interface CalendarStateProps<
|
|
|
86
102
|
isDateDisabled?: (date: DateValue) => boolean;
|
|
87
103
|
/** Validation state. */
|
|
88
104
|
validationState?: MaybeAccessor<ValidationState | undefined>;
|
|
105
|
+
/** Whether the current selection is invalid according to application logic. */
|
|
106
|
+
isInvalid?: boolean;
|
|
89
107
|
/** Error message. */
|
|
90
108
|
errorMessage?: string;
|
|
91
109
|
/** The first day of the week (0 = Sunday, 1 = Monday, etc.). */
|
|
@@ -138,6 +156,10 @@ export interface CalendarState<
|
|
|
138
156
|
isOutsideVisibleRange: (date: DateValue) => boolean;
|
|
139
157
|
/** Whether a date is invalid. */
|
|
140
158
|
isInvalid: (date: DateValue) => boolean;
|
|
159
|
+
/** Whether the previous page is entirely outside min/max. */
|
|
160
|
+
isPreviousVisibleRangeInvalid: () => boolean;
|
|
161
|
+
/** Whether the next page is entirely outside min/max. */
|
|
162
|
+
isNextVisibleRangeInvalid: () => boolean;
|
|
141
163
|
/** Moves focus to the previous page (month). */
|
|
142
164
|
focusPreviousPage: () => void;
|
|
143
165
|
/** Moves focus to the next page (month). */
|
|
@@ -186,21 +208,28 @@ export interface CalendarState<
|
|
|
186
208
|
export function createCalendarState<
|
|
187
209
|
T extends DateValue = CalendarDate,
|
|
188
210
|
M extends CalendarSelectionMode = "single",
|
|
189
|
-
>(props: CalendarStateProps<T, M
|
|
211
|
+
>(props: MaybeAccessor<CalendarStateProps<T, M>> = {}): CalendarState<T, M> {
|
|
212
|
+
const getProps = propsAccessor(props);
|
|
190
213
|
const timeZone = getLocalTimeZone();
|
|
191
|
-
const locale = createMemo(() => access(
|
|
192
|
-
const minValueState = createMemo(() => access(
|
|
193
|
-
const maxValueState = createMemo(() => access(
|
|
214
|
+
const locale = createMemo(() => access(getProps().locale) ?? "en-US");
|
|
215
|
+
const minValueState = createMemo(() => access(getProps().minValue) ?? null);
|
|
216
|
+
const maxValueState = createMemo(() => access(getProps().maxValue) ?? null);
|
|
194
217
|
const selectionMode = createMemo<CalendarSelectionMode>(
|
|
195
|
-
() => access(
|
|
218
|
+
() => access(getProps().selectionMode) ?? "single",
|
|
196
219
|
);
|
|
197
220
|
const resolvedOptions = createMemo(() => new DateFormatter(locale()).resolvedOptions());
|
|
198
221
|
const calendar = createMemo(() =>
|
|
199
|
-
(
|
|
222
|
+
(getProps().createCalendar ?? intlCreateCalendar)(
|
|
223
|
+
resolvedOptions().calendar as CalendarIdentifier,
|
|
224
|
+
),
|
|
225
|
+
);
|
|
226
|
+
const visibleMonths = createMemo(() =>
|
|
227
|
+
Math.max(1, Number(access(getProps().visibleMonths) ?? 1)),
|
|
200
228
|
);
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
229
|
+
const firstDayOfWeekName = (): CalendarDayOfWeek | undefined => {
|
|
230
|
+
const firstDayOfWeek = getProps().firstDayOfWeek;
|
|
231
|
+
return firstDayOfWeek == null ? undefined : dayOfWeekNames[firstDayOfWeek];
|
|
232
|
+
};
|
|
204
233
|
|
|
205
234
|
const toDisplayCalendarDate = (date: DateValue): CalendarDate =>
|
|
206
235
|
intlToCalendar(toCalendarDate(date), calendar());
|
|
@@ -208,15 +237,15 @@ export function createCalendarState<
|
|
|
208
237
|
const selectionAlignmentOffset = (): number => {
|
|
209
238
|
// Mirrors @react-stately/calendar useCalendarState, where selectionAlignment
|
|
210
239
|
// defaults to "center" (alignCenter) when not provided.
|
|
211
|
-
switch (
|
|
240
|
+
switch (getProps().selectionAlignment) {
|
|
212
241
|
case "start":
|
|
213
242
|
return 0;
|
|
214
243
|
case "end":
|
|
215
|
-
return Math.max(visibleMonths - 1, 0);
|
|
244
|
+
return Math.max(visibleMonths() - 1, 0);
|
|
216
245
|
case "center":
|
|
217
246
|
default: {
|
|
218
|
-
let halfDuration = Math.floor(visibleMonths / 2);
|
|
219
|
-
if (halfDuration > 0 && visibleMonths % 2 === 0) {
|
|
247
|
+
let halfDuration = Math.floor(visibleMonths() / 2);
|
|
248
|
+
if (halfDuration > 0 && visibleMonths() % 2 === 0) {
|
|
220
249
|
halfDuration--;
|
|
221
250
|
}
|
|
222
251
|
return halfDuration;
|
|
@@ -224,15 +253,50 @@ export function createCalendarState<
|
|
|
224
253
|
}
|
|
225
254
|
};
|
|
226
255
|
|
|
256
|
+
const rawAlignStart = (date: CalendarDate): CalendarDate => startOfMonth(date);
|
|
257
|
+
|
|
258
|
+
const rawAlignEnd = (date: CalendarDate, months: number): CalendarDate =>
|
|
259
|
+
startOfMonth(date).subtract({ months: Math.max(months - 1, 0) });
|
|
260
|
+
|
|
261
|
+
// Month-duration constrainStart. The focused date only gates the clamp.
|
|
262
|
+
// alignStart(min) and alignEnd(max) take no min/max of their own. Compare
|
|
263
|
+
// instead of maxDate/minDate so a cross-calendar null is not introduced.
|
|
264
|
+
const constrainVisibleRangeStart = (
|
|
265
|
+
date: CalendarDate,
|
|
266
|
+
aligned: CalendarDate,
|
|
267
|
+
months: number,
|
|
268
|
+
): CalendarDate => {
|
|
269
|
+
const minValue = access(getProps().minValue);
|
|
270
|
+
const maxValue = access(getProps().maxValue);
|
|
271
|
+
let constrained = aligned;
|
|
272
|
+
|
|
273
|
+
if (minValue && date.compare(toDisplayCalendarDate(minValue)) >= 0) {
|
|
274
|
+
const minStart = rawAlignStart(toDisplayCalendarDate(minValue));
|
|
275
|
+
if (minStart.compare(constrained) > 0) {
|
|
276
|
+
constrained = minStart;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (maxValue && date.compare(toDisplayCalendarDate(maxValue)) <= 0) {
|
|
281
|
+
const maxStart = rawAlignEnd(toDisplayCalendarDate(maxValue), months);
|
|
282
|
+
if (maxStart.compare(constrained) < 0) {
|
|
283
|
+
constrained = maxStart;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return constrained;
|
|
288
|
+
};
|
|
289
|
+
|
|
227
290
|
const alignVisibleRangeStart = (date: CalendarDate): CalendarDate => {
|
|
228
291
|
const offset = selectionAlignmentOffset();
|
|
229
|
-
|
|
292
|
+
const aligned = rawAlignStart(offset > 0 ? date.subtract({ months: offset }) : date);
|
|
293
|
+
return constrainVisibleRangeStart(date, aligned, visibleMonths());
|
|
230
294
|
};
|
|
231
295
|
|
|
232
296
|
const visibleRangeEnd = (start: CalendarDate): CalendarDate => {
|
|
233
297
|
let end = endOfMonth(start);
|
|
234
298
|
|
|
235
|
-
for (let i = 1; i < visibleMonths; i++) {
|
|
299
|
+
for (let i = 1; i < visibleMonths(); i++) {
|
|
236
300
|
end = endOfMonth(end.add({ months: 1 }));
|
|
237
301
|
}
|
|
238
302
|
|
|
@@ -240,8 +304,8 @@ export function createCalendarState<
|
|
|
240
304
|
};
|
|
241
305
|
|
|
242
306
|
const constrainDate = (date: CalendarDate): CalendarDate => {
|
|
243
|
-
const minValue = access(
|
|
244
|
-
const maxValue = access(
|
|
307
|
+
const minValue = access(getProps().minValue);
|
|
308
|
+
const maxValue = access(getProps().maxValue);
|
|
245
309
|
|
|
246
310
|
let constrained = date;
|
|
247
311
|
|
|
@@ -257,45 +321,51 @@ export function createCalendarState<
|
|
|
257
321
|
|
|
258
322
|
// Determine the initially focused date
|
|
259
323
|
const getInitialFocusedDate = (): CalendarDate => {
|
|
260
|
-
const controlledFocused = access(
|
|
324
|
+
const controlledFocused = access(getProps().focusedValue);
|
|
261
325
|
if (controlledFocused) {
|
|
262
326
|
return toDisplayCalendarDate(controlledFocused);
|
|
263
327
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const controlledValue = access(props.value);
|
|
268
|
-
const controlledFirst = Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;
|
|
269
|
-
if (controlledFirst) {
|
|
270
|
-
return toDisplayCalendarDate(controlledFirst);
|
|
328
|
+
const defaultFocusedValue = getProps().defaultFocusedValue;
|
|
329
|
+
if (defaultFocusedValue) {
|
|
330
|
+
return toDisplayCalendarDate(defaultFocusedValue);
|
|
271
331
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
if (
|
|
276
|
-
|
|
332
|
+
// A controlled null is a cleared selection. Pin useControlledState treats
|
|
333
|
+
// `value !== undefined` as controlled, so null must not fall through to defaultValue.
|
|
334
|
+
const controlledValue = access(getProps().value);
|
|
335
|
+
if (controlledValue !== undefined) {
|
|
336
|
+
const controlledFirst = Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;
|
|
337
|
+
if (controlledFirst) {
|
|
338
|
+
return toDisplayCalendarDate(controlledFirst);
|
|
339
|
+
}
|
|
340
|
+
} else {
|
|
341
|
+
const defaultValue = getProps().defaultValue;
|
|
342
|
+
const defaultFirst = Array.isArray(defaultValue) ? defaultValue[0] : defaultValue;
|
|
343
|
+
if (defaultFirst) {
|
|
344
|
+
return toDisplayCalendarDate(defaultFirst);
|
|
345
|
+
}
|
|
277
346
|
}
|
|
278
347
|
return intlToCalendar(today(timeZone), calendar());
|
|
279
348
|
};
|
|
280
349
|
|
|
281
350
|
// State signals
|
|
282
351
|
const initialFocusedDate = constrainDate(getInitialFocusedDate());
|
|
283
|
-
const [internalValue, setInternalValue] =
|
|
284
|
-
(
|
|
352
|
+
const [internalValue, setInternalValue] = createInternalSignal<T | T[] | null>(
|
|
353
|
+
(getProps().defaultValue as T | T[] | null) ?? null,
|
|
285
354
|
);
|
|
286
|
-
const [focusedDate, setFocusedDateInternal] =
|
|
287
|
-
|
|
355
|
+
const [focusedDate, setFocusedDateInternal] =
|
|
356
|
+
createInternalSignal<CalendarDate>(initialFocusedDate);
|
|
357
|
+
const [visibleRangeStart, setVisibleRangeStart] = createInternalSignal<CalendarDate>(
|
|
288
358
|
alignVisibleRangeStart(initialFocusedDate),
|
|
289
359
|
);
|
|
290
360
|
// Init from autoFocus, mirroring @react-stately useCalendarState
|
|
291
361
|
// (`useState(props.autoFocus || false)`). Without autoFocus the calendar
|
|
292
362
|
// mounts unfocused and never steals DOM focus.
|
|
293
|
-
const [isFocused, setFocused] =
|
|
294
|
-
const [isPaginating, setIsPaginating] =
|
|
363
|
+
const [isFocused, setFocused] = createInternalSignal(getProps().autoFocus ?? false);
|
|
364
|
+
const [isPaginating, setIsPaginating] = createInternalSignal(false);
|
|
295
365
|
|
|
296
366
|
// Controlled vs uncontrolled value
|
|
297
367
|
const sourceValue = createMemo<T | T[] | null>(() => {
|
|
298
|
-
const controlled = access(
|
|
368
|
+
const controlled = access(getProps().value);
|
|
299
369
|
return controlled !== undefined ? (controlled as T | T[] | null) : internalValue();
|
|
300
370
|
});
|
|
301
371
|
const value = createMemo<T | T[] | null>(() => {
|
|
@@ -307,80 +377,129 @@ export function createCalendarState<
|
|
|
307
377
|
});
|
|
308
378
|
|
|
309
379
|
// Derived states
|
|
310
|
-
const isDisabled = createMemo(() => access(
|
|
311
|
-
const isReadOnly = createMemo(() => access(
|
|
312
|
-
const validationState = createMemo(() => access(
|
|
313
|
-
|
|
380
|
+
const isDisabled = createMemo(() => access(getProps().isDisabled) ?? false);
|
|
381
|
+
const isReadOnly = createMemo(() => access(getProps().isReadOnly) ?? false);
|
|
382
|
+
const validationState = createMemo(() => access(getProps().validationState));
|
|
383
|
+
// A value is invalid when the caller says so, validationState is invalid,
|
|
384
|
+
// or a selected date is unavailable or outside min/max. Mirrors useCalendarState.
|
|
385
|
+
const isInvalidSelection = createMemo(() => {
|
|
386
|
+
const current = value();
|
|
387
|
+
if (current == null) return false;
|
|
388
|
+
const dates = Array.isArray(current) ? current : [current];
|
|
389
|
+
const min = access(getProps().minValue);
|
|
390
|
+
const max = access(getProps().maxValue);
|
|
391
|
+
const minCal = min != null ? toDisplayCalendarDate(min) : null;
|
|
392
|
+
const maxCal = max != null ? toDisplayCalendarDate(max) : null;
|
|
393
|
+
return dates.some((date) => {
|
|
394
|
+
const cal = toDisplayCalendarDate(date);
|
|
395
|
+
return (
|
|
396
|
+
Boolean(getProps().isDateUnavailable?.(cal)) ||
|
|
397
|
+
(minCal != null && cal.compare(minCal) < 0) ||
|
|
398
|
+
(maxCal != null && cal.compare(maxCal) > 0)
|
|
399
|
+
);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
const isValueInvalid = createMemo(
|
|
403
|
+
() =>
|
|
404
|
+
Boolean(access(getProps().isInvalid)) ||
|
|
405
|
+
validationState() === "invalid" ||
|
|
406
|
+
isInvalidSelection(),
|
|
407
|
+
);
|
|
314
408
|
|
|
315
|
-
// Visible range based on the paged range start.
|
|
316
|
-
|
|
409
|
+
// Visible range based on the paged range start. Function (not memo) so
|
|
410
|
+
// onFocusChange snapshots see the live page after a same-turn write.
|
|
411
|
+
const visibleRange = () => {
|
|
317
412
|
const start = visibleRangeStart();
|
|
318
413
|
const end = visibleRangeEnd(start);
|
|
319
414
|
|
|
320
415
|
return { start, end };
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const syncVisibleRangeForFocusedDate = (nextFocusedDate: CalendarDate) => {
|
|
324
|
-
const range = visibleRange();
|
|
416
|
+
};
|
|
325
417
|
|
|
418
|
+
const syncVisibleRangeForFocusedDate = (
|
|
419
|
+
nextFocusedDate: CalendarDate,
|
|
420
|
+
range: { start: CalendarDate; end: CalendarDate },
|
|
421
|
+
months: number,
|
|
422
|
+
) => {
|
|
326
423
|
if (nextFocusedDate.compare(range.start) < 0) {
|
|
327
|
-
setVisibleRangeStart(
|
|
424
|
+
setVisibleRangeStart(
|
|
425
|
+
constrainVisibleRangeStart(nextFocusedDate, rawAlignEnd(nextFocusedDate, months), months),
|
|
426
|
+
);
|
|
328
427
|
} else if (nextFocusedDate.compare(range.end) > 0) {
|
|
329
|
-
setVisibleRangeStart(
|
|
428
|
+
setVisibleRangeStart(
|
|
429
|
+
constrainVisibleRangeStart(nextFocusedDate, rawAlignStart(nextFocusedDate), months),
|
|
430
|
+
);
|
|
330
431
|
}
|
|
331
432
|
};
|
|
332
433
|
|
|
333
|
-
createEffect(
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
return;
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
const currentFocusedDate = focusedDate();
|
|
359
|
-
const nextFocusedDate = constrainDate(currentFocusedDate);
|
|
360
|
-
|
|
361
|
-
if (
|
|
362
|
-
nextFocusedDate.compare(currentFocusedDate) === 0 &&
|
|
363
|
-
isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
|
|
364
|
-
) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
syncVisibleRangeForFocusedDate(nextFocusedDate);
|
|
369
|
-
setFocusedDateInternal(nextFocusedDate);
|
|
370
|
-
props.onFocusChange?.(nextFocusedDate);
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
createEffect(() => {
|
|
374
|
-
const currentFocusedDate = focusedDate();
|
|
375
|
-
const nextFocusedDate = toDisplayCalendarDate(currentFocusedDate);
|
|
434
|
+
createEffect(
|
|
435
|
+
() => {
|
|
436
|
+
const controlledFocused = access(getProps().focusedValue);
|
|
437
|
+
if (!controlledFocused) return null;
|
|
438
|
+
return {
|
|
439
|
+
nextFocusedDate: constrainDate(toDisplayCalendarDate(controlledFocused)),
|
|
440
|
+
currentFocusedDate: focusedDate(),
|
|
441
|
+
range: visibleRange(),
|
|
442
|
+
months: visibleMonths(),
|
|
443
|
+
};
|
|
444
|
+
},
|
|
445
|
+
(data) => {
|
|
446
|
+
if (!data) return;
|
|
447
|
+
const { nextFocusedDate, currentFocusedDate, range, months } = data;
|
|
448
|
+
if (
|
|
449
|
+
nextFocusedDate.compare(currentFocusedDate) !== 0 ||
|
|
450
|
+
!isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
|
|
451
|
+
) {
|
|
452
|
+
setFocusedDateInternal(nextFocusedDate);
|
|
453
|
+
}
|
|
454
|
+
syncVisibleRangeForFocusedDate(nextFocusedDate, range, months);
|
|
455
|
+
},
|
|
456
|
+
);
|
|
376
457
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
458
|
+
createEffect(
|
|
459
|
+
() => {
|
|
460
|
+
const controlledFocused = access(getProps().focusedValue);
|
|
461
|
+
if (controlledFocused) return null;
|
|
462
|
+
const currentFocusedDate = focusedDate();
|
|
463
|
+
const nextFocusedDate = constrainDate(currentFocusedDate);
|
|
464
|
+
if (
|
|
465
|
+
nextFocusedDate.compare(currentFocusedDate) === 0 &&
|
|
466
|
+
isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
|
|
467
|
+
) {
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
currentFocusedDate,
|
|
472
|
+
nextFocusedDate,
|
|
473
|
+
range: visibleRange(),
|
|
474
|
+
months: visibleMonths(),
|
|
475
|
+
};
|
|
476
|
+
},
|
|
477
|
+
(data) => {
|
|
478
|
+
if (!data) return;
|
|
479
|
+
syncVisibleRangeForFocusedDate(data.nextFocusedDate, data.range, data.months);
|
|
480
|
+
setFocusedDateInternal(data.nextFocusedDate);
|
|
481
|
+
getProps().onFocusChange?.(data.nextFocusedDate);
|
|
482
|
+
},
|
|
483
|
+
);
|
|
380
484
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
485
|
+
createEffect(
|
|
486
|
+
() => {
|
|
487
|
+
const currentFocusedDate = focusedDate();
|
|
488
|
+
const nextFocusedDate = toDisplayCalendarDate(currentFocusedDate);
|
|
489
|
+
if (isEqualCalendar(currentFocusedDate.calendar, nextFocusedDate.calendar)) {
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
return {
|
|
493
|
+
nextFocusedDate,
|
|
494
|
+
alignedStart: alignVisibleRangeStart(nextFocusedDate),
|
|
495
|
+
};
|
|
496
|
+
},
|
|
497
|
+
(data) => {
|
|
498
|
+
if (!data) return;
|
|
499
|
+
setFocusedDateInternal(data.nextFocusedDate);
|
|
500
|
+
setVisibleRangeStart(data.alignedStart);
|
|
501
|
+
},
|
|
502
|
+
);
|
|
384
503
|
|
|
385
504
|
// Format week days for headers
|
|
386
505
|
const weekDays = createMemo(() => {
|
|
@@ -408,31 +527,54 @@ export function createCalendarState<
|
|
|
408
527
|
return formatter.format(formattableMonth.toDate(timeZone));
|
|
409
528
|
});
|
|
410
529
|
|
|
530
|
+
// Walks previousAvailableDate from minValue ?? minDate(constrained, startDate)
|
|
531
|
+
// rather than from startDate alone, so a date before the visible month remains
|
|
532
|
+
// selectable when isDateUnavailable is set. Mirrors useCalendarState.normalizeValue.
|
|
533
|
+
const normalizeValue = (newValue: CalendarDate): T | null => {
|
|
534
|
+
const constrained = constrainDate(newValue);
|
|
535
|
+
const minBound = access(getProps().minValue);
|
|
536
|
+
const lowerBound =
|
|
537
|
+
minBound != null
|
|
538
|
+
? toDisplayCalendarDate(minBound)
|
|
539
|
+
: (minDate(constrained, visibleRange().start) ?? constrained);
|
|
540
|
+
const prev = previousAvailableDate(constrained, lowerBound, getProps().isDateUnavailable);
|
|
541
|
+
if (!prev) {
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const oldValue = sourceValue();
|
|
546
|
+
const referenceValue = Array.isArray(oldValue) ? (oldValue[0] ?? null) : oldValue;
|
|
547
|
+
return convertValue(prev, referenceValue) as T;
|
|
548
|
+
};
|
|
549
|
+
|
|
411
550
|
// Set value with onChange callback
|
|
412
551
|
const setValue = (newValue: T | T[] | null) => {
|
|
413
552
|
if (isDisabled() || isReadOnly()) return;
|
|
414
553
|
|
|
415
554
|
const oldValue = sourceValue();
|
|
416
|
-
const referenceValue = Array.isArray(oldValue) ? (oldValue[0] ?? null) : oldValue;
|
|
417
555
|
|
|
418
556
|
let nextValue: T | T[] | null;
|
|
419
557
|
if (newValue == null) {
|
|
420
558
|
nextValue = selectionMode() === "multiple" ? ([] as T[]) : null;
|
|
421
559
|
} else if (Array.isArray(newValue)) {
|
|
422
|
-
nextValue = newValue
|
|
423
|
-
(v) =>
|
|
424
|
-
|
|
560
|
+
nextValue = newValue
|
|
561
|
+
.map((v) => normalizeValue(toDisplayCalendarDate(v)))
|
|
562
|
+
.filter((v): v is T => v != null);
|
|
425
563
|
} else {
|
|
426
|
-
|
|
564
|
+
const localValue = normalizeValue(toDisplayCalendarDate(newValue));
|
|
565
|
+
if (!localValue) {
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
nextValue = localValue;
|
|
427
569
|
}
|
|
428
570
|
|
|
429
|
-
const controlled = access(
|
|
571
|
+
const controlled = access(getProps().value);
|
|
430
572
|
if (controlled === undefined) {
|
|
431
573
|
setInternalValue(() => nextValue);
|
|
432
574
|
}
|
|
433
575
|
|
|
434
|
-
if (!Object.is(oldValue, nextValue)
|
|
435
|
-
|
|
576
|
+
if (!Object.is(oldValue, nextValue)) {
|
|
577
|
+
getProps().onChange?.(nextValue as CalendarValueType<T | null, M>);
|
|
436
578
|
}
|
|
437
579
|
};
|
|
438
580
|
|
|
@@ -444,9 +586,9 @@ export function createCalendarState<
|
|
|
444
586
|
return;
|
|
445
587
|
}
|
|
446
588
|
|
|
447
|
-
syncVisibleRangeForFocusedDate(constrained);
|
|
589
|
+
syncVisibleRangeForFocusedDate(constrained, visibleRange(), visibleMonths());
|
|
448
590
|
setFocusedDateInternal(constrained);
|
|
449
|
-
|
|
591
|
+
getProps().onFocusChange?.(constrained);
|
|
450
592
|
};
|
|
451
593
|
|
|
452
594
|
// Check if a date is selected
|
|
@@ -471,16 +613,16 @@ export function createCalendarState<
|
|
|
471
613
|
|
|
472
614
|
// Check if a date is unavailable
|
|
473
615
|
const isCellUnavailable = (date: DateValue): boolean => {
|
|
474
|
-
return
|
|
616
|
+
return getProps().isDateUnavailable?.(date) ?? false;
|
|
475
617
|
};
|
|
476
618
|
|
|
477
619
|
// Check if a date is disabled
|
|
478
620
|
const isCellDisabled = (date: DateValue): boolean => {
|
|
479
621
|
if (isDisabled()) return true;
|
|
480
|
-
if (
|
|
622
|
+
if (getProps().isDateDisabled?.(date)) return true;
|
|
481
623
|
|
|
482
|
-
const minValue = access(
|
|
483
|
-
const maxValue = access(
|
|
624
|
+
const minValue = access(getProps().minValue);
|
|
625
|
+
const maxValue = access(getProps().maxValue);
|
|
484
626
|
const calDate = toDisplayCalendarDate(date);
|
|
485
627
|
|
|
486
628
|
// Dates outside the visible range are disabled, mirroring
|
|
@@ -510,24 +652,51 @@ export function createCalendarState<
|
|
|
510
652
|
return isCellDisabled(date) || isCellUnavailable(date);
|
|
511
653
|
};
|
|
512
654
|
|
|
655
|
+
// RAC `useCalendarState.ts` `isPreviousVisibleRangeInvalid` /
|
|
656
|
+
// `isNextVisibleRangeInvalid`: prev = startDate−1 invalid; next = endDate+1.
|
|
657
|
+
const isDateOutsideAllowedRange = (date: DateValue): boolean => {
|
|
658
|
+
const min = minValueState();
|
|
659
|
+
const max = maxValueState();
|
|
660
|
+
const calDate = toDisplayCalendarDate(date);
|
|
661
|
+
if (min && calDate.compare(toDisplayCalendarDate(min)) < 0) return true;
|
|
662
|
+
if (max && calDate.compare(toDisplayCalendarDate(max)) > 0) return true;
|
|
663
|
+
return false;
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
const isPreviousVisibleRangeInvalid = () => {
|
|
667
|
+
const start = visibleRange().start;
|
|
668
|
+
const previous = start.subtract({ days: 1 });
|
|
669
|
+
return isSameDay(previous, start) || isDateOutsideAllowedRange(previous);
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
const isNextVisibleRangeInvalid = () => {
|
|
673
|
+
const end = visibleRange().end;
|
|
674
|
+
const next = end.add({ days: 1 });
|
|
675
|
+
return isSameDay(next, end) || isDateOutsideAllowedRange(next);
|
|
676
|
+
};
|
|
677
|
+
|
|
513
678
|
// Navigation methods
|
|
514
679
|
const focusPreviousPage = () => {
|
|
515
680
|
setIsPaginating(true);
|
|
516
|
-
const pageMonths =
|
|
517
|
-
const
|
|
681
|
+
const pageMonths = getProps().pageBehavior === "single" ? 1 : visibleMonths();
|
|
682
|
+
const currentFocused = focusedDate();
|
|
683
|
+
const nextFocusedDate = constrainDate(currentFocused.subtract({ months: pageMonths }));
|
|
684
|
+
const slidStart = startOfMonth(visibleRangeStart().subtract({ months: pageMonths }));
|
|
518
685
|
setFocusedDateInternal(nextFocusedDate);
|
|
519
|
-
setVisibleRangeStart(
|
|
520
|
-
|
|
686
|
+
setVisibleRangeStart(constrainVisibleRangeStart(currentFocused, slidStart, pageMonths));
|
|
687
|
+
getProps().onFocusChange?.(nextFocusedDate);
|
|
521
688
|
setIsPaginating(false);
|
|
522
689
|
};
|
|
523
690
|
|
|
524
691
|
const focusNextPage = () => {
|
|
525
692
|
setIsPaginating(true);
|
|
526
|
-
const pageMonths =
|
|
527
|
-
const
|
|
693
|
+
const pageMonths = getProps().pageBehavior === "single" ? 1 : visibleMonths();
|
|
694
|
+
const currentFocused = focusedDate();
|
|
695
|
+
const nextFocusedDate = constrainDate(currentFocused.add({ months: pageMonths }));
|
|
696
|
+
const slidStart = startOfMonth(visibleRangeStart().add({ months: pageMonths }));
|
|
528
697
|
setFocusedDateInternal(nextFocusedDate);
|
|
529
|
-
setVisibleRangeStart(
|
|
530
|
-
|
|
698
|
+
setVisibleRangeStart(constrainVisibleRangeStart(currentFocused, slidStart, pageMonths));
|
|
699
|
+
getProps().onFocusChange?.(nextFocusedDate);
|
|
531
700
|
setIsPaginating(false);
|
|
532
701
|
};
|
|
533
702
|
|
|
@@ -583,7 +752,7 @@ export function createCalendarState<
|
|
|
583
752
|
if (isReadOnly() || isDisabled()) return;
|
|
584
753
|
|
|
585
754
|
if (selectionMode() === "multiple") {
|
|
586
|
-
const current = value();
|
|
755
|
+
const current = access(getProps().value) !== undefined ? value() : readNow(internalValue);
|
|
587
756
|
const base: CalendarDate[] = Array.isArray(current)
|
|
588
757
|
? current.map((v) => toDisplayCalendarDate(v))
|
|
589
758
|
: current != null
|
|
@@ -655,6 +824,8 @@ export function createCalendarState<
|
|
|
655
824
|
isCellDisabled,
|
|
656
825
|
isOutsideVisibleRange,
|
|
657
826
|
isInvalid,
|
|
827
|
+
isPreviousVisibleRangeInvalid,
|
|
828
|
+
isNextVisibleRangeInvalid,
|
|
658
829
|
focusPreviousPage,
|
|
659
830
|
focusNextPage,
|
|
660
831
|
focusPreviousSection,
|
|
@@ -673,7 +844,9 @@ export function createCalendarState<
|
|
|
673
844
|
getWeeksInMonth: getWeeksInMonthFn,
|
|
674
845
|
weekDays,
|
|
675
846
|
title,
|
|
676
|
-
visibleMonths
|
|
847
|
+
get visibleMonths() {
|
|
848
|
+
return visibleMonths();
|
|
849
|
+
},
|
|
677
850
|
isPaginating,
|
|
678
851
|
};
|
|
679
852
|
}
|
|
@@ -695,3 +868,26 @@ function convertValue(newValue: CalendarDate, oldValue?: DateValue | null): Date
|
|
|
695
868
|
|
|
696
869
|
return localValue;
|
|
697
870
|
}
|
|
871
|
+
|
|
872
|
+
/**
|
|
873
|
+
* Walks backward from `date` while it is unavailable and still at/after `minValue`.
|
|
874
|
+
* Mirrors @react-stately/calendar previousAvailableDate.
|
|
875
|
+
*/
|
|
876
|
+
function previousAvailableDate(
|
|
877
|
+
date: CalendarDate,
|
|
878
|
+
minValue: CalendarDate,
|
|
879
|
+
isDateUnavailable?: (date: DateValue) => boolean,
|
|
880
|
+
): CalendarDate | null {
|
|
881
|
+
if (!isDateUnavailable) {
|
|
882
|
+
return date;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
while (date.compare(minValue) >= 0 && isDateUnavailable(date)) {
|
|
886
|
+
date = date.subtract({ days: 1 });
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
if (date.compare(minValue) >= 0) {
|
|
890
|
+
return date;
|
|
891
|
+
}
|
|
892
|
+
return null;
|
|
893
|
+
}
|