@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.
- package/LICENSE +21 -0
- package/README.md +30 -283
- package/dist/autocomplete/createAutocompleteState.d.ts +3 -2
- package/dist/autocomplete/index.d.ts +1 -1
- package/dist/calendar/createCalendarState.d.ts +22 -7
- package/dist/calendar/createDateFieldState.d.ts +30 -7
- package/dist/calendar/createDatePickerState.d.ts +60 -0
- package/dist/calendar/createRangeCalendarState.d.ts +27 -8
- package/dist/calendar/createTimeFieldState.d.ts +34 -7
- package/dist/calendar/index.d.ts +7 -6
- package/dist/checkbox/createCheckboxGroupState.d.ts +12 -3
- package/dist/checkbox/index.d.ts +1 -1
- package/dist/collections/ListCollection.d.ts +1 -1
- package/dist/collections/createListState.d.ts +8 -8
- package/dist/collections/createMenuState.d.ts +7 -7
- package/dist/collections/createSelectionState.d.ts +5 -5
- package/dist/collections/index.d.ts +5 -5
- package/dist/collections/types.d.ts +23 -12
- package/dist/color/Color.d.ts +1 -1
- package/dist/color/createColorAreaState.d.ts +4 -2
- package/dist/color/createColorFieldState.d.ts +38 -12
- package/dist/color/createColorSliderState.d.ts +9 -2
- package/dist/color/createColorWheelState.d.ts +13 -2
- package/dist/color/getColorChannels.d.ts +20 -0
- package/dist/color/index.d.ts +6 -6
- package/dist/color/types.d.ts +4 -4
- package/dist/combobox/createComboBoxState.d.ts +27 -13
- package/dist/combobox/index.d.ts +1 -1
- package/dist/data/createAsyncList.d.ts +111 -0
- package/dist/data/createListData.d.ts +65 -0
- package/dist/data/createTreeData.d.ts +65 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/datepicker/index.d.ts +8 -0
- package/dist/disclosure/createDisclosureState.d.ts +2 -2
- package/dist/disclosure/index.d.ts +1 -1
- package/dist/dnd/createDragState.d.ts +2 -2
- package/dist/dnd/createDraggableCollectionState.d.ts +2 -2
- package/dist/dnd/createDropState.d.ts +2 -2
- package/dist/dnd/createDroppableCollectionState.d.ts +3 -3
- package/dist/dnd/index.d.ts +5 -5
- package/dist/dnd/types.d.ts +16 -16
- package/dist/form/createFormValidationState.d.ts +3 -3
- package/dist/form/index.d.ts +1 -1
- package/dist/grid/createGridState.d.ts +2 -2
- package/dist/grid/index.d.ts +2 -2
- package/dist/grid/types.d.ts +17 -11
- package/dist/index.d.ts +31 -25
- package/dist/index.js +7990 -6264
- package/dist/index.js.map +1 -7
- package/dist/menu/index.d.ts +8 -0
- package/dist/numberfield/createNumberFieldState.d.ts +2 -2
- package/dist/numberfield/index.d.ts +1 -1
- package/dist/overlays/createOverlayTriggerState.d.ts +2 -2
- package/dist/overlays/index.d.ts +1 -1
- package/dist/radio/createRadioGroupState.d.ts +13 -4
- package/dist/radio/index.d.ts +1 -1
- package/dist/searchfield/createSearchFieldState.d.ts +2 -2
- package/dist/searchfield/index.d.ts +2 -2
- package/dist/select/createSelectState.d.ts +20 -3
- package/dist/select/index.d.ts +1 -1
- package/dist/selection/index.d.ts +11 -0
- package/dist/slider/createSliderState.d.ts +3 -3
- package/dist/slider/index.d.ts +2 -2
- package/dist/steplist/createStepListState.d.ts +48 -0
- package/dist/steplist/index.d.ts +1 -0
- package/dist/table/TableCollection.d.ts +3 -3
- package/dist/table/createTableColumnResizeState.d.ts +54 -0
- package/dist/table/createTableState.d.ts +2 -2
- package/dist/table/index.d.ts +5 -3
- package/dist/table/types.d.ts +10 -10
- package/dist/tabs/createTabListState.d.ts +5 -5
- package/dist/tabs/index.d.ts +1 -1
- package/dist/textfield/createTextFieldState.d.ts +2 -2
- package/dist/textfield/index.d.ts +1 -1
- package/dist/toast/createToastState.d.ts +15 -3
- package/dist/toast/index.d.ts +1 -1
- package/dist/toggle/createToggleGroupState.d.ts +45 -0
- package/dist/toggle/createToggleState.d.ts +2 -2
- package/dist/toggle/index.d.ts +2 -1
- package/dist/tooltip/createTooltipTriggerState.d.ts +2 -2
- package/dist/tooltip/index.d.ts +1 -1
- package/dist/tree/TreeCollection.d.ts +5 -4
- package/dist/tree/createTreeState.d.ts +2 -2
- package/dist/tree/index.d.ts +3 -3
- package/dist/tree/types.d.ts +19 -13
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/reactivity.d.ts +1 -1
- package/package.json +30 -30
- package/src/autocomplete/createAutocompleteState.d.ts +19 -17
- package/src/autocomplete/createAutocompleteState.ts +25 -32
- package/src/autocomplete/index.d.ts +6 -2
- package/src/autocomplete/index.ts +1 -1
- package/src/calendar/createCalendarState.d.ts +139 -117
- package/src/calendar/createCalendarState.ts +221 -74
- package/src/calendar/createDateFieldState.d.ts +130 -95
- package/src/calendar/createDateFieldState.ts +286 -151
- package/src/calendar/createDatePickerState.ts +347 -0
- package/src/calendar/createRangeCalendarState.d.ts +154 -129
- package/src/calendar/createRangeCalendarState.ts +293 -79
- package/src/calendar/createTimeFieldState.d.ts +81 -79
- package/src/calendar/createTimeFieldState.ts +187 -108
- package/src/calendar/index.d.ts +80 -7
- package/src/calendar/index.ts +21 -12
- package/src/checkbox/createCheckboxGroupState.d.ts +57 -55
- package/src/checkbox/createCheckboxGroupState.ts +57 -30
- package/src/checkbox/index.d.ts +6 -2
- package/src/checkbox/index.ts +1 -1
- package/src/collections/ListCollection.d.ts +25 -22
- package/src/collections/ListCollection.ts +152 -146
- package/src/collections/createListState.d.ts +73 -58
- package/src/collections/createListState.ts +267 -264
- package/src/collections/createMenuState.d.ts +36 -31
- package/src/collections/createMenuState.ts +112 -106
- package/src/collections/createSelectionState.d.ts +78 -65
- package/src/collections/createSelectionState.ts +340 -336
- package/src/collections/index.d.ts +38 -6
- package/src/collections/index.ts +41 -46
- package/src/collections/types.d.ts +101 -101
- package/src/collections/types.ts +181 -169
- package/src/color/Color.d.ts +20 -5
- package/src/color/Color.ts +1054 -951
- package/src/color/createColorAreaState.d.ts +67 -65
- package/src/color/createColorAreaState.ts +301 -293
- package/src/color/createColorFieldState.d.ts +46 -44
- package/src/color/createColorFieldState.ts +428 -292
- package/src/color/createColorSliderState.d.ts +58 -56
- package/src/color/createColorSliderState.ts +272 -241
- package/src/color/createColorWheelState.d.ts +42 -40
- package/src/color/createColorWheelState.ts +248 -211
- package/src/color/getColorChannels.ts +36 -0
- package/src/color/index.d.ts +36 -7
- package/src/color/index.ts +44 -47
- package/src/color/types.d.ts +68 -63
- package/src/color/types.ts +119 -127
- package/src/combobox/createComboBoxState.d.ts +107 -105
- package/src/combobox/createComboBoxState.ts +790 -703
- package/src/combobox/index.d.ts +10 -2
- package/src/combobox/index.ts +13 -13
- package/src/data/createAsyncList.ts +403 -0
- package/src/data/createListData.ts +298 -0
- package/src/data/createTreeData.ts +646 -0
- package/src/data/index.ts +25 -0
- package/src/datepicker/index.ts +32 -0
- package/src/disclosure/createDisclosureState.d.ts +47 -43
- package/src/disclosure/createDisclosureState.ts +9 -23
- package/src/disclosure/index.d.ts +10 -2
- package/src/disclosure/index.ts +1 -1
- package/src/dnd/createDragState.d.ts +51 -42
- package/src/dnd/createDragState.ts +151 -153
- package/src/dnd/createDraggableCollectionState.d.ts +52 -41
- package/src/dnd/createDraggableCollectionState.ts +158 -165
- package/src/dnd/createDropState.d.ts +64 -45
- package/src/dnd/createDropState.ts +202 -212
- package/src/dnd/createDroppableCollectionState.d.ts +88 -59
- package/src/dnd/createDroppableCollectionState.ts +354 -357
- package/src/dnd/index.d.ts +54 -6
- package/src/dnd/index.ts +63 -76
- package/src/dnd/types.d.ts +167 -156
- package/src/dnd/types.ts +316 -317
- package/src/form/createFormValidationState.d.ts +47 -45
- package/src/form/createFormValidationState.ts +356 -389
- package/src/form/index.d.ts +16 -2
- package/src/form/index.ts +15 -15
- package/src/grid/createGridState.d.ts +7 -4
- package/src/grid/createGridState.ts +44 -51
- package/src/grid/index.d.ts +3 -3
- package/src/grid/index.ts +2 -8
- package/src/grid/types.d.ts +136 -129
- package/src/grid/types.ts +24 -17
- package/src/index.d.ts +310 -26
- package/src/index.ts +87 -79
- package/src/menu/index.ts +17 -0
- package/src/numberfield/createNumberFieldState.d.ts +56 -54
- package/src/numberfield/createNumberFieldState.ts +422 -383
- package/src/numberfield/index.d.ts +6 -2
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/createOverlayTriggerState.d.ts +22 -20
- package/src/overlays/createOverlayTriggerState.ts +66 -67
- package/src/overlays/index.d.ts +6 -2
- package/src/overlays/index.ts +5 -5
- package/src/radio/createRadioGroupState.d.ts +54 -52
- package/src/radio/createRadioGroupState.ts +66 -30
- package/src/radio/index.d.ts +7 -2
- package/src/radio/index.ts +1 -1
- package/src/searchfield/createSearchFieldState.d.ts +16 -14
- package/src/searchfield/createSearchFieldState.ts +56 -62
- package/src/searchfield/index.d.ts +3 -3
- package/src/searchfield/index.ts +2 -5
- package/src/select/createSelectState.d.ts +63 -61
- package/src/select/createSelectState.ts +290 -181
- package/src/select/index.d.ts +2 -2
- package/src/select/index.ts +1 -5
- package/src/selection/index.ts +27 -0
- package/src/slider/createSliderState.d.ts +60 -60
- package/src/slider/createSliderState.ts +233 -211
- package/src/slider/index.d.ts +3 -3
- package/src/slider/index.ts +2 -6
- package/src/ssr/index.d.ts +1 -1
- package/src/ssr/index.ts +2 -2
- package/src/steplist/createStepListState.ts +191 -0
- package/src/steplist/index.ts +5 -0
- package/src/table/TableCollection.d.ts +42 -40
- package/src/table/TableCollection.ts +61 -64
- package/src/table/createTableColumnResizeState.ts +242 -0
- package/src/table/createTableState.d.ts +7 -4
- package/src/table/createTableState.ts +10 -7
- package/src/table/index.d.ts +14 -4
- package/src/table/index.ts +10 -3
- package/src/table/types.d.ts +98 -92
- package/src/table/types.ts +17 -13
- package/src/tabs/createTabListState.d.ts +59 -57
- package/src/tabs/createTabListState.ts +58 -39
- package/src/tabs/index.d.ts +8 -2
- package/src/tabs/index.ts +1 -1
- package/src/textfield/createTextFieldState.d.ts +16 -14
- package/src/textfield/createTextFieldState.ts +7 -18
- package/src/textfield/index.d.ts +6 -2
- package/src/textfield/index.ts +1 -1
- package/src/toast/createToastState.d.ts +92 -81
- package/src/toast/createToastState.ts +56 -44
- package/src/toast/index.d.ts +12 -2
- package/src/toast/index.ts +1 -1
- package/src/toggle/createToggleGroupState.ts +117 -0
- package/src/toggle/createToggleState.d.ts +19 -19
- package/src/toggle/createToggleState.ts +2 -16
- package/src/toggle/index.d.ts +2 -2
- package/src/toggle/index.ts +6 -4
- package/src/tooltip/createTooltipTriggerState.d.ts +17 -17
- package/src/tooltip/createTooltipTriggerState.ts +184 -183
- package/src/tooltip/index.d.ts +7 -2
- package/src/tooltip/index.ts +6 -6
- package/src/tree/TreeCollection.d.ts +26 -23
- package/src/tree/TreeCollection.ts +215 -175
- package/src/tree/createTreeState.d.ts +7 -4
- package/src/tree/createTreeState.ts +390 -392
- package/src/tree/index.d.ts +10 -4
- package/src/tree/index.ts +13 -13
- package/src/tree/types.d.ts +131 -126
- package/src/tree/types.ts +183 -174
- package/src/utils/index.d.ts +2 -2
- package/src/utils/index.ts +1 -1
- package/src/utils/reactivity.d.ts +2 -2
- package/src/utils/reactivity.ts +3 -3
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
* Based on @react-stately/toast useToastState
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { createSignal, onCleanup, type Accessor } from
|
|
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?:
|
|
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:
|
|
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
|
|
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 !==
|
|
191
|
+
if (this.hasExitAnimation && toast.animation !== "queued") {
|
|
201
192
|
// Mark as exiting for animation
|
|
202
|
-
|
|
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 !==
|
|
250
|
+
(t) => t.animation !== "queued" && t.animation !== "exiting",
|
|
246
251
|
).length;
|
|
247
252
|
|
|
248
253
|
let promoted = 0;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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 (
|
|
261
|
+
if (nextToast.animation === "queued") return nextToast;
|
|
255
262
|
|
|
256
263
|
// Start timer for visible toasts
|
|
257
|
-
if (
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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>(
|
|
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 };
|
package/src/toast/index.d.ts
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
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
|
package/src/toast/index.ts
CHANGED
|
@@ -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
|
|
9
|
-
import { type MaybeAccessor } from
|
|
8
|
+
import { Accessor } from "solid-js";
|
|
9
|
+
import { type MaybeAccessor } from "../utils";
|
|
10
10
|
export interface ToggleStateOptions {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
10
|
-
import { type MaybeAccessor, access } from
|
|
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) {
|
package/src/toggle/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createToggleState, type ToggleStateOptions, type ToggleState
|
|
2
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
export { createToggleState, type ToggleStateOptions, type ToggleState } from "./createToggleState";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
package/src/toggle/index.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export { createToggleState, type ToggleStateOptions, type ToggleState } from "./createToggleState";
|
|
2
|
+
|
|
1
3
|
export {
|
|
2
|
-
|
|
3
|
-
type
|
|
4
|
-
type
|
|
5
|
-
} from
|
|
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
|
|
9
|
-
import { type OverlayTriggerProps } from
|
|
8
|
+
import { type Accessor } from "solid-js";
|
|
9
|
+
import { type OverlayTriggerProps } from "../overlays";
|
|
10
10
|
export interface TooltipTriggerProps extends OverlayTriggerProps {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|