@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
@@ -3,11 +3,7 @@
3
3
  * Based on @react-stately/toast useToastState
4
4
  */
5
5
 
6
- import { createSignal, onCleanup, type Accessor } from 'solid-js';
7
-
8
- // ============================================
9
- // TYPES
10
- // ============================================
6
+ import { createSignal, onCleanup, type Accessor } from "solid-js";
11
7
 
12
8
  export interface ToastOptions {
13
9
  /** A timeout to automatically close the toast, in milliseconds. */
@@ -26,7 +22,7 @@ export interface QueuedToast<T> {
26
22
  /** The timer for the toast. */
27
23
  timer: Timer | null;
28
24
  /** Whether the toast should be animated. */
29
- animation?: 'entering' | 'exiting' | 'queued';
25
+ animation?: "entering" | "exiting" | "queued";
30
26
  /** The priority of the toast. */
31
27
  priority: number;
32
28
  /** Handler called when the toast is closed. */
@@ -52,18 +48,22 @@ export interface ToastState<T> {
52
48
  visibleToasts: Accessor<QueuedToast<T>[]>;
53
49
  /** Adds a toast to the queue. */
54
50
  add: (content: T, options?: ToastOptions) => string;
55
- /** Closes a toast by key. */
51
+ /** Closes a toast by key. Starts exit animation if hasExitAnimation is enabled. */
56
52
  close: (key: string) => void;
53
+ /**
54
+ * Removes a toast after exit animation completes.
55
+ * Call this from the component layer when the CSS exit animation finishes.
56
+ * If hasExitAnimation is false, close() removes immediately and this is not needed.
57
+ */
58
+ remove: (key: string) => void;
59
+ /** Clears all queued and visible toasts. */
60
+ clear: () => void;
57
61
  /** Pauses all toast timers. */
58
62
  pauseAll: () => void;
59
63
  /** Resumes all toast timers. */
60
64
  resumeAll: () => void;
61
65
  }
62
66
 
63
- // ============================================
64
- // TIMER CLASS
65
- // ============================================
66
-
67
67
  /**
68
68
  * A Timer that supports pause and resume.
69
69
  */
@@ -113,10 +113,6 @@ export class Timer {
113
113
  }
114
114
  }
115
115
 
116
- // ============================================
117
- // TOAST QUEUE CLASS
118
- // ============================================
119
-
120
116
  type SubscribeCallback<T> = (toasts: QueuedToast<T>[]) => void;
121
117
 
122
118
  /**
@@ -158,7 +154,7 @@ export class ToastQueue<T> {
158
154
  priority: options.priority ?? 0,
159
155
  onClose: options.onClose,
160
156
  timeout: options.timeout,
161
- animation: 'entering',
157
+ animation: "entering",
162
158
  };
163
159
 
164
160
  // Find insertion point based on priority
@@ -166,7 +162,7 @@ export class ToastQueue<T> {
166
162
  let high = this.queue.length;
167
163
  while (low < high) {
168
164
  const mid = Math.floor((low + high) / 2);
169
- if (toast.priority > this.queue[mid].priority) {
165
+ if (toast.priority >= this.queue[mid].priority) {
170
166
  high = mid;
171
167
  } else {
172
168
  low = mid + 1;
@@ -174,11 +170,7 @@ export class ToastQueue<T> {
174
170
  }
175
171
 
176
172
  // Insert at the correct position
177
- this.queue = [
178
- ...this.queue.slice(0, low),
179
- toast,
180
- ...this.queue.slice(low),
181
- ];
173
+ this.queue = [...this.queue.slice(0, low), toast, ...this.queue.slice(low)];
182
174
 
183
175
  // Start timer for visible toasts
184
176
  this.updateVisibility();
@@ -195,11 +187,12 @@ export class ToastQueue<T> {
195
187
 
196
188
  // Cancel any existing timer
197
189
  toast.timer?.cancel();
198
- toast.timer = null;
199
190
 
200
- if (this.hasExitAnimation && toast.animation !== 'queued') {
191
+ if (this.hasExitAnimation && toast.animation !== "queued") {
201
192
  // Mark as exiting for animation
202
- toast.animation = 'exiting';
193
+ this.queue = this.queue.map((t) =>
194
+ t.key === key ? { ...t, timer: null, animation: "exiting" } : t,
195
+ );
203
196
  this.notify();
204
197
  } else {
205
198
  // Remove immediately
@@ -221,6 +214,18 @@ export class ToastQueue<T> {
221
214
  this.updateVisibility();
222
215
  }
223
216
 
217
+ /**
218
+ * Clear all queued and visible toasts.
219
+ */
220
+ clear(): void {
221
+ for (const toast of this.queue) {
222
+ toast.timer?.cancel();
223
+ }
224
+
225
+ this.queue = [];
226
+ this.notify();
227
+ }
228
+
224
229
  /**
225
230
  * Pause all toast timers.
226
231
  */
@@ -242,24 +247,35 @@ export class ToastQueue<T> {
242
247
  private updateVisibility(): void {
243
248
  // Mark toasts as visible or queued based on maxVisibleToasts
244
249
  const visibleCount = this.queue.filter(
245
- (t) => t.animation !== 'queued' && t.animation !== 'exiting'
250
+ (t) => t.animation !== "queued" && t.animation !== "exiting",
246
251
  ).length;
247
252
 
248
253
  let promoted = 0;
249
- for (const toast of this.queue) {
250
- if (toast.animation === 'queued' && visibleCount + promoted < this.maxVisibleToasts) {
251
- toast.animation = 'entering';
254
+ this.queue = this.queue.map((toast) => {
255
+ let nextToast = toast;
256
+
257
+ if (nextToast.animation === "queued" && visibleCount + promoted < this.maxVisibleToasts) {
258
+ nextToast = { ...nextToast, animation: "entering" };
252
259
  promoted++;
253
260
  }
254
- if (toast.animation === 'queued') continue;
261
+ if (nextToast.animation === "queued") return nextToast;
255
262
 
256
263
  // Start timer for visible toasts
257
- if (toast.timeout != null && toast.timer === null && toast.animation !== 'exiting') {
258
- toast.timer = new Timer(() => {
259
- this.close(toast.key);
260
- }, toast.timeout);
264
+ if (
265
+ nextToast.timeout != null &&
266
+ nextToast.timer === null &&
267
+ nextToast.animation !== "exiting"
268
+ ) {
269
+ nextToast = {
270
+ ...nextToast,
271
+ timer: new Timer(() => {
272
+ this.close(nextToast.key);
273
+ }, nextToast.timeout),
274
+ };
261
275
  }
262
- }
276
+
277
+ return nextToast;
278
+ });
263
279
 
264
280
  this.notify();
265
281
  }
@@ -272,10 +288,6 @@ export class ToastQueue<T> {
272
288
  }
273
289
  }
274
290
 
275
- // ============================================
276
- // HOOK
277
- // ============================================
278
-
279
291
  /**
280
292
  * Creates reactive toast state from a ToastQueue.
281
293
  * Use this hook to subscribe to toast changes in your component.
@@ -296,20 +308,20 @@ export function createToastState<T>(props: ToastStateProps<T>): ToastState<T> {
296
308
  visibleToasts,
297
309
  add: (content, options) => props.queue.add(content, options),
298
310
  close: (key) => props.queue.close(key),
311
+ remove: (key) => props.queue.remove(key),
312
+ clear: () => props.queue.clear(),
299
313
  pauseAll: () => props.queue.pauseAll(),
300
314
  resumeAll: () => props.queue.resumeAll(),
301
315
  };
302
316
  }
303
317
 
304
- // ============================================
305
- // CONVENIENCE HOOKS
306
- // ============================================
307
-
308
318
  /**
309
319
  * Creates a new ToastQueue and returns reactive state.
310
320
  * Use this if you don't need a global queue.
311
321
  */
312
- export function createToastQueue<T>(options?: ToastQueueOptions): ToastState<T> & { queue: ToastQueue<T> } {
322
+ export function createToastQueue<T>(
323
+ options?: ToastQueueOptions,
324
+ ): ToastState<T> & { queue: ToastQueue<T> } {
313
325
  const queue = new ToastQueue<T>(options);
314
326
  const state = createToastState({ queue });
315
327
  return { ...state, queue };
@@ -1,2 +1,12 @@
1
- export { createToastState, createToastQueue, ToastQueue, Timer, type ToastOptions, type QueuedToast, type ToastQueueOptions, type ToastStateProps, type ToastState, } from './createToastState';
2
- //# sourceMappingURL=index.d.ts.map
1
+ export {
2
+ createToastState,
3
+ createToastQueue,
4
+ ToastQueue,
5
+ Timer,
6
+ type ToastOptions,
7
+ type QueuedToast,
8
+ type ToastQueueOptions,
9
+ type ToastStateProps,
10
+ type ToastState,
11
+ } from "./createToastState";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -8,4 +8,4 @@ export {
8
8
  type ToastQueueOptions,
9
9
  type ToastStateProps,
10
10
  type ToastState,
11
- } from './createToastState';
11
+ } from "./createToastState";
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Toggle group state for Solid Stately
3
+ *
4
+ * Provides state management for groups of toggle buttons with
5
+ * single or multiple selection.
6
+ *
7
+ * This is a port of @react-stately/toggle's useToggleGroupState.
8
+ */
9
+
10
+ import { createSignal } from "solid-js";
11
+ import type { Key } from "../collections";
12
+ import { type MaybeAccessor, access } from "../utils";
13
+
14
+ export interface ToggleGroupProps {
15
+ /**
16
+ * Whether single or multiple selection is enabled.
17
+ * @default 'single'
18
+ */
19
+ selectionMode?: "single" | "multiple";
20
+ /** Whether empty selection is disallowed. */
21
+ disallowEmptySelection?: boolean;
22
+ /** Controlled selected keys. */
23
+ selectedKeys?: Iterable<Key>;
24
+ /** Uncontrolled initial selected keys. */
25
+ defaultSelectedKeys?: Iterable<Key>;
26
+ /** Called when selected keys change. */
27
+ onSelectionChange?: (keys: Set<Key>) => void;
28
+ /** Whether all items are disabled. */
29
+ isDisabled?: boolean;
30
+ }
31
+
32
+ export interface ToggleGroupState {
33
+ /** Whether single or multiple selection is enabled. */
34
+ readonly selectionMode: "single" | "multiple";
35
+ /** Whether all items are disabled. */
36
+ readonly isDisabled: boolean;
37
+ /** Current selected keys. */
38
+ readonly selectedKeys: Set<Key>;
39
+ /** Toggles selected state for a key. */
40
+ toggleKey(key: Key): void;
41
+ /** Sets selected state for a key. */
42
+ setSelected(key: Key, isSelected: boolean): void;
43
+ /** Replaces selected keys. */
44
+ setSelectedKeys(keys: Set<Key>): void;
45
+ }
46
+
47
+ function toKeySet(keys?: Iterable<Key>): Set<Key> {
48
+ return new Set(keys ? Array.from(keys) : []);
49
+ }
50
+
51
+ /**
52
+ * Manages state for a group of toggle buttons.
53
+ */
54
+ export function createToggleGroupState(
55
+ props: MaybeAccessor<ToggleGroupProps> = {},
56
+ ): ToggleGroupState {
57
+ const getProps = () => access(props);
58
+
59
+ const initialProps = getProps();
60
+ const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<Set<Key>>(
61
+ toKeySet(initialProps.defaultSelectedKeys),
62
+ );
63
+
64
+ const isControlled = () => getProps().selectedKeys !== undefined;
65
+ const selectedKeys = () =>
66
+ isControlled() ? toKeySet(getProps().selectedKeys) : internalSelectedKeys();
67
+
68
+ function setSelectedKeys(keys: Set<Key>): void {
69
+ const nextKeys = new Set(keys);
70
+ if (!isControlled()) {
71
+ setInternalSelectedKeys(nextKeys);
72
+ }
73
+ getProps().onSelectionChange?.(nextKeys);
74
+ }
75
+
76
+ function toggleKey(key: Key): void {
77
+ const props = getProps();
78
+ const mode = props.selectionMode ?? "single";
79
+ const disallowEmptySelection = props.disallowEmptySelection ?? false;
80
+ const currentKeys = selectedKeys();
81
+
82
+ let nextKeys: Set<Key>;
83
+ if (mode === "multiple") {
84
+ nextKeys = new Set(currentKeys);
85
+ if (nextKeys.has(key) && (!disallowEmptySelection || nextKeys.size > 1)) {
86
+ nextKeys.delete(key);
87
+ } else {
88
+ nextKeys.add(key);
89
+ }
90
+ } else {
91
+ nextKeys = new Set(currentKeys.has(key) && !disallowEmptySelection ? [] : [key]);
92
+ }
93
+
94
+ setSelectedKeys(nextKeys);
95
+ }
96
+
97
+ function setSelected(key: Key, isSelected: boolean): void {
98
+ if (isSelected !== selectedKeys().has(key)) {
99
+ toggleKey(key);
100
+ }
101
+ }
102
+
103
+ return {
104
+ get selectionMode() {
105
+ return getProps().selectionMode ?? "single";
106
+ },
107
+ get isDisabled() {
108
+ return getProps().isDisabled ?? false;
109
+ },
110
+ get selectedKeys() {
111
+ return new Set(selectedKeys());
112
+ },
113
+ toggleKey,
114
+ setSelected,
115
+ setSelectedKeys,
116
+ };
117
+ }
@@ -5,30 +5,30 @@
5
5
  *
6
6
  * This is a 1:1 port of @react-stately/toggle's useToggleState.
7
7
  */
8
- import { Accessor } from 'solid-js';
9
- import { type MaybeAccessor } from '../utils';
8
+ import { Accessor } from "solid-js";
9
+ import { type MaybeAccessor } from "../utils";
10
10
  export interface ToggleStateOptions {
11
- /** Whether the element should be selected (controlled). */
12
- isSelected?: boolean;
13
- /** Whether the element should be selected by default (uncontrolled). */
14
- defaultSelected?: boolean;
15
- /** Handler that is called when the element's selection state changes. */
16
- onChange?: (isSelected: boolean) => void;
17
- /** Whether the element is read only. */
18
- isReadOnly?: boolean;
11
+ /** Whether the element should be selected (controlled). */
12
+ isSelected?: boolean;
13
+ /** Whether the element should be selected by default (uncontrolled). */
14
+ defaultSelected?: boolean;
15
+ /** Handler that is called when the element's selection state changes. */
16
+ onChange?: (isSelected: boolean) => void;
17
+ /** Whether the element is read only. */
18
+ isReadOnly?: boolean;
19
19
  }
20
20
  export interface ToggleState {
21
- /** Whether the toggle is selected. */
22
- readonly isSelected: Accessor<boolean>;
23
- /** Whether the toggle is selected by default. */
24
- readonly defaultSelected: boolean;
25
- /** Updates selection state. */
26
- setSelected(isSelected: boolean): void;
27
- /** Toggle the selection state. */
28
- toggle(): void;
21
+ /** Whether the toggle is selected. */
22
+ readonly isSelected: Accessor<boolean>;
23
+ /** Whether the toggle is selected by default. */
24
+ readonly defaultSelected: boolean;
25
+ /** Updates selection state. */
26
+ setSelected(isSelected: boolean): void;
27
+ /** Toggle the selection state. */
28
+ toggle(): void;
29
29
  }
30
30
  /**
31
31
  * Provides state management for toggle components like checkboxes and switches.
32
32
  */
33
33
  export declare function createToggleState(props?: MaybeAccessor<ToggleStateOptions>): ToggleState;
34
- //# sourceMappingURL=createToggleState.d.ts.map
34
+ //# sourceMappingURL=createToggleState.d.ts.map
@@ -6,12 +6,8 @@
6
6
  * This is a 1:1 port of @react-stately/toggle's useToggleState.
7
7
  */
8
8
 
9
- import { createSignal, Accessor } from 'solid-js';
10
- import { type MaybeAccessor, access } from '../utils';
11
-
12
- // ============================================
13
- // TYPES
14
- // ============================================
9
+ import { createSignal, Accessor } from "solid-js";
10
+ import { type MaybeAccessor, access } from "../utils";
15
11
 
16
12
  export interface ToggleStateOptions {
17
13
  /** Whether the element should be selected (controlled). */
@@ -35,33 +31,24 @@ export interface ToggleState {
35
31
  toggle(): void;
36
32
  }
37
33
 
38
- // ============================================
39
- // IMPLEMENTATION
40
- // ============================================
41
-
42
34
  /**
43
35
  * Provides state management for toggle components like checkboxes and switches.
44
36
  */
45
37
  export function createToggleState(props: MaybeAccessor<ToggleStateOptions> = {}): ToggleState {
46
38
  const getProps = () => access(props);
47
39
 
48
- // Get initial values
49
40
  const initialProps = getProps();
50
41
  const initialSelected = initialProps.isSelected ?? initialProps.defaultSelected ?? false;
51
42
 
52
- // Create internal signal for uncontrolled mode
53
43
  const [internalSelected, setInternalSelected] = createSignal(initialSelected);
54
44
 
55
- // Determine if controlled
56
45
  const isControlled = () => getProps().isSelected !== undefined;
57
46
 
58
- // Get current selection state
59
47
  const isSelected: Accessor<boolean> = () => {
60
48
  const p = getProps();
61
49
  return isControlled() ? (p.isSelected ?? false) : internalSelected();
62
50
  };
63
51
 
64
- // Update selection state
65
52
  function setSelected(value: boolean): void {
66
53
  const p = getProps();
67
54
  if (p.isReadOnly) {
@@ -75,7 +62,6 @@ export function createToggleState(props: MaybeAccessor<ToggleStateOptions> = {})
75
62
  p.onChange?.(value);
76
63
  }
77
64
 
78
- // Toggle selection state
79
65
  function toggle(): void {
80
66
  const p = getProps();
81
67
  if (p.isReadOnly) {
@@ -1,2 +1,2 @@
1
- export { createToggleState, type ToggleStateOptions, type ToggleState, } from './createToggleState';
2
- //# sourceMappingURL=index.d.ts.map
1
+ export { createToggleState, type ToggleStateOptions, type ToggleState } from "./createToggleState";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,7 @@
1
+ export { createToggleState, type ToggleStateOptions, type ToggleState } from "./createToggleState";
2
+
1
3
  export {
2
- createToggleState,
3
- type ToggleStateOptions,
4
- type ToggleState,
5
- } from './createToggleState';
4
+ createToggleGroupState,
5
+ type ToggleGroupProps,
6
+ type ToggleGroupState,
7
+ } from "./createToggleGroupState";
@@ -5,25 +5,25 @@
5
5
  * Tracks whether the tooltip is open, and provides methods to toggle this state.
6
6
  * Ensures only one tooltip is open at a time and controls the delay for showing a tooltip.
7
7
  */
8
- import { type Accessor } from 'solid-js';
9
- import { type OverlayTriggerProps } from '../overlays';
8
+ import { type Accessor } from "solid-js";
9
+ import { type OverlayTriggerProps } from "../overlays";
10
10
  export interface TooltipTriggerProps extends OverlayTriggerProps {
11
- /** The delay time in milliseconds for the tooltip to show up. */
12
- delay?: number;
13
- /** The delay time in milliseconds for the tooltip to close. */
14
- closeDelay?: number;
11
+ /** The delay time in milliseconds for the tooltip to show up. */
12
+ delay?: number;
13
+ /** The delay time in milliseconds for the tooltip to close. */
14
+ closeDelay?: number;
15
15
  }
16
16
  export interface TooltipTriggerState {
17
- /** Whether the tooltip is currently showing. */
18
- readonly isOpen: Accessor<boolean>;
19
- /**
20
- * Shows the tooltip. By default, the tooltip becomes visible after a delay
21
- * depending on a global warmup timer. The `immediate` option shows the
22
- * tooltip immediately instead.
23
- */
24
- open(immediate?: boolean): void;
25
- /** Hides the tooltip. */
26
- close(immediate?: boolean): void;
17
+ /** Whether the tooltip is currently showing. */
18
+ readonly isOpen: Accessor<boolean>;
19
+ /**
20
+ * Shows the tooltip. By default, the tooltip becomes visible after a delay
21
+ * depending on a global warmup timer. The `immediate` option shows the
22
+ * tooltip immediately instead.
23
+ */
24
+ open(immediate?: boolean): void;
25
+ /** Hides the tooltip. */
26
+ close(immediate?: boolean): void;
27
27
  }
28
28
  /**
29
29
  * Resets the global tooltip state. Useful for testing.
@@ -36,4 +36,4 @@ export declare function resetTooltipState(): void;
36
36
  * the delay for showing a tooltip.
37
37
  */
38
38
  export declare function createTooltipTriggerState(props?: TooltipTriggerProps): TooltipTriggerState;
39
- //# sourceMappingURL=createTooltipTriggerState.d.ts.map
39
+ //# sourceMappingURL=createTooltipTriggerState.d.ts.map