@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.
Files changed (254) hide show
  1. package/README.md +30 -283
  2. package/dist/autocomplete/createAutocompleteState.d.ts +2 -2
  3. package/dist/autocomplete/index.d.ts +1 -1
  4. package/dist/calendar/IncompleteDate.d.ts +61 -0
  5. package/dist/calendar/createCalendarState.d.ts +41 -16
  6. package/dist/calendar/createDateFieldState.d.ts +39 -9
  7. package/dist/calendar/createDatePickerState.d.ts +60 -0
  8. package/dist/calendar/createRangeCalendarState.d.ts +37 -10
  9. package/dist/calendar/createTimeFieldState.d.ts +34 -7
  10. package/dist/calendar/index.d.ts +7 -6
  11. package/dist/checkbox/createCheckboxGroupState.d.ts +6 -6
  12. package/dist/checkbox/index.d.ts +1 -1
  13. package/dist/collections/ListCollection.d.ts +1 -1
  14. package/dist/collections/createListState.d.ts +11 -8
  15. package/dist/collections/createMenuState.d.ts +7 -7
  16. package/dist/collections/createSelectionState.d.ts +22 -10
  17. package/dist/collections/getChildNodes.d.ts +11 -0
  18. package/dist/collections/index.d.ts +6 -5
  19. package/dist/collections/types.d.ts +12 -12
  20. package/dist/color/Color.d.ts +1 -1
  21. package/dist/color/createColorAreaState.d.ts +4 -2
  22. package/dist/color/createColorFieldState.d.ts +38 -12
  23. package/dist/color/createColorSliderState.d.ts +9 -2
  24. package/dist/color/createColorWheelState.d.ts +13 -2
  25. package/dist/color/getColorChannels.d.ts +1 -1
  26. package/dist/color/index.d.ts +6 -6
  27. package/dist/color/types.d.ts +4 -4
  28. package/dist/combobox/createComboBoxState.d.ts +34 -13
  29. package/dist/combobox/index.d.ts +1 -1
  30. package/dist/data/createAsyncList.d.ts +4 -4
  31. package/dist/data/createListData.d.ts +2 -2
  32. package/dist/data/createTreeData.d.ts +6 -2
  33. package/dist/data/index.d.ts +3 -3
  34. package/dist/datepicker/index.d.ts +2 -4
  35. package/dist/disclosure/createDisclosureState.d.ts +2 -2
  36. package/dist/disclosure/index.d.ts +1 -1
  37. package/dist/dnd/createDragState.d.ts +2 -2
  38. package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
  39. package/dist/dnd/createDropState.d.ts +2 -2
  40. package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
  41. package/dist/dnd/index.d.ts +5 -5
  42. package/dist/dnd/types.d.ts +19 -17
  43. package/dist/form/createFormValidationState.d.ts +3 -3
  44. package/dist/form/index.d.ts +1 -1
  45. package/dist/grid/createGridState.d.ts +2 -2
  46. package/dist/grid/index.d.ts +2 -2
  47. package/dist/grid/types.d.ts +27 -11
  48. package/dist/index.d.ts +31 -30
  49. package/dist/index.js +9077 -7246
  50. package/dist/index.js.map +1 -1
  51. package/dist/menu/index.d.ts +2 -2
  52. package/dist/numberfield/createNumberFieldState.d.ts +2 -2
  53. package/dist/numberfield/index.d.ts +1 -1
  54. package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
  55. package/dist/overlays/index.d.ts +1 -1
  56. package/dist/radio/createRadioGroupState.d.ts +7 -7
  57. package/dist/radio/index.d.ts +1 -1
  58. package/dist/searchfield/createSearchFieldState.d.ts +2 -2
  59. package/dist/searchfield/index.d.ts +2 -2
  60. package/dist/select/createSelectState.d.ts +14 -8
  61. package/dist/select/index.d.ts +1 -1
  62. package/dist/selection/Selection.d.ts +16 -0
  63. package/dist/selection/SelectionManager.d.ts +110 -0
  64. package/dist/selection/createMultipleSelectionState.d.ts +59 -0
  65. package/dist/selection/index.d.ts +6 -5
  66. package/dist/slider/createSliderState.d.ts +3 -3
  67. package/dist/slider/index.d.ts +2 -2
  68. package/dist/steplist/createStepListState.d.ts +48 -0
  69. package/dist/steplist/index.d.ts +1 -0
  70. package/dist/table/TableCollection.d.ts +33 -3
  71. package/dist/table/createTableColumnResizeState.d.ts +54 -0
  72. package/dist/table/createTableState.d.ts +2 -2
  73. package/dist/table/createTreeGridState.d.ts +15 -0
  74. package/dist/table/index.d.ts +6 -3
  75. package/dist/table/types.d.ts +68 -10
  76. package/dist/tabs/createTabListState.d.ts +5 -5
  77. package/dist/tabs/index.d.ts +1 -1
  78. package/dist/textfield/createTextFieldState.d.ts +2 -2
  79. package/dist/textfield/index.d.ts +1 -1
  80. package/dist/toast/createToastState.d.ts +24 -2
  81. package/dist/toast/index.d.ts +1 -1
  82. package/dist/toggle/createToggleGroupState.d.ts +4 -4
  83. package/dist/toggle/createToggleState.d.ts +2 -2
  84. package/dist/toggle/index.d.ts +2 -2
  85. package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
  86. package/dist/tooltip/index.d.ts +1 -1
  87. package/dist/tree/TreeCollection.d.ts +2 -2
  88. package/dist/tree/createTreeState.d.ts +2 -2
  89. package/dist/tree/index.d.ts +3 -3
  90. package/dist/tree/types.d.ts +27 -13
  91. package/dist/utils/index.d.ts +1 -1
  92. package/dist/utils/reactivity.d.ts +1 -1
  93. package/package.json +29 -30
  94. package/src/autocomplete/createAutocompleteState.d.ts +19 -17
  95. package/src/autocomplete/createAutocompleteState.ts +24 -30
  96. package/src/autocomplete/index.d.ts +6 -2
  97. package/src/autocomplete/index.ts +1 -1
  98. package/src/calendar/IncompleteDate.ts +430 -0
  99. package/src/calendar/createCalendarState.d.ts +139 -117
  100. package/src/calendar/createCalendarState.ts +308 -94
  101. package/src/calendar/createDateFieldState.d.ts +130 -95
  102. package/src/calendar/createDateFieldState.ts +447 -334
  103. package/src/calendar/createDatePickerState.ts +347 -0
  104. package/src/calendar/createRangeCalendarState.d.ts +154 -129
  105. package/src/calendar/createRangeCalendarState.ts +411 -85
  106. package/src/calendar/createTimeFieldState.d.ts +81 -79
  107. package/src/calendar/createTimeFieldState.ts +187 -108
  108. package/src/calendar/index.d.ts +80 -7
  109. package/src/calendar/index.ts +23 -12
  110. package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
  111. package/src/checkbox/createCheckboxGroupState.ts +20 -29
  112. package/src/checkbox/index.d.ts +6 -2
  113. package/src/checkbox/index.ts +1 -1
  114. package/src/collections/ListCollection.d.ts +25 -22
  115. package/src/collections/ListCollection.ts +6 -6
  116. package/src/collections/createListState.d.ts +73 -58
  117. package/src/collections/createListState.ts +67 -35
  118. package/src/collections/createMenuState.d.ts +36 -31
  119. package/src/collections/createMenuState.ts +21 -12
  120. package/src/collections/createSelectionState.d.ts +78 -65
  121. package/src/collections/createSelectionState.ts +66 -52
  122. package/src/collections/getChildNodes.ts +98 -0
  123. package/src/collections/index.d.ts +38 -6
  124. package/src/collections/index.ts +14 -10
  125. package/src/collections/types.d.ts +101 -101
  126. package/src/collections/types.ts +12 -12
  127. package/src/color/Color.d.ts +20 -5
  128. package/src/color/Color.ts +357 -254
  129. package/src/color/createColorAreaState.d.ts +67 -65
  130. package/src/color/createColorAreaState.ts +21 -13
  131. package/src/color/createColorFieldState.d.ts +46 -44
  132. package/src/color/createColorFieldState.ts +285 -149
  133. package/src/color/createColorSliderState.d.ts +58 -56
  134. package/src/color/createColorSliderState.ts +45 -14
  135. package/src/color/createColorWheelState.d.ts +42 -40
  136. package/src/color/createColorWheelState.ts +101 -64
  137. package/src/color/getColorChannels.ts +7 -5
  138. package/src/color/index.d.ts +36 -7
  139. package/src/color/index.ts +6 -9
  140. package/src/color/types.d.ts +68 -63
  141. package/src/color/types.ts +11 -19
  142. package/src/combobox/createComboBoxState.d.ts +107 -105
  143. package/src/combobox/createComboBoxState.ts +184 -89
  144. package/src/combobox/index.d.ts +10 -2
  145. package/src/combobox/index.ts +1 -1
  146. package/src/data/createAsyncList.ts +89 -63
  147. package/src/data/createListData.ts +67 -67
  148. package/src/data/createTreeData.ts +304 -91
  149. package/src/data/index.ts +3 -3
  150. package/src/datepicker/index.ts +6 -10
  151. package/src/disclosure/createDisclosureState.d.ts +47 -43
  152. package/src/disclosure/createDisclosureState.ts +7 -21
  153. package/src/disclosure/index.d.ts +10 -2
  154. package/src/disclosure/index.ts +1 -1
  155. package/src/dnd/createDragState.d.ts +51 -42
  156. package/src/dnd/createDragState.ts +12 -14
  157. package/src/dnd/createDraggableCollectionState.d.ts +52 -41
  158. package/src/dnd/createDraggableCollectionState.ts +14 -21
  159. package/src/dnd/createDropState.d.ts +64 -45
  160. package/src/dnd/createDropState.ts +22 -32
  161. package/src/dnd/createDroppableCollectionState.d.ts +88 -59
  162. package/src/dnd/createDroppableCollectionState.ts +40 -43
  163. package/src/dnd/index.d.ts +55 -6
  164. package/src/dnd/index.ts +6 -18
  165. package/src/dnd/types.d.ts +170 -157
  166. package/src/dnd/types.ts +24 -22
  167. package/src/form/createFormValidationState.d.ts +47 -45
  168. package/src/form/createFormValidationState.ts +30 -63
  169. package/src/form/index.d.ts +16 -2
  170. package/src/form/index.ts +1 -1
  171. package/src/grid/createGridState.d.ts +7 -4
  172. package/src/grid/createGridState.ts +78 -51
  173. package/src/grid/index.d.ts +3 -3
  174. package/src/grid/index.ts +2 -8
  175. package/src/grid/types.d.ts +136 -129
  176. package/src/grid/types.ts +34 -18
  177. package/src/index.d.ts +311 -26
  178. package/src/index.ts +59 -89
  179. package/src/menu/index.ts +2 -4
  180. package/src/numberfield/createNumberFieldState.d.ts +56 -54
  181. package/src/numberfield/createNumberFieldState.ts +26 -31
  182. package/src/numberfield/index.d.ts +6 -2
  183. package/src/numberfield/index.ts +1 -1
  184. package/src/overlays/createOverlayTriggerState.d.ts +22 -20
  185. package/src/overlays/createOverlayTriggerState.ts +3 -4
  186. package/src/overlays/index.d.ts +6 -2
  187. package/src/overlays/index.ts +1 -1
  188. package/src/radio/createRadioGroupState.d.ts +54 -52
  189. package/src/radio/createRadioGroupState.ts +27 -29
  190. package/src/radio/index.d.ts +7 -2
  191. package/src/radio/index.ts +1 -1
  192. package/src/searchfield/createSearchFieldState.d.ts +16 -14
  193. package/src/searchfield/createSearchFieldState.ts +5 -11
  194. package/src/searchfield/index.d.ts +3 -3
  195. package/src/searchfield/index.ts +2 -5
  196. package/src/select/createSelectState.d.ts +63 -61
  197. package/src/select/createSelectState.ts +42 -29
  198. package/src/select/index.d.ts +2 -2
  199. package/src/select/index.ts +1 -5
  200. package/src/selection/Selection.ts +28 -0
  201. package/src/selection/SelectionManager.ts +526 -0
  202. package/src/selection/createMultipleSelectionState.ts +247 -0
  203. package/src/selection/index.ts +12 -7
  204. package/src/slider/createSliderState.d.ts +60 -60
  205. package/src/slider/createSliderState.ts +55 -33
  206. package/src/slider/index.d.ts +3 -3
  207. package/src/slider/index.ts +2 -6
  208. package/src/ssr/index.d.ts +1 -1
  209. package/src/ssr/index.ts +2 -2
  210. package/src/steplist/createStepListState.ts +191 -0
  211. package/src/steplist/index.ts +5 -0
  212. package/src/table/TableCollection.d.ts +42 -40
  213. package/src/table/TableCollection.ts +266 -99
  214. package/src/table/createTableColumnResizeState.ts +242 -0
  215. package/src/table/createTableState.d.ts +7 -4
  216. package/src/table/createTableState.ts +30 -7
  217. package/src/table/createTreeGridState.ts +146 -0
  218. package/src/table/index.d.ts +14 -4
  219. package/src/table/index.ts +13 -3
  220. package/src/table/types.d.ts +98 -92
  221. package/src/table/types.ts +83 -13
  222. package/src/tabs/createTabListState.d.ts +59 -57
  223. package/src/tabs/createTabListState.ts +34 -39
  224. package/src/tabs/index.d.ts +8 -2
  225. package/src/tabs/index.ts +1 -1
  226. package/src/textfield/createTextFieldState.d.ts +16 -14
  227. package/src/textfield/createTextFieldState.ts +7 -18
  228. package/src/textfield/index.d.ts +6 -2
  229. package/src/textfield/index.ts +1 -1
  230. package/src/toast/createToastState.d.ts +92 -86
  231. package/src/toast/createToastState.ts +90 -52
  232. package/src/toast/index.d.ts +12 -2
  233. package/src/toast/index.ts +2 -1
  234. package/src/toggle/createToggleGroupState.ts +11 -21
  235. package/src/toggle/createToggleState.d.ts +19 -19
  236. package/src/toggle/createToggleState.ts +2 -16
  237. package/src/toggle/index.d.ts +2 -2
  238. package/src/toggle/index.ts +2 -6
  239. package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
  240. package/src/tooltip/createTooltipTriggerState.ts +12 -11
  241. package/src/tooltip/index.d.ts +7 -2
  242. package/src/tooltip/index.ts +1 -1
  243. package/src/tree/TreeCollection.d.ts +26 -23
  244. package/src/tree/TreeCollection.ts +29 -22
  245. package/src/tree/createTreeState.d.ts +7 -4
  246. package/src/tree/createTreeState.ts +70 -41
  247. package/src/tree/index.d.ts +10 -4
  248. package/src/tree/index.ts +3 -3
  249. package/src/tree/types.d.ts +131 -126
  250. package/src/tree/types.ts +30 -13
  251. package/src/utils/index.d.ts +2 -2
  252. package/src/utils/index.ts +1 -1
  253. package/src/utils/reactivity.d.ts +2 -2
  254. 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 'solid-js';
7
- import { access, type MaybeAccessor } from '../utils';
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
- // Internal signal for uncontrolled mode
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 ?? '') : internalValue();
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 './createSearchFieldState';
2
- export type { SearchFieldState, SearchFieldStateProps, } from './createSearchFieldState';
3
- //# sourceMappingURL=index.d.ts.map
1
+ export { createSearchFieldState } from "./createSearchFieldState";
2
+ export type { SearchFieldState, SearchFieldStateProps } from "./createSearchFieldState";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,2 @@
1
- export { createSearchFieldState } from './createSearchFieldState';
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 'solid-js';
6
- import { type MaybeAccessor } from '../utils';
7
- import type { Key, CollectionNode, Collection } from '../collections/types';
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
- /** 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;
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
- /** 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;
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>(props: MaybeAccessor<SelectStateProps<T>>): SelectState<T>;
73
- //# sourceMappingURL=createSelectState.d.ts.map
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 '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';
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?: 'all' | Iterable<Key>;
30
+ selectedKeys?: "all" | Iterable<Key>;
30
31
  /** Default selected keys (uncontrolled, for multiple selection mode). */
31
- defaultSelectedKeys?: 'all' | Iterable<Key>;
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, 'single' | 'multiple'>;
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<'single' | 'multiple'>;
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<'single' | 'multiple'> = () => getProps().selectionMode ?? 'single';
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 === 'all'
122
- ? 'all'
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() === 'multiple') {
133
+ if (selectionMode() === "multiple") {
128
134
  const keys = selectedKeys();
129
- if (keys === 'all') return null;
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() === 'multiple') {
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() === 'multiple') {
169
+ if (selectionMode() === "multiple") {
164
170
  if (isControlledMultiple()) {
165
171
  const keys = getProps().selectedKeys;
166
- return keys === 'all' ? 'all' : new Set<Key>(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() === 'multiple') {
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 === 'all') return 'all';
219
+ if (keys === "all") return "all";
214
220
  return keys;
215
221
  },
216
222
  onSelectionChange(keys) {
217
- if (selectionMode() === 'multiple') {
223
+ if (selectionMode() === "multiple") {
218
224
  if (!isControlledMultiple()) {
219
225
  setInternalSelectedKeys(keys);
220
226
  }
221
227
  getProps().onSelectionChangeKeys?.(keys);
222
- if (keys !== 'all') {
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 === 'all') return;
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 === 'all') {
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: listState.isFocused,
266
- setFocused: listState.setFocused,
278
+ isFocused,
279
+ setFocused,
267
280
 
268
281
  // Overlay state
269
282
  isOpen: overlayState.isOpen,
@@ -1,2 +1,2 @@
1
- export { createSelectState, type SelectStateProps, type SelectState, } from './createSelectState';
2
- //# sourceMappingURL=index.d.ts.map
1
+ export { createSelectState, type SelectStateProps, type SelectState } from "./createSelectState";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1 @@
1
- export {
2
- createSelectState,
3
- type SelectStateProps,
4
- type SelectState,
5
- } from './createSelectState';
1
+ export { createSelectState, type SelectStateProps, type SelectState } from "./createSelectState";
@@ -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
+ }