@proyecto-viviana/solid-stately 0.2.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -283
- package/dist/autocomplete/createAutocompleteState.d.ts +2 -2
- package/dist/autocomplete/index.d.ts +1 -1
- package/dist/calendar/IncompleteDate.d.ts +61 -0
- package/dist/calendar/createCalendarState.d.ts +41 -16
- package/dist/calendar/createDateFieldState.d.ts +39 -9
- package/dist/calendar/createDatePickerState.d.ts +60 -0
- package/dist/calendar/createRangeCalendarState.d.ts +37 -10
- package/dist/calendar/createTimeFieldState.d.ts +34 -7
- package/dist/calendar/index.d.ts +7 -6
- package/dist/checkbox/createCheckboxGroupState.d.ts +6 -6
- package/dist/checkbox/index.d.ts +1 -1
- package/dist/collections/ListCollection.d.ts +1 -1
- package/dist/collections/createListState.d.ts +11 -8
- package/dist/collections/createMenuState.d.ts +7 -7
- package/dist/collections/createSelectionState.d.ts +22 -10
- package/dist/collections/getChildNodes.d.ts +11 -0
- package/dist/collections/index.d.ts +6 -5
- package/dist/collections/types.d.ts +12 -12
- package/dist/color/Color.d.ts +1 -1
- package/dist/color/createColorAreaState.d.ts +4 -2
- package/dist/color/createColorFieldState.d.ts +38 -12
- package/dist/color/createColorSliderState.d.ts +9 -2
- package/dist/color/createColorWheelState.d.ts +13 -2
- package/dist/color/getColorChannels.d.ts +1 -1
- package/dist/color/index.d.ts +6 -6
- package/dist/color/types.d.ts +4 -4
- package/dist/combobox/createComboBoxState.d.ts +34 -13
- package/dist/combobox/index.d.ts +1 -1
- package/dist/data/createAsyncList.d.ts +4 -4
- package/dist/data/createListData.d.ts +2 -2
- package/dist/data/createTreeData.d.ts +6 -2
- package/dist/data/index.d.ts +3 -3
- package/dist/datepicker/index.d.ts +2 -4
- package/dist/disclosure/createDisclosureState.d.ts +2 -2
- package/dist/disclosure/index.d.ts +1 -1
- package/dist/dnd/createDragState.d.ts +2 -2
- package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
- package/dist/dnd/createDropState.d.ts +2 -2
- package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
- package/dist/dnd/index.d.ts +5 -5
- package/dist/dnd/types.d.ts +19 -17
- package/dist/form/createFormValidationState.d.ts +3 -3
- package/dist/form/index.d.ts +1 -1
- package/dist/grid/createGridState.d.ts +2 -2
- package/dist/grid/index.d.ts +2 -2
- package/dist/grid/types.d.ts +27 -11
- package/dist/index.d.ts +31 -30
- package/dist/index.js +9077 -7246
- package/dist/index.js.map +1 -1
- package/dist/menu/index.d.ts +2 -2
- package/dist/numberfield/createNumberFieldState.d.ts +2 -2
- package/dist/numberfield/index.d.ts +1 -1
- package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
- package/dist/overlays/index.d.ts +1 -1
- package/dist/radio/createRadioGroupState.d.ts +7 -7
- package/dist/radio/index.d.ts +1 -1
- package/dist/searchfield/createSearchFieldState.d.ts +2 -2
- package/dist/searchfield/index.d.ts +2 -2
- package/dist/select/createSelectState.d.ts +14 -8
- package/dist/select/index.d.ts +1 -1
- package/dist/selection/Selection.d.ts +16 -0
- package/dist/selection/SelectionManager.d.ts +110 -0
- package/dist/selection/createMultipleSelectionState.d.ts +59 -0
- package/dist/selection/index.d.ts +6 -5
- package/dist/slider/createSliderState.d.ts +3 -3
- package/dist/slider/index.d.ts +2 -2
- package/dist/steplist/createStepListState.d.ts +48 -0
- package/dist/steplist/index.d.ts +1 -0
- package/dist/table/TableCollection.d.ts +33 -3
- package/dist/table/createTableColumnResizeState.d.ts +54 -0
- package/dist/table/createTableState.d.ts +2 -2
- package/dist/table/createTreeGridState.d.ts +15 -0
- package/dist/table/index.d.ts +6 -3
- package/dist/table/types.d.ts +68 -10
- package/dist/tabs/createTabListState.d.ts +5 -5
- package/dist/tabs/index.d.ts +1 -1
- package/dist/textfield/createTextFieldState.d.ts +2 -2
- package/dist/textfield/index.d.ts +1 -1
- package/dist/toast/createToastState.d.ts +24 -2
- package/dist/toast/index.d.ts +1 -1
- package/dist/toggle/createToggleGroupState.d.ts +4 -4
- package/dist/toggle/createToggleState.d.ts +2 -2
- package/dist/toggle/index.d.ts +2 -2
- package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
- package/dist/tooltip/index.d.ts +1 -1
- package/dist/tree/TreeCollection.d.ts +2 -2
- package/dist/tree/createTreeState.d.ts +2 -2
- package/dist/tree/index.d.ts +3 -3
- package/dist/tree/types.d.ts +27 -13
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/reactivity.d.ts +1 -1
- package/package.json +29 -30
- package/src/autocomplete/createAutocompleteState.d.ts +19 -17
- package/src/autocomplete/createAutocompleteState.ts +24 -30
- package/src/autocomplete/index.d.ts +6 -2
- package/src/autocomplete/index.ts +1 -1
- package/src/calendar/IncompleteDate.ts +430 -0
- package/src/calendar/createCalendarState.d.ts +139 -117
- package/src/calendar/createCalendarState.ts +308 -94
- package/src/calendar/createDateFieldState.d.ts +130 -95
- package/src/calendar/createDateFieldState.ts +447 -334
- package/src/calendar/createDatePickerState.ts +347 -0
- package/src/calendar/createRangeCalendarState.d.ts +154 -129
- package/src/calendar/createRangeCalendarState.ts +411 -85
- package/src/calendar/createTimeFieldState.d.ts +81 -79
- package/src/calendar/createTimeFieldState.ts +187 -108
- package/src/calendar/index.d.ts +80 -7
- package/src/calendar/index.ts +23 -12
- package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
- package/src/checkbox/createCheckboxGroupState.ts +20 -29
- package/src/checkbox/index.d.ts +6 -2
- package/src/checkbox/index.ts +1 -1
- package/src/collections/ListCollection.d.ts +25 -22
- package/src/collections/ListCollection.ts +6 -6
- package/src/collections/createListState.d.ts +73 -58
- package/src/collections/createListState.ts +67 -35
- package/src/collections/createMenuState.d.ts +36 -31
- package/src/collections/createMenuState.ts +21 -12
- package/src/collections/createSelectionState.d.ts +78 -65
- package/src/collections/createSelectionState.ts +66 -52
- package/src/collections/getChildNodes.ts +98 -0
- package/src/collections/index.d.ts +38 -6
- package/src/collections/index.ts +14 -10
- package/src/collections/types.d.ts +101 -101
- package/src/collections/types.ts +12 -12
- package/src/color/Color.d.ts +20 -5
- package/src/color/Color.ts +357 -254
- package/src/color/createColorAreaState.d.ts +67 -65
- package/src/color/createColorAreaState.ts +21 -13
- package/src/color/createColorFieldState.d.ts +46 -44
- package/src/color/createColorFieldState.ts +285 -149
- package/src/color/createColorSliderState.d.ts +58 -56
- package/src/color/createColorSliderState.ts +45 -14
- package/src/color/createColorWheelState.d.ts +42 -40
- package/src/color/createColorWheelState.ts +101 -64
- package/src/color/getColorChannels.ts +7 -5
- package/src/color/index.d.ts +36 -7
- package/src/color/index.ts +6 -9
- package/src/color/types.d.ts +68 -63
- package/src/color/types.ts +11 -19
- package/src/combobox/createComboBoxState.d.ts +107 -105
- package/src/combobox/createComboBoxState.ts +184 -89
- package/src/combobox/index.d.ts +10 -2
- package/src/combobox/index.ts +1 -1
- package/src/data/createAsyncList.ts +89 -63
- package/src/data/createListData.ts +67 -67
- package/src/data/createTreeData.ts +304 -91
- package/src/data/index.ts +3 -3
- package/src/datepicker/index.ts +6 -10
- package/src/disclosure/createDisclosureState.d.ts +47 -43
- package/src/disclosure/createDisclosureState.ts +7 -21
- package/src/disclosure/index.d.ts +10 -2
- package/src/disclosure/index.ts +1 -1
- package/src/dnd/createDragState.d.ts +51 -42
- package/src/dnd/createDragState.ts +12 -14
- package/src/dnd/createDraggableCollectionState.d.ts +52 -41
- package/src/dnd/createDraggableCollectionState.ts +14 -21
- package/src/dnd/createDropState.d.ts +64 -45
- package/src/dnd/createDropState.ts +22 -32
- package/src/dnd/createDroppableCollectionState.d.ts +88 -59
- package/src/dnd/createDroppableCollectionState.ts +40 -43
- package/src/dnd/index.d.ts +55 -6
- package/src/dnd/index.ts +6 -18
- package/src/dnd/types.d.ts +170 -157
- package/src/dnd/types.ts +24 -22
- package/src/form/createFormValidationState.d.ts +47 -45
- package/src/form/createFormValidationState.ts +30 -63
- package/src/form/index.d.ts +16 -2
- package/src/form/index.ts +1 -1
- package/src/grid/createGridState.d.ts +7 -4
- package/src/grid/createGridState.ts +78 -51
- package/src/grid/index.d.ts +3 -3
- package/src/grid/index.ts +2 -8
- package/src/grid/types.d.ts +136 -129
- package/src/grid/types.ts +34 -18
- package/src/index.d.ts +311 -26
- package/src/index.ts +59 -89
- package/src/menu/index.ts +2 -4
- package/src/numberfield/createNumberFieldState.d.ts +56 -54
- package/src/numberfield/createNumberFieldState.ts +26 -31
- package/src/numberfield/index.d.ts +6 -2
- package/src/numberfield/index.ts +1 -1
- package/src/overlays/createOverlayTriggerState.d.ts +22 -20
- package/src/overlays/createOverlayTriggerState.ts +3 -4
- package/src/overlays/index.d.ts +6 -2
- package/src/overlays/index.ts +1 -1
- package/src/radio/createRadioGroupState.d.ts +54 -52
- package/src/radio/createRadioGroupState.ts +27 -29
- package/src/radio/index.d.ts +7 -2
- package/src/radio/index.ts +1 -1
- package/src/searchfield/createSearchFieldState.d.ts +16 -14
- package/src/searchfield/createSearchFieldState.ts +5 -11
- package/src/searchfield/index.d.ts +3 -3
- package/src/searchfield/index.ts +2 -5
- package/src/select/createSelectState.d.ts +63 -61
- package/src/select/createSelectState.ts +42 -29
- package/src/select/index.d.ts +2 -2
- package/src/select/index.ts +1 -5
- package/src/selection/Selection.ts +28 -0
- package/src/selection/SelectionManager.ts +526 -0
- package/src/selection/createMultipleSelectionState.ts +247 -0
- package/src/selection/index.ts +12 -7
- package/src/slider/createSliderState.d.ts +60 -60
- package/src/slider/createSliderState.ts +55 -33
- package/src/slider/index.d.ts +3 -3
- package/src/slider/index.ts +2 -6
- package/src/ssr/index.d.ts +1 -1
- package/src/ssr/index.ts +2 -2
- package/src/steplist/createStepListState.ts +191 -0
- package/src/steplist/index.ts +5 -0
- package/src/table/TableCollection.d.ts +42 -40
- package/src/table/TableCollection.ts +266 -99
- package/src/table/createTableColumnResizeState.ts +242 -0
- package/src/table/createTableState.d.ts +7 -4
- package/src/table/createTableState.ts +30 -7
- package/src/table/createTreeGridState.ts +146 -0
- package/src/table/index.d.ts +14 -4
- package/src/table/index.ts +13 -3
- package/src/table/types.d.ts +98 -92
- package/src/table/types.ts +83 -13
- package/src/tabs/createTabListState.d.ts +59 -57
- package/src/tabs/createTabListState.ts +34 -39
- package/src/tabs/index.d.ts +8 -2
- package/src/tabs/index.ts +1 -1
- package/src/textfield/createTextFieldState.d.ts +16 -14
- package/src/textfield/createTextFieldState.ts +7 -18
- package/src/textfield/index.d.ts +6 -2
- package/src/textfield/index.ts +1 -1
- package/src/toast/createToastState.d.ts +92 -86
- package/src/toast/createToastState.ts +90 -52
- package/src/toast/index.d.ts +12 -2
- package/src/toast/index.ts +2 -1
- package/src/toggle/createToggleGroupState.ts +11 -21
- package/src/toggle/createToggleState.d.ts +19 -19
- package/src/toggle/createToggleState.ts +2 -16
- package/src/toggle/index.d.ts +2 -2
- package/src/toggle/index.ts +2 -6
- package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
- package/src/tooltip/createTooltipTriggerState.ts +12 -11
- package/src/tooltip/index.d.ts +7 -2
- package/src/tooltip/index.ts +1 -1
- package/src/tree/TreeCollection.d.ts +26 -23
- package/src/tree/TreeCollection.ts +29 -22
- package/src/tree/createTreeState.d.ts +7 -4
- package/src/tree/createTreeState.ts +70 -41
- package/src/tree/index.d.ts +10 -4
- package/src/tree/index.ts +3 -3
- package/src/tree/types.d.ts +131 -126
- package/src/tree/types.ts +30 -13
- package/src/utils/index.d.ts +2 -2
- package/src/utils/index.ts +1 -1
- package/src/utils/reactivity.d.ts +2 -2
- package/src/utils/reactivity.ts +3 -3
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Based on @react-stately/searchfield useSearchFieldState.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { type Accessor, createSignal, createMemo } from
|
|
7
|
-
import { access, type MaybeAccessor } from
|
|
6
|
+
import { type Accessor, createSignal, createMemo } from "solid-js";
|
|
7
|
+
import { access, type MaybeAccessor } from "../utils";
|
|
8
8
|
|
|
9
9
|
export interface SearchFieldStateProps {
|
|
10
10
|
/** The current value (controlled). */
|
|
@@ -26,25 +26,19 @@ export interface SearchFieldState {
|
|
|
26
26
|
* Provides state management for a search field.
|
|
27
27
|
*/
|
|
28
28
|
export function createSearchFieldState(
|
|
29
|
-
props: MaybeAccessor<SearchFieldStateProps
|
|
29
|
+
props: MaybeAccessor<SearchFieldStateProps>,
|
|
30
30
|
): SearchFieldState {
|
|
31
31
|
const getProps = () => access(props);
|
|
32
32
|
|
|
33
|
-
// Controlled vs uncontrolled
|
|
34
33
|
const isControlled = () => getProps().value !== undefined;
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
const [internalValue, setInternalValue] = createSignal(
|
|
38
|
-
getProps().defaultValue ?? ''
|
|
39
|
-
);
|
|
35
|
+
const [internalValue, setInternalValue] = createSignal(getProps().defaultValue ?? "");
|
|
40
36
|
|
|
41
|
-
// Current value accessor
|
|
42
37
|
const value = createMemo(() => {
|
|
43
38
|
const p = getProps();
|
|
44
|
-
return isControlled() ? (p.value ??
|
|
39
|
+
return isControlled() ? (p.value ?? "") : internalValue();
|
|
45
40
|
});
|
|
46
41
|
|
|
47
|
-
// Set value function
|
|
48
42
|
const setValue = (newValue: string) => {
|
|
49
43
|
const p = getProps();
|
|
50
44
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { createSearchFieldState } from
|
|
2
|
-
export type { SearchFieldState, SearchFieldStateProps
|
|
3
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
export { createSearchFieldState } from "./createSearchFieldState";
|
|
2
|
+
export type { SearchFieldState, SearchFieldStateProps } from "./createSearchFieldState";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
package/src/searchfield/index.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
export { createSearchFieldState } from
|
|
2
|
-
export type {
|
|
3
|
-
SearchFieldState,
|
|
4
|
-
SearchFieldStateProps,
|
|
5
|
-
} from './createSearchFieldState';
|
|
1
|
+
export { createSearchFieldState } from "./createSearchFieldState";
|
|
2
|
+
export type { SearchFieldState, SearchFieldStateProps } from "./createSearchFieldState";
|
|
@@ -2,72 +2,74 @@
|
|
|
2
2
|
* State management for select components.
|
|
3
3
|
* Based on @react-stately/select useSelectState.
|
|
4
4
|
*/
|
|
5
|
-
import { type Accessor } from
|
|
6
|
-
import { type MaybeAccessor } from
|
|
7
|
-
import type { Key, CollectionNode, Collection } from
|
|
5
|
+
import { type Accessor } from "solid-js";
|
|
6
|
+
import { type MaybeAccessor } from "../utils";
|
|
7
|
+
import type { Key, CollectionNode, Collection } from "../collections/types";
|
|
8
8
|
export interface SelectStateProps<T = unknown> {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
9
|
+
/** The items to display in the select. */
|
|
10
|
+
items: T[];
|
|
11
|
+
/** Function to get the key for an item. */
|
|
12
|
+
getKey?: (item: T) => Key;
|
|
13
|
+
/** Function to get the text value for an item. */
|
|
14
|
+
getTextValue?: (item: T) => string;
|
|
15
|
+
/** Function to check if an item is disabled. */
|
|
16
|
+
getDisabled?: (item: T) => boolean;
|
|
17
|
+
/** Keys of disabled items. */
|
|
18
|
+
disabledKeys?: Iterable<Key>;
|
|
19
|
+
/** The currently selected key (controlled). */
|
|
20
|
+
selectedKey?: Key | null;
|
|
21
|
+
/** The default selected key (uncontrolled). */
|
|
22
|
+
defaultSelectedKey?: Key | null;
|
|
23
|
+
/** Handler called when the selection changes. */
|
|
24
|
+
onSelectionChange?: (key: Key | null) => void;
|
|
25
|
+
/** Whether the select is open (controlled). */
|
|
26
|
+
isOpen?: boolean;
|
|
27
|
+
/** Whether the select is open by default (uncontrolled). */
|
|
28
|
+
defaultOpen?: boolean;
|
|
29
|
+
/** Handler called when the open state changes. */
|
|
30
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
31
|
+
/** Whether the select is disabled. */
|
|
32
|
+
isDisabled?: boolean;
|
|
33
|
+
/** Whether the select is required. */
|
|
34
|
+
isRequired?: boolean;
|
|
35
35
|
}
|
|
36
36
|
export interface SelectState<T = unknown> {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
37
|
+
/** The collection of items. */
|
|
38
|
+
readonly collection: Accessor<Collection<T>>;
|
|
39
|
+
/** Whether the select dropdown is open. */
|
|
40
|
+
readonly isOpen: Accessor<boolean>;
|
|
41
|
+
/** Open the select dropdown. */
|
|
42
|
+
open(): void;
|
|
43
|
+
/** Close the select dropdown. */
|
|
44
|
+
close(): void;
|
|
45
|
+
/** Toggle the select dropdown. */
|
|
46
|
+
toggle(): void;
|
|
47
|
+
/** The currently selected key. */
|
|
48
|
+
readonly selectedKey: Accessor<Key | null>;
|
|
49
|
+
/** The currently selected item. */
|
|
50
|
+
readonly selectedItem: Accessor<CollectionNode<T> | null>;
|
|
51
|
+
/** Set the selected key. */
|
|
52
|
+
setSelectedKey(key: Key | null): void;
|
|
53
|
+
/** The currently focused key. */
|
|
54
|
+
readonly focusedKey: Accessor<Key | null>;
|
|
55
|
+
/** Set the focused key. */
|
|
56
|
+
setFocusedKey(key: Key | null): void;
|
|
57
|
+
/** Whether the select has focus. */
|
|
58
|
+
readonly isFocused: Accessor<boolean>;
|
|
59
|
+
/** Set whether the select has focus. */
|
|
60
|
+
setFocused(isFocused: boolean): void;
|
|
61
|
+
/** Whether a specific key is disabled. */
|
|
62
|
+
isKeyDisabled(key: Key): boolean;
|
|
63
|
+
/** Whether the select is disabled. */
|
|
64
|
+
readonly isDisabled: boolean;
|
|
65
|
+
/** Whether the select is required. */
|
|
66
|
+
readonly isRequired: boolean;
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* Creates state for a select component.
|
|
70
70
|
* Combines list state with overlay trigger state for dropdown behavior.
|
|
71
71
|
*/
|
|
72
|
-
export declare function createSelectState<T = unknown>(
|
|
73
|
-
|
|
72
|
+
export declare function createSelectState<T = unknown>(
|
|
73
|
+
props: MaybeAccessor<SelectStateProps<T>>,
|
|
74
|
+
): SelectState<T>;
|
|
75
|
+
//# sourceMappingURL=createSelectState.d.ts.map
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
* Based on @react-stately/select useSelectState.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { createSignal, createMemo, type Accessor } from
|
|
7
|
-
import { access, type MaybeAccessor } from
|
|
8
|
-
import { createListState } from
|
|
9
|
-
import { createOverlayTriggerState } from
|
|
10
|
-
import type { Key, CollectionNode, Collection } from
|
|
11
|
-
import type { SelectionMode, Selection } from
|
|
6
|
+
import { createSignal, createMemo, type Accessor } from "solid-js";
|
|
7
|
+
import { access, type MaybeAccessor } from "../utils";
|
|
8
|
+
import { createListState } from "../collections/createListState";
|
|
9
|
+
import { createOverlayTriggerState } from "../overlays";
|
|
10
|
+
import type { Key, CollectionNode, Collection } from "../collections/types";
|
|
11
|
+
import type { SelectionMode, Selection } from "../collections/types";
|
|
12
|
+
import type { SelectionManager } from "../selection/SelectionManager";
|
|
12
13
|
|
|
13
14
|
export interface SelectStateProps<T = unknown> {
|
|
14
15
|
/** The items to display in the select. */
|
|
@@ -26,15 +27,15 @@ export interface SelectStateProps<T = unknown> {
|
|
|
26
27
|
/** The default selected key (uncontrolled). */
|
|
27
28
|
defaultSelectedKey?: Key | null;
|
|
28
29
|
/** The selected keys (controlled, for multiple selection mode). */
|
|
29
|
-
selectedKeys?:
|
|
30
|
+
selectedKeys?: "all" | Iterable<Key>;
|
|
30
31
|
/** Default selected keys (uncontrolled, for multiple selection mode). */
|
|
31
|
-
defaultSelectedKeys?:
|
|
32
|
+
defaultSelectedKeys?: "all" | Iterable<Key>;
|
|
32
33
|
/** Handler called when the selection changes. */
|
|
33
34
|
onSelectionChange?: (key: Key | null) => void;
|
|
34
35
|
/** Handler called when selected keys change. */
|
|
35
36
|
onSelectionChangeKeys?: (keys: Selection) => void;
|
|
36
37
|
/** Selection mode for the select. */
|
|
37
|
-
selectionMode?: Extract<SelectionMode,
|
|
38
|
+
selectionMode?: Extract<SelectionMode, "single" | "multiple">;
|
|
38
39
|
/** Whether the select is open (controlled). */
|
|
39
40
|
isOpen?: boolean;
|
|
40
41
|
/** Whether the select is open by default (uncontrolled). */
|
|
@@ -50,6 +51,11 @@ export interface SelectStateProps<T = unknown> {
|
|
|
50
51
|
export interface SelectState<T = unknown> {
|
|
51
52
|
/** The collection of items. */
|
|
52
53
|
readonly collection: Accessor<Collection<T>>;
|
|
54
|
+
/**
|
|
55
|
+
* The collection-aware selection manager. Mirrors upstream `useSelectState`,
|
|
56
|
+
* which spreads the underlying `useListState` (including its selection manager).
|
|
57
|
+
*/
|
|
58
|
+
readonly selectionManager: SelectionManager<T>;
|
|
53
59
|
/** Whether the select dropdown is open. */
|
|
54
60
|
readonly isOpen: Accessor<boolean>;
|
|
55
61
|
/** Open the select dropdown. */
|
|
@@ -85,7 +91,7 @@ export interface SelectState<T = unknown> {
|
|
|
85
91
|
/** Whether the select is required. */
|
|
86
92
|
readonly isRequired: boolean;
|
|
87
93
|
/** The selection mode. */
|
|
88
|
-
readonly selectionMode: Accessor<
|
|
94
|
+
readonly selectionMode: Accessor<"single" | "multiple">;
|
|
89
95
|
}
|
|
90
96
|
|
|
91
97
|
/**
|
|
@@ -93,10 +99,10 @@ export interface SelectState<T = unknown> {
|
|
|
93
99
|
* Combines list state with overlay trigger state for dropdown behavior.
|
|
94
100
|
*/
|
|
95
101
|
export function createSelectState<T = unknown>(
|
|
96
|
-
props: MaybeAccessor<SelectStateProps<T
|
|
102
|
+
props: MaybeAccessor<SelectStateProps<T>>,
|
|
97
103
|
): SelectState<T> {
|
|
98
104
|
const getProps = () => access(props);
|
|
99
|
-
const selectionMode: Accessor<
|
|
105
|
+
const selectionMode: Accessor<"single" | "multiple"> = () => getProps().selectionMode ?? "single";
|
|
100
106
|
|
|
101
107
|
// Overlay trigger state for open/close
|
|
102
108
|
const overlayState = createOverlayTriggerState({
|
|
@@ -115,18 +121,18 @@ export function createSelectState<T = unknown>(
|
|
|
115
121
|
const isControlledSingle = () => getProps().selectedKey !== undefined;
|
|
116
122
|
const isControlledMultiple = () => getProps().selectedKeys !== undefined;
|
|
117
123
|
const [internalSelectedKey, setInternalSelectedKey] = createSignal<Key | null>(
|
|
118
|
-
getProps().defaultSelectedKey ?? null
|
|
124
|
+
getProps().defaultSelectedKey ?? null,
|
|
119
125
|
);
|
|
120
126
|
const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<Selection>(
|
|
121
|
-
getProps().defaultSelectedKeys ===
|
|
122
|
-
?
|
|
123
|
-
: new Set(getProps().defaultSelectedKeys ?? [])
|
|
127
|
+
getProps().defaultSelectedKeys === "all"
|
|
128
|
+
? "all"
|
|
129
|
+
: new Set(getProps().defaultSelectedKeys ?? []),
|
|
124
130
|
);
|
|
125
131
|
|
|
126
132
|
const selectedKey: Accessor<Key | null> = () => {
|
|
127
|
-
if (selectionMode() ===
|
|
133
|
+
if (selectionMode() === "multiple") {
|
|
128
134
|
const keys = selectedKeys();
|
|
129
|
-
if (keys ===
|
|
135
|
+
if (keys === "all") return null;
|
|
130
136
|
return keys.size > 0 ? Array.from(keys)[0] : null;
|
|
131
137
|
}
|
|
132
138
|
|
|
@@ -134,7 +140,7 @@ export function createSelectState<T = unknown>(
|
|
|
134
140
|
};
|
|
135
141
|
|
|
136
142
|
const setSelectedKey = (key: Key | null) => {
|
|
137
|
-
if (selectionMode() ===
|
|
143
|
+
if (selectionMode() === "multiple") {
|
|
138
144
|
if (key == null) {
|
|
139
145
|
if (!isControlledMultiple()) {
|
|
140
146
|
setInternalSelectedKeys(new Set<Key>());
|
|
@@ -160,10 +166,10 @@ export function createSelectState<T = unknown>(
|
|
|
160
166
|
};
|
|
161
167
|
|
|
162
168
|
const selectedKeys: Accessor<Selection> = createMemo(() => {
|
|
163
|
-
if (selectionMode() ===
|
|
169
|
+
if (selectionMode() === "multiple") {
|
|
164
170
|
if (isControlledMultiple()) {
|
|
165
171
|
const keys = getProps().selectedKeys;
|
|
166
|
-
return keys ===
|
|
172
|
+
return keys === "all" ? "all" : new Set<Key>(keys ?? []);
|
|
167
173
|
}
|
|
168
174
|
return internalSelectedKeys();
|
|
169
175
|
}
|
|
@@ -174,7 +180,7 @@ export function createSelectState<T = unknown>(
|
|
|
174
180
|
|
|
175
181
|
const setSelectedKeys = (keys: Iterable<Key>) => {
|
|
176
182
|
const next = new Set(keys);
|
|
177
|
-
if (selectionMode() ===
|
|
183
|
+
if (selectionMode() === "multiple") {
|
|
178
184
|
if (!isControlledMultiple()) {
|
|
179
185
|
setInternalSelectedKeys(next);
|
|
180
186
|
}
|
|
@@ -210,23 +216,23 @@ export function createSelectState<T = unknown>(
|
|
|
210
216
|
disallowEmptySelection: true,
|
|
211
217
|
get selectedKeys() {
|
|
212
218
|
const keys = selectedKeys();
|
|
213
|
-
if (keys ===
|
|
219
|
+
if (keys === "all") return "all";
|
|
214
220
|
return keys;
|
|
215
221
|
},
|
|
216
222
|
onSelectionChange(keys) {
|
|
217
|
-
if (selectionMode() ===
|
|
223
|
+
if (selectionMode() === "multiple") {
|
|
218
224
|
if (!isControlledMultiple()) {
|
|
219
225
|
setInternalSelectedKeys(keys);
|
|
220
226
|
}
|
|
221
227
|
getProps().onSelectionChangeKeys?.(keys);
|
|
222
|
-
if (keys !==
|
|
228
|
+
if (keys !== "all") {
|
|
223
229
|
getProps().onSelectionChange?.(keys.size > 0 ? Array.from(keys)[0] : null);
|
|
224
230
|
}
|
|
225
231
|
return;
|
|
226
232
|
}
|
|
227
233
|
|
|
228
234
|
// Get the first (and only) selected key
|
|
229
|
-
if (keys ===
|
|
235
|
+
if (keys === "all") return;
|
|
230
236
|
const key = keys.size > 0 ? Array.from(keys)[0] : null;
|
|
231
237
|
setSelectedKey(key);
|
|
232
238
|
// Close the dropdown after selection in single mode
|
|
@@ -234,6 +240,12 @@ export function createSelectState<T = unknown>(
|
|
|
234
240
|
},
|
|
235
241
|
});
|
|
236
242
|
|
|
243
|
+
// The select's own focus state (the trigger), separate from the collection's
|
|
244
|
+
// focus-within state on the selection manager — upstream useSelectState keeps
|
|
245
|
+
// these apart with a dedicated useState. Sharing the manager's signal makes
|
|
246
|
+
// trigger focus re-arm the item roving-focus effect and steal focus back.
|
|
247
|
+
const [isFocused, setFocused] = createSignal(false);
|
|
248
|
+
|
|
237
249
|
// Get the selected item from the collection (memoized)
|
|
238
250
|
const selectedItem: Accessor<CollectionNode<T> | null> = createMemo(() => {
|
|
239
251
|
const key = selectedKey();
|
|
@@ -243,7 +255,7 @@ export function createSelectState<T = unknown>(
|
|
|
243
255
|
|
|
244
256
|
const selectedItems: Accessor<CollectionNode<T>[]> = createMemo(() => {
|
|
245
257
|
const keys = selectedKeys();
|
|
246
|
-
if (keys ===
|
|
258
|
+
if (keys === "all") {
|
|
247
259
|
return Array.from(listState.collection());
|
|
248
260
|
}
|
|
249
261
|
|
|
@@ -258,12 +270,13 @@ export function createSelectState<T = unknown>(
|
|
|
258
270
|
return {
|
|
259
271
|
// Collection
|
|
260
272
|
collection: listState.collection,
|
|
273
|
+
selectionManager: listState.selectionManager,
|
|
261
274
|
|
|
262
275
|
// Focus management
|
|
263
276
|
focusedKey: listState.focusedKey,
|
|
264
277
|
setFocusedKey: listState.setFocusedKey,
|
|
265
|
-
isFocused
|
|
266
|
-
setFocused
|
|
278
|
+
isFocused,
|
|
279
|
+
setFocused,
|
|
267
280
|
|
|
268
281
|
// Overlay state
|
|
269
282
|
isOpen: overlayState.isOpen,
|
package/src/select/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createSelectState, type SelectStateProps, type SelectState
|
|
2
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
export { createSelectState, type SelectStateProps, type SelectState } from "./createSelectState";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
package/src/select/index.ts
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Selection is a special Set containing Keys, which also has an anchor
|
|
3
|
+
* and current selected key for use when range selecting.
|
|
4
|
+
*
|
|
5
|
+
* Based on @react-stately/selection.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Key } from "../collections/types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A Selection is a special Set containing Keys, which also has an anchor
|
|
12
|
+
* and current selected key for use when range selecting.
|
|
13
|
+
*/
|
|
14
|
+
export class Selection extends Set<Key> {
|
|
15
|
+
anchorKey: Key | null;
|
|
16
|
+
currentKey: Key | null;
|
|
17
|
+
|
|
18
|
+
constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key | null, currentKey?: Key | null) {
|
|
19
|
+
super(keys);
|
|
20
|
+
if (keys instanceof Selection) {
|
|
21
|
+
this.anchorKey = anchorKey ?? keys.anchorKey;
|
|
22
|
+
this.currentKey = currentKey ?? keys.currentKey;
|
|
23
|
+
} else {
|
|
24
|
+
this.anchorKey = anchorKey ?? null;
|
|
25
|
+
this.currentKey = currentKey ?? null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|