@proyecto-viviana/solid-stately 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -283
  3. package/dist/autocomplete/createAutocompleteState.d.ts +3 -2
  4. package/dist/autocomplete/index.d.ts +1 -1
  5. package/dist/calendar/createCalendarState.d.ts +22 -7
  6. package/dist/calendar/createDateFieldState.d.ts +30 -7
  7. package/dist/calendar/createDatePickerState.d.ts +60 -0
  8. package/dist/calendar/createRangeCalendarState.d.ts +27 -8
  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 +12 -3
  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 +8 -8
  15. package/dist/collections/createMenuState.d.ts +7 -7
  16. package/dist/collections/createSelectionState.d.ts +5 -5
  17. package/dist/collections/index.d.ts +5 -5
  18. package/dist/collections/types.d.ts +23 -12
  19. package/dist/color/Color.d.ts +1 -1
  20. package/dist/color/createColorAreaState.d.ts +4 -2
  21. package/dist/color/createColorFieldState.d.ts +38 -12
  22. package/dist/color/createColorSliderState.d.ts +9 -2
  23. package/dist/color/createColorWheelState.d.ts +13 -2
  24. package/dist/color/getColorChannels.d.ts +20 -0
  25. package/dist/color/index.d.ts +6 -6
  26. package/dist/color/types.d.ts +4 -4
  27. package/dist/combobox/createComboBoxState.d.ts +27 -13
  28. package/dist/combobox/index.d.ts +1 -1
  29. package/dist/data/createAsyncList.d.ts +111 -0
  30. package/dist/data/createListData.d.ts +65 -0
  31. package/dist/data/createTreeData.d.ts +65 -0
  32. package/dist/data/index.d.ts +3 -0
  33. package/dist/datepicker/index.d.ts +8 -0
  34. package/dist/disclosure/createDisclosureState.d.ts +2 -2
  35. package/dist/disclosure/index.d.ts +1 -1
  36. package/dist/dnd/createDragState.d.ts +2 -2
  37. package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
  38. package/dist/dnd/createDropState.d.ts +2 -2
  39. package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
  40. package/dist/dnd/index.d.ts +5 -5
  41. package/dist/dnd/types.d.ts +16 -16
  42. package/dist/form/createFormValidationState.d.ts +3 -3
  43. package/dist/form/index.d.ts +1 -1
  44. package/dist/grid/createGridState.d.ts +2 -2
  45. package/dist/grid/index.d.ts +2 -2
  46. package/dist/grid/types.d.ts +17 -11
  47. package/dist/index.d.ts +31 -25
  48. package/dist/index.js +7990 -6264
  49. package/dist/index.js.map +1 -7
  50. package/dist/menu/index.d.ts +8 -0
  51. package/dist/numberfield/createNumberFieldState.d.ts +2 -2
  52. package/dist/numberfield/index.d.ts +1 -1
  53. package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
  54. package/dist/overlays/index.d.ts +1 -1
  55. package/dist/radio/createRadioGroupState.d.ts +13 -4
  56. package/dist/radio/index.d.ts +1 -1
  57. package/dist/searchfield/createSearchFieldState.d.ts +2 -2
  58. package/dist/searchfield/index.d.ts +2 -2
  59. package/dist/select/createSelectState.d.ts +20 -3
  60. package/dist/select/index.d.ts +1 -1
  61. package/dist/selection/index.d.ts +11 -0
  62. package/dist/slider/createSliderState.d.ts +3 -3
  63. package/dist/slider/index.d.ts +2 -2
  64. package/dist/steplist/createStepListState.d.ts +48 -0
  65. package/dist/steplist/index.d.ts +1 -0
  66. package/dist/table/TableCollection.d.ts +3 -3
  67. package/dist/table/createTableColumnResizeState.d.ts +54 -0
  68. package/dist/table/createTableState.d.ts +2 -2
  69. package/dist/table/index.d.ts +5 -3
  70. package/dist/table/types.d.ts +10 -10
  71. package/dist/tabs/createTabListState.d.ts +5 -5
  72. package/dist/tabs/index.d.ts +1 -1
  73. package/dist/textfield/createTextFieldState.d.ts +2 -2
  74. package/dist/textfield/index.d.ts +1 -1
  75. package/dist/toast/createToastState.d.ts +15 -3
  76. package/dist/toast/index.d.ts +1 -1
  77. package/dist/toggle/createToggleGroupState.d.ts +45 -0
  78. package/dist/toggle/createToggleState.d.ts +2 -2
  79. package/dist/toggle/index.d.ts +2 -1
  80. package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
  81. package/dist/tooltip/index.d.ts +1 -1
  82. package/dist/tree/TreeCollection.d.ts +5 -4
  83. package/dist/tree/createTreeState.d.ts +2 -2
  84. package/dist/tree/index.d.ts +3 -3
  85. package/dist/tree/types.d.ts +19 -13
  86. package/dist/utils/index.d.ts +1 -1
  87. package/dist/utils/reactivity.d.ts +1 -1
  88. package/package.json +30 -30
  89. package/src/autocomplete/createAutocompleteState.d.ts +19 -17
  90. package/src/autocomplete/createAutocompleteState.ts +25 -32
  91. package/src/autocomplete/index.d.ts +6 -2
  92. package/src/autocomplete/index.ts +1 -1
  93. package/src/calendar/createCalendarState.d.ts +139 -117
  94. package/src/calendar/createCalendarState.ts +221 -74
  95. package/src/calendar/createDateFieldState.d.ts +130 -95
  96. package/src/calendar/createDateFieldState.ts +286 -151
  97. package/src/calendar/createDatePickerState.ts +347 -0
  98. package/src/calendar/createRangeCalendarState.d.ts +154 -129
  99. package/src/calendar/createRangeCalendarState.ts +293 -79
  100. package/src/calendar/createTimeFieldState.d.ts +81 -79
  101. package/src/calendar/createTimeFieldState.ts +187 -108
  102. package/src/calendar/index.d.ts +80 -7
  103. package/src/calendar/index.ts +21 -12
  104. package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
  105. package/src/checkbox/createCheckboxGroupState.ts +57 -30
  106. package/src/checkbox/index.d.ts +6 -2
  107. package/src/checkbox/index.ts +1 -1
  108. package/src/collections/ListCollection.d.ts +25 -22
  109. package/src/collections/ListCollection.ts +152 -146
  110. package/src/collections/createListState.d.ts +73 -58
  111. package/src/collections/createListState.ts +267 -264
  112. package/src/collections/createMenuState.d.ts +36 -31
  113. package/src/collections/createMenuState.ts +112 -106
  114. package/src/collections/createSelectionState.d.ts +78 -65
  115. package/src/collections/createSelectionState.ts +340 -336
  116. package/src/collections/index.d.ts +38 -6
  117. package/src/collections/index.ts +41 -46
  118. package/src/collections/types.d.ts +101 -101
  119. package/src/collections/types.ts +181 -169
  120. package/src/color/Color.d.ts +20 -5
  121. package/src/color/Color.ts +1054 -951
  122. package/src/color/createColorAreaState.d.ts +67 -65
  123. package/src/color/createColorAreaState.ts +301 -293
  124. package/src/color/createColorFieldState.d.ts +46 -44
  125. package/src/color/createColorFieldState.ts +428 -292
  126. package/src/color/createColorSliderState.d.ts +58 -56
  127. package/src/color/createColorSliderState.ts +272 -241
  128. package/src/color/createColorWheelState.d.ts +42 -40
  129. package/src/color/createColorWheelState.ts +248 -211
  130. package/src/color/getColorChannels.ts +36 -0
  131. package/src/color/index.d.ts +36 -7
  132. package/src/color/index.ts +44 -47
  133. package/src/color/types.d.ts +68 -63
  134. package/src/color/types.ts +119 -127
  135. package/src/combobox/createComboBoxState.d.ts +107 -105
  136. package/src/combobox/createComboBoxState.ts +790 -703
  137. package/src/combobox/index.d.ts +10 -2
  138. package/src/combobox/index.ts +13 -13
  139. package/src/data/createAsyncList.ts +403 -0
  140. package/src/data/createListData.ts +298 -0
  141. package/src/data/createTreeData.ts +646 -0
  142. package/src/data/index.ts +25 -0
  143. package/src/datepicker/index.ts +32 -0
  144. package/src/disclosure/createDisclosureState.d.ts +47 -43
  145. package/src/disclosure/createDisclosureState.ts +9 -23
  146. package/src/disclosure/index.d.ts +10 -2
  147. package/src/disclosure/index.ts +1 -1
  148. package/src/dnd/createDragState.d.ts +51 -42
  149. package/src/dnd/createDragState.ts +151 -153
  150. package/src/dnd/createDraggableCollectionState.d.ts +52 -41
  151. package/src/dnd/createDraggableCollectionState.ts +158 -165
  152. package/src/dnd/createDropState.d.ts +64 -45
  153. package/src/dnd/createDropState.ts +202 -212
  154. package/src/dnd/createDroppableCollectionState.d.ts +88 -59
  155. package/src/dnd/createDroppableCollectionState.ts +354 -357
  156. package/src/dnd/index.d.ts +54 -6
  157. package/src/dnd/index.ts +63 -76
  158. package/src/dnd/types.d.ts +167 -156
  159. package/src/dnd/types.ts +316 -317
  160. package/src/form/createFormValidationState.d.ts +47 -45
  161. package/src/form/createFormValidationState.ts +356 -389
  162. package/src/form/index.d.ts +16 -2
  163. package/src/form/index.ts +15 -15
  164. package/src/grid/createGridState.d.ts +7 -4
  165. package/src/grid/createGridState.ts +44 -51
  166. package/src/grid/index.d.ts +3 -3
  167. package/src/grid/index.ts +2 -8
  168. package/src/grid/types.d.ts +136 -129
  169. package/src/grid/types.ts +24 -17
  170. package/src/index.d.ts +310 -26
  171. package/src/index.ts +87 -79
  172. package/src/menu/index.ts +17 -0
  173. package/src/numberfield/createNumberFieldState.d.ts +56 -54
  174. package/src/numberfield/createNumberFieldState.ts +422 -383
  175. package/src/numberfield/index.d.ts +6 -2
  176. package/src/numberfield/index.ts +5 -5
  177. package/src/overlays/createOverlayTriggerState.d.ts +22 -20
  178. package/src/overlays/createOverlayTriggerState.ts +66 -67
  179. package/src/overlays/index.d.ts +6 -2
  180. package/src/overlays/index.ts +5 -5
  181. package/src/radio/createRadioGroupState.d.ts +54 -52
  182. package/src/radio/createRadioGroupState.ts +66 -30
  183. package/src/radio/index.d.ts +7 -2
  184. package/src/radio/index.ts +1 -1
  185. package/src/searchfield/createSearchFieldState.d.ts +16 -14
  186. package/src/searchfield/createSearchFieldState.ts +56 -62
  187. package/src/searchfield/index.d.ts +3 -3
  188. package/src/searchfield/index.ts +2 -5
  189. package/src/select/createSelectState.d.ts +63 -61
  190. package/src/select/createSelectState.ts +290 -181
  191. package/src/select/index.d.ts +2 -2
  192. package/src/select/index.ts +1 -5
  193. package/src/selection/index.ts +27 -0
  194. package/src/slider/createSliderState.d.ts +60 -60
  195. package/src/slider/createSliderState.ts +233 -211
  196. package/src/slider/index.d.ts +3 -3
  197. package/src/slider/index.ts +2 -6
  198. package/src/ssr/index.d.ts +1 -1
  199. package/src/ssr/index.ts +2 -2
  200. package/src/steplist/createStepListState.ts +191 -0
  201. package/src/steplist/index.ts +5 -0
  202. package/src/table/TableCollection.d.ts +42 -40
  203. package/src/table/TableCollection.ts +61 -64
  204. package/src/table/createTableColumnResizeState.ts +242 -0
  205. package/src/table/createTableState.d.ts +7 -4
  206. package/src/table/createTableState.ts +10 -7
  207. package/src/table/index.d.ts +14 -4
  208. package/src/table/index.ts +10 -3
  209. package/src/table/types.d.ts +98 -92
  210. package/src/table/types.ts +17 -13
  211. package/src/tabs/createTabListState.d.ts +59 -57
  212. package/src/tabs/createTabListState.ts +58 -39
  213. package/src/tabs/index.d.ts +8 -2
  214. package/src/tabs/index.ts +1 -1
  215. package/src/textfield/createTextFieldState.d.ts +16 -14
  216. package/src/textfield/createTextFieldState.ts +7 -18
  217. package/src/textfield/index.d.ts +6 -2
  218. package/src/textfield/index.ts +1 -1
  219. package/src/toast/createToastState.d.ts +92 -81
  220. package/src/toast/createToastState.ts +56 -44
  221. package/src/toast/index.d.ts +12 -2
  222. package/src/toast/index.ts +1 -1
  223. package/src/toggle/createToggleGroupState.ts +117 -0
  224. package/src/toggle/createToggleState.d.ts +19 -19
  225. package/src/toggle/createToggleState.ts +2 -16
  226. package/src/toggle/index.d.ts +2 -2
  227. package/src/toggle/index.ts +6 -4
  228. package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
  229. package/src/tooltip/createTooltipTriggerState.ts +184 -183
  230. package/src/tooltip/index.d.ts +7 -2
  231. package/src/tooltip/index.ts +6 -6
  232. package/src/tree/TreeCollection.d.ts +26 -23
  233. package/src/tree/TreeCollection.ts +215 -175
  234. package/src/tree/createTreeState.d.ts +7 -4
  235. package/src/tree/createTreeState.ts +390 -392
  236. package/src/tree/index.d.ts +10 -4
  237. package/src/tree/index.ts +13 -13
  238. package/src/tree/types.d.ts +131 -126
  239. package/src/tree/types.ts +183 -174
  240. package/src/utils/index.d.ts +2 -2
  241. package/src/utils/index.ts +1 -1
  242. package/src/utils/reactivity.d.ts +2 -2
  243. package/src/utils/reactivity.ts +3 -3
@@ -1,181 +1,290 @@
1
- /**
2
- * State management for select components.
3
- * Based on @react-stately/select useSelectState.
4
- */
5
-
6
- import { createSignal, 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
-
12
- export interface SelectStateProps<T = unknown> {
13
- /** The items to display in the select. */
14
- items: T[];
15
- /** Function to get the key for an item. */
16
- getKey?: (item: T) => Key;
17
- /** Function to get the text value for an item. */
18
- getTextValue?: (item: T) => string;
19
- /** Function to check if an item is disabled. */
20
- getDisabled?: (item: T) => boolean;
21
- /** Keys of disabled items. */
22
- disabledKeys?: Iterable<Key>;
23
- /** The currently selected key (controlled). */
24
- selectedKey?: Key | null;
25
- /** The default selected key (uncontrolled). */
26
- defaultSelectedKey?: Key | null;
27
- /** Handler called when the selection changes. */
28
- onSelectionChange?: (key: Key | null) => void;
29
- /** Whether the select is open (controlled). */
30
- isOpen?: boolean;
31
- /** Whether the select is open by default (uncontrolled). */
32
- defaultOpen?: boolean;
33
- /** Handler called when the open state changes. */
34
- onOpenChange?: (isOpen: boolean) => void;
35
- /** Whether the select is disabled. */
36
- isDisabled?: boolean;
37
- /** Whether the select is required. */
38
- isRequired?: boolean;
39
- }
40
-
41
- export interface SelectState<T = unknown> {
42
- /** The collection of items. */
43
- readonly collection: Accessor<Collection<T>>;
44
- /** Whether the select dropdown is open. */
45
- readonly isOpen: Accessor<boolean>;
46
- /** Open the select dropdown. */
47
- open(): void;
48
- /** Close the select dropdown. */
49
- close(): void;
50
- /** Toggle the select dropdown. */
51
- toggle(): void;
52
- /** The currently selected key. */
53
- readonly selectedKey: Accessor<Key | null>;
54
- /** The currently selected item. */
55
- readonly selectedItem: Accessor<CollectionNode<T> | null>;
56
- /** Set the selected key. */
57
- setSelectedKey(key: Key | null): void;
58
- /** The currently focused key. */
59
- readonly focusedKey: Accessor<Key | null>;
60
- /** Set the focused key. */
61
- setFocusedKey(key: Key | null): void;
62
- /** Whether the select has focus. */
63
- readonly isFocused: Accessor<boolean>;
64
- /** Set whether the select has focus. */
65
- setFocused(isFocused: boolean): void;
66
- /** Whether a specific key is disabled. */
67
- isKeyDisabled(key: Key): boolean;
68
- /** Whether the select is disabled. */
69
- readonly isDisabled: boolean;
70
- /** Whether the select is required. */
71
- readonly isRequired: boolean;
72
- }
73
-
74
- /**
75
- * Creates state for a select component.
76
- * Combines list state with overlay trigger state for dropdown behavior.
77
- */
78
- export function createSelectState<T = unknown>(
79
- props: MaybeAccessor<SelectStateProps<T>>
80
- ): SelectState<T> {
81
- const getProps = () => access(props);
82
-
83
- // Overlay trigger state for open/close
84
- const overlayState = createOverlayTriggerState({
85
- get isOpen() {
86
- return getProps().isOpen;
87
- },
88
- get defaultOpen() {
89
- return getProps().defaultOpen;
90
- },
91
- get onOpenChange() {
92
- return getProps().onOpenChange;
93
- },
94
- });
95
-
96
- // Track selected key
97
- const isControlled = () => getProps().selectedKey !== undefined;
98
- const [internalSelectedKey, setInternalSelectedKey] = createSignal<Key | null>(
99
- getProps().defaultSelectedKey ?? null
100
- );
101
-
102
- const selectedKey: Accessor<Key | null> = () => {
103
- return isControlled() ? (getProps().selectedKey ?? null) : internalSelectedKey();
104
- };
105
-
106
- const setSelectedKey = (key: Key | null) => {
107
- if (!isControlled()) {
108
- setInternalSelectedKey(key);
109
- }
110
- getProps().onSelectionChange?.(key);
111
- };
112
-
113
- // Create list state with single selection
114
- const listState = createListState<T>({
115
- get items() {
116
- return getProps().items;
117
- },
118
- get getKey() {
119
- return getProps().getKey;
120
- },
121
- get getTextValue() {
122
- return getProps().getTextValue;
123
- },
124
- get getDisabled() {
125
- return getProps().getDisabled;
126
- },
127
- get disabledKeys() {
128
- return getProps().disabledKeys;
129
- },
130
- selectionMode: 'single',
131
- disallowEmptySelection: true,
132
- get selectedKeys() {
133
- const key = selectedKey();
134
- return key != null ? [key] : [];
135
- },
136
- onSelectionChange(keys) {
137
- // Get the first (and only) selected key
138
- if (keys === 'all') return; // Not applicable for single select
139
- const key = keys.size > 0 ? Array.from(keys)[0] : null;
140
- setSelectedKey(key);
141
- // Close the dropdown after selection
142
- overlayState.close();
143
- },
144
- });
145
-
146
- // Get the selected item from the collection
147
- const selectedItem: Accessor<CollectionNode<T> | null> = () => {
148
- const key = selectedKey();
149
- if (key == null) return null;
150
- return listState.collection().getItem(key);
151
- };
152
-
153
- return {
154
- // Collection
155
- collection: listState.collection,
156
-
157
- // Focus management
158
- focusedKey: listState.focusedKey,
159
- setFocusedKey: listState.setFocusedKey,
160
- isFocused: listState.isFocused,
161
- setFocused: listState.setFocused,
162
-
163
- // Overlay state
164
- isOpen: overlayState.isOpen,
165
- open: overlayState.open,
166
- close: overlayState.close,
167
- toggle: overlayState.toggle,
168
-
169
- // Select-specific
170
- selectedKey,
171
- selectedItem,
172
- setSelectedKey,
173
- isKeyDisabled: (key: Key) => listState.isDisabled(key),
174
- get isDisabled() {
175
- return getProps().isDisabled ?? false;
176
- },
177
- get isRequired() {
178
- return getProps().isRequired ?? false;
179
- },
180
- };
181
- }
1
+ /**
2
+ * State management for select components.
3
+ * Based on @react-stately/select useSelectState.
4
+ */
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";
12
+
13
+ export interface SelectStateProps<T = unknown> {
14
+ /** The items to display in the select. */
15
+ items: T[];
16
+ /** Function to get the key for an item. */
17
+ getKey?: (item: T) => Key;
18
+ /** Function to get the text value for an item. */
19
+ getTextValue?: (item: T) => string;
20
+ /** Function to check if an item is disabled. */
21
+ getDisabled?: (item: T) => boolean;
22
+ /** Keys of disabled items. */
23
+ disabledKeys?: Iterable<Key>;
24
+ /** The currently selected key (controlled). */
25
+ selectedKey?: Key | null;
26
+ /** The default selected key (uncontrolled). */
27
+ defaultSelectedKey?: Key | null;
28
+ /** The selected keys (controlled, for multiple selection mode). */
29
+ selectedKeys?: "all" | Iterable<Key>;
30
+ /** Default selected keys (uncontrolled, for multiple selection mode). */
31
+ defaultSelectedKeys?: "all" | Iterable<Key>;
32
+ /** Handler called when the selection changes. */
33
+ onSelectionChange?: (key: Key | null) => void;
34
+ /** Handler called when selected keys change. */
35
+ onSelectionChangeKeys?: (keys: Selection) => void;
36
+ /** Selection mode for the select. */
37
+ selectionMode?: Extract<SelectionMode, "single" | "multiple">;
38
+ /** Whether the select is open (controlled). */
39
+ isOpen?: boolean;
40
+ /** Whether the select is open by default (uncontrolled). */
41
+ defaultOpen?: boolean;
42
+ /** Handler called when the open state changes. */
43
+ onOpenChange?: (isOpen: boolean) => void;
44
+ /** Whether the select is disabled. */
45
+ isDisabled?: boolean;
46
+ /** Whether the select is required. */
47
+ isRequired?: boolean;
48
+ }
49
+
50
+ export interface SelectState<T = unknown> {
51
+ /** The collection of items. */
52
+ readonly collection: Accessor<Collection<T>>;
53
+ /** Whether the select dropdown is open. */
54
+ readonly isOpen: Accessor<boolean>;
55
+ /** Open the select dropdown. */
56
+ open(): void;
57
+ /** Close the select dropdown. */
58
+ close(): void;
59
+ /** Toggle the select dropdown. */
60
+ toggle(): void;
61
+ /** The currently selected key. */
62
+ readonly selectedKey: Accessor<Key | null>;
63
+ /** The selected keys. */
64
+ readonly selectedKeys: Accessor<Selection>;
65
+ /** The currently selected item. */
66
+ readonly selectedItem: Accessor<CollectionNode<T> | null>;
67
+ /** The currently selected items. */
68
+ readonly selectedItems: Accessor<CollectionNode<T>[]>;
69
+ /** Set the selected key. */
70
+ setSelectedKey(key: Key | null): void;
71
+ /** Set selected keys. */
72
+ setSelectedKeys(keys: Iterable<Key>): void;
73
+ /** The currently focused key. */
74
+ readonly focusedKey: Accessor<Key | null>;
75
+ /** Set the focused key. */
76
+ setFocusedKey(key: Key | null): void;
77
+ /** Whether the select has focus. */
78
+ readonly isFocused: Accessor<boolean>;
79
+ /** Set whether the select has focus. */
80
+ setFocused(isFocused: boolean): void;
81
+ /** Whether a specific key is disabled. */
82
+ isKeyDisabled(key: Key): boolean;
83
+ /** Whether the select is disabled. */
84
+ readonly isDisabled: boolean;
85
+ /** Whether the select is required. */
86
+ readonly isRequired: boolean;
87
+ /** The selection mode. */
88
+ readonly selectionMode: Accessor<"single" | "multiple">;
89
+ }
90
+
91
+ /**
92
+ * Creates state for a select component.
93
+ * Combines list state with overlay trigger state for dropdown behavior.
94
+ */
95
+ export function createSelectState<T = unknown>(
96
+ props: MaybeAccessor<SelectStateProps<T>>,
97
+ ): SelectState<T> {
98
+ const getProps = () => access(props);
99
+ const selectionMode: Accessor<"single" | "multiple"> = () => getProps().selectionMode ?? "single";
100
+
101
+ // Overlay trigger state for open/close
102
+ const overlayState = createOverlayTriggerState({
103
+ get isOpen() {
104
+ return getProps().isOpen;
105
+ },
106
+ get defaultOpen() {
107
+ return getProps().defaultOpen;
108
+ },
109
+ get onOpenChange() {
110
+ return getProps().onOpenChange;
111
+ },
112
+ });
113
+
114
+ // Track selected key
115
+ const isControlledSingle = () => getProps().selectedKey !== undefined;
116
+ const isControlledMultiple = () => getProps().selectedKeys !== undefined;
117
+ const [internalSelectedKey, setInternalSelectedKey] = createSignal<Key | null>(
118
+ getProps().defaultSelectedKey ?? null,
119
+ );
120
+ const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<Selection>(
121
+ getProps().defaultSelectedKeys === "all"
122
+ ? "all"
123
+ : new Set(getProps().defaultSelectedKeys ?? []),
124
+ );
125
+
126
+ const selectedKey: Accessor<Key | null> = () => {
127
+ if (selectionMode() === "multiple") {
128
+ const keys = selectedKeys();
129
+ if (keys === "all") return null;
130
+ return keys.size > 0 ? Array.from(keys)[0] : null;
131
+ }
132
+
133
+ return isControlledSingle() ? (getProps().selectedKey ?? null) : internalSelectedKey();
134
+ };
135
+
136
+ const setSelectedKey = (key: Key | null) => {
137
+ if (selectionMode() === "multiple") {
138
+ if (key == null) {
139
+ if (!isControlledMultiple()) {
140
+ setInternalSelectedKeys(new Set<Key>());
141
+ }
142
+ getProps().onSelectionChangeKeys?.(new Set<Key>());
143
+ getProps().onSelectionChange?.(null);
144
+ } else {
145
+ const next = new Set([key]);
146
+ if (!isControlledMultiple()) {
147
+ setInternalSelectedKeys(next);
148
+ }
149
+ getProps().onSelectionChangeKeys?.(next);
150
+ getProps().onSelectionChange?.(key);
151
+ }
152
+ return;
153
+ }
154
+
155
+ if (!isControlledSingle()) {
156
+ setInternalSelectedKey(key);
157
+ }
158
+ getProps().onSelectionChange?.(key);
159
+ getProps().onSelectionChangeKeys?.(key != null ? new Set([key]) : new Set<Key>());
160
+ };
161
+
162
+ const selectedKeys: Accessor<Selection> = createMemo(() => {
163
+ if (selectionMode() === "multiple") {
164
+ if (isControlledMultiple()) {
165
+ const keys = getProps().selectedKeys;
166
+ return keys === "all" ? "all" : new Set<Key>(keys ?? []);
167
+ }
168
+ return internalSelectedKeys();
169
+ }
170
+
171
+ const key = selectedKey();
172
+ return key != null ? new Set<Key>([key]) : new Set<Key>();
173
+ });
174
+
175
+ const setSelectedKeys = (keys: Iterable<Key>) => {
176
+ const next = new Set(keys);
177
+ if (selectionMode() === "multiple") {
178
+ if (!isControlledMultiple()) {
179
+ setInternalSelectedKeys(next);
180
+ }
181
+ getProps().onSelectionChangeKeys?.(next);
182
+ getProps().onSelectionChange?.(next.size > 0 ? Array.from(next)[0] : null);
183
+ return;
184
+ }
185
+
186
+ const key = next.size > 0 ? Array.from(next)[0] : null;
187
+ setSelectedKey(key);
188
+ };
189
+
190
+ // Create list state with select selection mode
191
+ const listState = createListState<T>({
192
+ get items() {
193
+ return getProps().items;
194
+ },
195
+ get getKey() {
196
+ return getProps().getKey;
197
+ },
198
+ get getTextValue() {
199
+ return getProps().getTextValue;
200
+ },
201
+ get getDisabled() {
202
+ return getProps().getDisabled;
203
+ },
204
+ get disabledKeys() {
205
+ return getProps().disabledKeys;
206
+ },
207
+ get selectionMode() {
208
+ return selectionMode();
209
+ },
210
+ disallowEmptySelection: true,
211
+ get selectedKeys() {
212
+ const keys = selectedKeys();
213
+ if (keys === "all") return "all";
214
+ return keys;
215
+ },
216
+ onSelectionChange(keys) {
217
+ if (selectionMode() === "multiple") {
218
+ if (!isControlledMultiple()) {
219
+ setInternalSelectedKeys(keys);
220
+ }
221
+ getProps().onSelectionChangeKeys?.(keys);
222
+ if (keys !== "all") {
223
+ getProps().onSelectionChange?.(keys.size > 0 ? Array.from(keys)[0] : null);
224
+ }
225
+ return;
226
+ }
227
+
228
+ // Get the first (and only) selected key
229
+ if (keys === "all") return;
230
+ const key = keys.size > 0 ? Array.from(keys)[0] : null;
231
+ setSelectedKey(key);
232
+ // Close the dropdown after selection in single mode
233
+ overlayState.close();
234
+ },
235
+ });
236
+
237
+ // Get the selected item from the collection (memoized)
238
+ const selectedItem: Accessor<CollectionNode<T> | null> = createMemo(() => {
239
+ const key = selectedKey();
240
+ if (key == null) return null;
241
+ return listState.collection().getItem(key);
242
+ });
243
+
244
+ const selectedItems: Accessor<CollectionNode<T>[]> = createMemo(() => {
245
+ const keys = selectedKeys();
246
+ if (keys === "all") {
247
+ return Array.from(listState.collection());
248
+ }
249
+
250
+ const items: CollectionNode<T>[] = [];
251
+ for (const key of keys) {
252
+ const item = listState.collection().getItem(key);
253
+ if (item) items.push(item);
254
+ }
255
+ return items;
256
+ });
257
+
258
+ return {
259
+ // Collection
260
+ collection: listState.collection,
261
+
262
+ // Focus management
263
+ focusedKey: listState.focusedKey,
264
+ setFocusedKey: listState.setFocusedKey,
265
+ isFocused: listState.isFocused,
266
+ setFocused: listState.setFocused,
267
+
268
+ // Overlay state
269
+ isOpen: overlayState.isOpen,
270
+ open: overlayState.open,
271
+ close: overlayState.close,
272
+ toggle: overlayState.toggle,
273
+
274
+ // Select-specific
275
+ selectionMode,
276
+ selectedKey,
277
+ selectedKeys,
278
+ selectedItem,
279
+ selectedItems,
280
+ setSelectedKey,
281
+ setSelectedKeys,
282
+ isKeyDisabled: (key: Key) => listState.isDisabled(key),
283
+ get isDisabled() {
284
+ return getProps().isDisabled ?? false;
285
+ },
286
+ get isRequired() {
287
+ return getProps().isRequired ?? false;
288
+ },
289
+ };
290
+ }
@@ -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,27 @@
1
+ /**
2
+ * Selection compatibility surface.
3
+ *
4
+ * Provides a React Stately-like module entrypoint for selection state while
5
+ * delegating to the existing Solid collection selection primitives.
6
+ */
7
+
8
+ export {
9
+ createSelectionState,
10
+ type SelectionStateProps,
11
+ type SelectionState,
12
+ } from "../collections/createSelectionState";
13
+
14
+ export type {
15
+ Key,
16
+ Selection,
17
+ SelectionMode,
18
+ SelectionBehavior,
19
+ DisabledBehavior,
20
+ FocusStrategy,
21
+ } from "../collections/types";
22
+
23
+ export type MultipleSelectionStateProps =
24
+ import("../collections/createSelectionState").SelectionStateProps;
25
+ export type MultipleSelectionState = import("../collections/createSelectionState").SelectionState;
26
+
27
+ export { createSelectionState as useMultipleSelectionState } from "../collections/createSelectionState";
@@ -2,71 +2,71 @@
2
2
  * Creates state for a slider component.
3
3
  * Based on @react-stately/slider useSliderState.
4
4
  */
5
- import { type Accessor } from 'solid-js';
6
- import { type MaybeAccessor } from '../utils';
7
- export type SliderOrientation = 'horizontal' | 'vertical';
5
+ import { type Accessor } from "solid-js";
6
+ import { type MaybeAccessor } from "../utils";
7
+ export type SliderOrientation = "horizontal" | "vertical";
8
8
  export interface SliderStateProps {
9
- /** The current value (controlled). */
10
- value?: number;
11
- /** The default value (uncontrolled). */
12
- defaultValue?: number;
13
- /** Handler called when the value changes. */
14
- onChange?: (value: number) => void;
15
- /** Handler called when the user stops dragging. */
16
- onChangeEnd?: (value: number) => void;
17
- /** The minimum value. */
18
- minValue?: number;
19
- /** The maximum value. */
20
- maxValue?: number;
21
- /** The step value. */
22
- step?: number;
23
- /** The orientation of the slider. */
24
- orientation?: SliderOrientation;
25
- /** Whether the slider is disabled. */
26
- isDisabled?: boolean;
27
- /** The locale for number formatting. */
28
- locale?: string;
29
- /** Number format options. */
30
- formatOptions?: Intl.NumberFormatOptions;
9
+ /** The current value (controlled). */
10
+ value?: number;
11
+ /** The default value (uncontrolled). */
12
+ defaultValue?: number;
13
+ /** Handler called when the value changes. */
14
+ onChange?: (value: number) => void;
15
+ /** Handler called when the user stops dragging. */
16
+ onChangeEnd?: (value: number) => void;
17
+ /** The minimum value. */
18
+ minValue?: number;
19
+ /** The maximum value. */
20
+ maxValue?: number;
21
+ /** The step value. */
22
+ step?: number;
23
+ /** The orientation of the slider. */
24
+ orientation?: SliderOrientation;
25
+ /** Whether the slider is disabled. */
26
+ isDisabled?: boolean;
27
+ /** The locale for number formatting. */
28
+ locale?: string;
29
+ /** Number format options. */
30
+ formatOptions?: Intl.NumberFormatOptions;
31
31
  }
32
32
  export interface SliderState {
33
- /** The current value. */
34
- value: Accessor<number>;
35
- /** Sets the value. */
36
- setValue: (value: number) => void;
37
- /** Sets the value by percent (0-1). */
38
- setValuePercent: (percent: number) => void;
39
- /** Gets the value as a percent (0-1). */
40
- getValuePercent: Accessor<number>;
41
- /** Gets the formatted value string. */
42
- getFormattedValue: Accessor<string>;
43
- /** Whether the thumb is being dragged. */
44
- isDragging: Accessor<boolean>;
45
- /** Sets the dragging state. */
46
- setDragging: (dragging: boolean) => void;
47
- /** Whether the slider is focused. */
48
- isFocused: Accessor<boolean>;
49
- /** Sets the focused state. */
50
- setFocused: (focused: boolean) => void;
51
- /** Increments the value by step. */
52
- increment: (stepMultiplier?: number) => void;
53
- /** Decrements the value by step. */
54
- decrement: (stepMultiplier?: number) => void;
55
- /** The minimum value. */
56
- minValue: number;
57
- /** The maximum value. */
58
- maxValue: number;
59
- /** The step value. */
60
- step: number;
61
- /** The page step (larger step for Page Up/Down). */
62
- pageStep: number;
63
- /** The orientation. */
64
- orientation: SliderOrientation;
65
- /** Whether the slider is disabled. */
66
- isDisabled: boolean;
33
+ /** The current value. */
34
+ value: Accessor<number>;
35
+ /** Sets the value. */
36
+ setValue: (value: number) => void;
37
+ /** Sets the value by percent (0-1). */
38
+ setValuePercent: (percent: number) => void;
39
+ /** Gets the value as a percent (0-1). */
40
+ getValuePercent: Accessor<number>;
41
+ /** Gets the formatted value string. */
42
+ getFormattedValue: Accessor<string>;
43
+ /** Whether the thumb is being dragged. */
44
+ isDragging: Accessor<boolean>;
45
+ /** Sets the dragging state. */
46
+ setDragging: (dragging: boolean) => void;
47
+ /** Whether the slider is focused. */
48
+ isFocused: Accessor<boolean>;
49
+ /** Sets the focused state. */
50
+ setFocused: (focused: boolean) => void;
51
+ /** Increments the value by step. */
52
+ increment: (stepMultiplier?: number) => void;
53
+ /** Decrements the value by step. */
54
+ decrement: (stepMultiplier?: number) => void;
55
+ /** The minimum value. */
56
+ minValue: number;
57
+ /** The maximum value. */
58
+ maxValue: number;
59
+ /** The step value. */
60
+ step: number;
61
+ /** The page step (larger step for Page Up/Down). */
62
+ pageStep: number;
63
+ /** The orientation. */
64
+ orientation: SliderOrientation;
65
+ /** Whether the slider is disabled. */
66
+ isDisabled: boolean;
67
67
  }
68
68
  /**
69
69
  * Provides state management for a slider component.
70
70
  */
71
71
  export declare function createSliderState(props: MaybeAccessor<SliderStateProps>): SliderState;
72
- //# sourceMappingURL=createSliderState.d.ts.map
72
+ //# sourceMappingURL=createSliderState.d.ts.map