@proyecto-viviana/solid-stately 0.2.3 → 0.2.7
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/dist/autocomplete/createAutocompleteState.d.ts +2 -1
- package/dist/checkbox/createCheckboxGroupState.d.ts +10 -1
- package/dist/collections/types.d.ts +11 -0
- package/dist/color/getColorChannels.d.ts +20 -0
- package/dist/data/createAsyncList.d.ts +111 -0
- package/dist/data/createListData.d.ts +65 -0
- package/dist/data/createTreeData.d.ts +61 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/datepicker/index.d.ts +10 -0
- package/dist/grid/types.d.ts +5 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +3737 -2697
- package/dist/index.js.map +1 -7
- package/dist/menu/index.d.ts +8 -0
- package/dist/radio/createRadioGroupState.d.ts +10 -1
- package/dist/select/createSelectState.d.ts +17 -0
- package/dist/selection/index.d.ts +11 -0
- package/dist/toast/createToastState.d.ts +7 -1
- package/dist/toggle/createToggleGroupState.d.ts +45 -0
- package/dist/toggle/index.d.ts +1 -0
- package/dist/tree/TreeCollection.d.ts +3 -2
- package/package.json +6 -5
- package/src/autocomplete/createAutocompleteState.ts +10 -11
- package/src/calendar/createDateFieldState.ts +24 -1
- package/src/checkbox/createCheckboxGroupState.ts +42 -6
- package/src/collections/ListCollection.ts +152 -146
- package/src/collections/createListState.ts +266 -264
- package/src/collections/createMenuState.ts +106 -106
- package/src/collections/createSelectionState.ts +336 -336
- package/src/collections/index.ts +46 -46
- package/src/collections/types.ts +181 -169
- package/src/color/Color.ts +951 -951
- package/src/color/createColorAreaState.ts +293 -293
- package/src/color/createColorFieldState.ts +292 -292
- package/src/color/createColorSliderState.ts +241 -241
- package/src/color/createColorWheelState.ts +211 -211
- package/src/color/getColorChannels.ts +34 -0
- package/src/color/index.ts +47 -47
- package/src/color/types.ts +127 -127
- package/src/combobox/createComboBoxState.ts +703 -703
- package/src/combobox/index.ts +13 -13
- package/src/data/createAsyncList.ts +377 -0
- package/src/data/createListData.ts +298 -0
- package/src/data/createTreeData.ts +433 -0
- package/src/data/index.ts +25 -0
- package/src/datepicker/index.ts +36 -0
- package/src/disclosure/createDisclosureState.ts +4 -4
- package/src/dnd/createDragState.ts +153 -153
- package/src/dnd/createDraggableCollectionState.ts +165 -165
- package/src/dnd/createDropState.ts +212 -212
- package/src/dnd/createDroppableCollectionState.ts +357 -357
- package/src/dnd/index.ts +76 -76
- package/src/dnd/types.ts +317 -317
- package/src/form/createFormValidationState.ts +389 -389
- package/src/form/index.ts +15 -15
- package/src/grid/types.ts +5 -0
- package/src/index.ts +49 -0
- package/src/menu/index.ts +19 -0
- package/src/numberfield/createNumberFieldState.ts +427 -383
- package/src/numberfield/index.ts +5 -5
- package/src/overlays/createOverlayTriggerState.ts +67 -67
- package/src/overlays/index.ts +5 -5
- package/src/radio/createRadioGroupState.ts +44 -6
- package/src/searchfield/createSearchFieldState.ts +62 -62
- package/src/searchfield/index.ts +5 -5
- package/src/select/createSelectState.ts +290 -181
- package/src/select/index.ts +5 -5
- package/src/selection/index.ts +28 -0
- package/src/slider/createSliderState.ts +211 -211
- package/src/slider/index.ts +6 -6
- package/src/tabs/createTabListState.ts +37 -11
- package/src/toast/createToastState.d.ts +6 -1
- package/src/toast/createToastState.ts +8 -1
- package/src/toggle/createToggleGroupState.ts +127 -0
- package/src/toggle/index.ts +6 -0
- package/src/tooltip/createTooltipTriggerState.ts +183 -183
- package/src/tooltip/index.ts +6 -6
- package/src/tree/TreeCollection.ts +208 -175
- package/src/tree/createTreeState.ts +392 -392
- package/src/tree/index.ts +13 -13
- package/src/tree/types.ts +174 -174
package/src/numberfield/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
createNumberFieldState,
|
|
3
|
-
type NumberFieldStateProps,
|
|
4
|
-
type NumberFieldState,
|
|
5
|
-
} from './createNumberFieldState';
|
|
1
|
+
export {
|
|
2
|
+
createNumberFieldState,
|
|
3
|
+
type NumberFieldStateProps,
|
|
4
|
+
type NumberFieldState,
|
|
5
|
+
} from './createNumberFieldState';
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages state for an overlay trigger.
|
|
3
|
-
* Based on @react-stately/overlays useOverlayTriggerState.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createSignal, type Accessor } from 'solid-js';
|
|
7
|
-
import { access, type MaybeAccessor } from '../utils';
|
|
8
|
-
|
|
9
|
-
export interface OverlayTriggerProps {
|
|
10
|
-
/** Whether the overlay is open by default (uncontrolled). */
|
|
11
|
-
defaultOpen?: boolean;
|
|
12
|
-
/** Whether the overlay is open (controlled). */
|
|
13
|
-
isOpen?: boolean;
|
|
14
|
-
/** Handler that is called when the overlay's open state changes. */
|
|
15
|
-
onOpenChange?: (isOpen: boolean) => void;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface OverlayTriggerState {
|
|
19
|
-
/** Whether the overlay is currently open. */
|
|
20
|
-
readonly isOpen: Accessor<boolean>;
|
|
21
|
-
/** Sets whether the overlay is open. */
|
|
22
|
-
setOpen(isOpen: boolean): void;
|
|
23
|
-
/** Opens the overlay. */
|
|
24
|
-
open(): void;
|
|
25
|
-
/** Closes the overlay. */
|
|
26
|
-
close(): void;
|
|
27
|
-
/** Toggles the overlay's visibility. */
|
|
28
|
-
toggle(): void;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Manages state for an overlay trigger. Tracks whether the overlay is open, and provides
|
|
33
|
-
* methods to toggle this state.
|
|
34
|
-
*/
|
|
35
|
-
export function createOverlayTriggerState(
|
|
36
|
-
props: MaybeAccessor<OverlayTriggerProps> = {}
|
|
37
|
-
): OverlayTriggerState {
|
|
38
|
-
const propsAccessor = () => access(props);
|
|
39
|
-
|
|
40
|
-
// Use controlled state if isOpen is provided, otherwise use internal state
|
|
41
|
-
const [internalOpen, setInternalOpen] = createSignal(propsAccessor().defaultOpen ?? false);
|
|
42
|
-
|
|
43
|
-
const isOpen: Accessor<boolean> = () => {
|
|
44
|
-
const p = propsAccessor();
|
|
45
|
-
return p.isOpen !== undefined ? p.isOpen : internalOpen();
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const setOpen = (open: boolean) => {
|
|
49
|
-
const p = propsAccessor();
|
|
50
|
-
if (p.isOpen === undefined) {
|
|
51
|
-
setInternalOpen(open);
|
|
52
|
-
}
|
|
53
|
-
p.onOpenChange?.(open);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const open = () => setOpen(true);
|
|
57
|
-
const close = () => setOpen(false);
|
|
58
|
-
const toggle = () => setOpen(!isOpen());
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
isOpen,
|
|
62
|
-
setOpen,
|
|
63
|
-
open,
|
|
64
|
-
close,
|
|
65
|
-
toggle,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Manages state for an overlay trigger.
|
|
3
|
+
* Based on @react-stately/overlays useOverlayTriggerState.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { createSignal, type Accessor } from 'solid-js';
|
|
7
|
+
import { access, type MaybeAccessor } from '../utils';
|
|
8
|
+
|
|
9
|
+
export interface OverlayTriggerProps {
|
|
10
|
+
/** Whether the overlay is open by default (uncontrolled). */
|
|
11
|
+
defaultOpen?: boolean;
|
|
12
|
+
/** Whether the overlay is open (controlled). */
|
|
13
|
+
isOpen?: boolean;
|
|
14
|
+
/** Handler that is called when the overlay's open state changes. */
|
|
15
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface OverlayTriggerState {
|
|
19
|
+
/** Whether the overlay is currently open. */
|
|
20
|
+
readonly isOpen: Accessor<boolean>;
|
|
21
|
+
/** Sets whether the overlay is open. */
|
|
22
|
+
setOpen(isOpen: boolean): void;
|
|
23
|
+
/** Opens the overlay. */
|
|
24
|
+
open(): void;
|
|
25
|
+
/** Closes the overlay. */
|
|
26
|
+
close(): void;
|
|
27
|
+
/** Toggles the overlay's visibility. */
|
|
28
|
+
toggle(): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Manages state for an overlay trigger. Tracks whether the overlay is open, and provides
|
|
33
|
+
* methods to toggle this state.
|
|
34
|
+
*/
|
|
35
|
+
export function createOverlayTriggerState(
|
|
36
|
+
props: MaybeAccessor<OverlayTriggerProps> = {}
|
|
37
|
+
): OverlayTriggerState {
|
|
38
|
+
const propsAccessor = () => access(props);
|
|
39
|
+
|
|
40
|
+
// Use controlled state if isOpen is provided, otherwise use internal state
|
|
41
|
+
const [internalOpen, setInternalOpen] = createSignal(propsAccessor().defaultOpen ?? false);
|
|
42
|
+
|
|
43
|
+
const isOpen: Accessor<boolean> = () => {
|
|
44
|
+
const p = propsAccessor();
|
|
45
|
+
return p.isOpen !== undefined ? p.isOpen : internalOpen();
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const setOpen = (open: boolean) => {
|
|
49
|
+
const p = propsAccessor();
|
|
50
|
+
if (p.isOpen === undefined) {
|
|
51
|
+
setInternalOpen(open);
|
|
52
|
+
}
|
|
53
|
+
p.onOpenChange?.(open);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const open = () => setOpen(true);
|
|
57
|
+
const close = () => setOpen(false);
|
|
58
|
+
const toggle = () => setOpen(!isOpen());
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
isOpen,
|
|
62
|
+
setOpen,
|
|
63
|
+
open,
|
|
64
|
+
close,
|
|
65
|
+
toggle,
|
|
66
|
+
};
|
|
67
|
+
}
|
package/src/overlays/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
createOverlayTriggerState,
|
|
3
|
-
type OverlayTriggerProps,
|
|
4
|
-
type OverlayTriggerState,
|
|
5
|
-
} from './createOverlayTriggerState';
|
|
1
|
+
export {
|
|
2
|
+
createOverlayTriggerState,
|
|
3
|
+
type OverlayTriggerProps,
|
|
4
|
+
type OverlayTriggerState,
|
|
5
|
+
} from './createOverlayTriggerState';
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
import { createSignal, Accessor, untrack } from 'solid-js';
|
|
11
11
|
import { type MaybeAccessor, access } from '../utils';
|
|
12
12
|
import { createId } from '../ssr';
|
|
13
|
+
import {
|
|
14
|
+
createFormValidationState,
|
|
15
|
+
type FormValidationState,
|
|
16
|
+
type ValidationFunction,
|
|
17
|
+
type ValidationResult,
|
|
18
|
+
} from '../form';
|
|
13
19
|
|
|
14
20
|
// ============================================
|
|
15
21
|
// TYPES
|
|
@@ -44,9 +50,15 @@ export interface RadioGroupProps {
|
|
|
44
50
|
onBlur?: (e: FocusEvent) => void;
|
|
45
51
|
/** Handler that is called when the radio group's focus status changes. */
|
|
46
52
|
onFocusChange?: (isFocused: boolean) => void;
|
|
53
|
+
/** Backward-compatible controlled validation state. */
|
|
54
|
+
validationState?: 'valid' | 'invalid';
|
|
55
|
+
/** Custom validation function. */
|
|
56
|
+
validate?: ValidationFunction<string | null>;
|
|
57
|
+
/** Validation behavior for the radio group. */
|
|
58
|
+
validationBehavior?: 'aria' | 'native';
|
|
47
59
|
}
|
|
48
60
|
|
|
49
|
-
export interface RadioGroupState {
|
|
61
|
+
export interface RadioGroupState extends Pick<FormValidationState, 'realtimeValidation' | 'displayValidation' | 'updateValidation' | 'resetValidation' | 'commitValidation'> {
|
|
50
62
|
/** The name for the group, used for native form submission. */
|
|
51
63
|
readonly name: string;
|
|
52
64
|
|
|
@@ -76,6 +88,9 @@ export interface RadioGroupState {
|
|
|
76
88
|
|
|
77
89
|
/** Sets the last focused value. */
|
|
78
90
|
setLastFocusedValue(value: string | null): void;
|
|
91
|
+
|
|
92
|
+
/** Current display validation result for the group. */
|
|
93
|
+
readonly displayValidation: Accessor<ValidationResult>;
|
|
79
94
|
}
|
|
80
95
|
|
|
81
96
|
// ============================================
|
|
@@ -139,10 +154,26 @@ export function createRadioGroupState(
|
|
|
139
154
|
return internalValue();
|
|
140
155
|
};
|
|
141
156
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
157
|
+
const validation = createFormValidationState<string | null>({
|
|
158
|
+
get value() {
|
|
159
|
+
return selectedValue();
|
|
160
|
+
},
|
|
161
|
+
get isInvalid() {
|
|
162
|
+
return getProps().isInvalid;
|
|
163
|
+
},
|
|
164
|
+
get validationState() {
|
|
165
|
+
return getProps().validationState;
|
|
166
|
+
},
|
|
167
|
+
get validate() {
|
|
168
|
+
return getProps().validate;
|
|
169
|
+
},
|
|
170
|
+
get validationBehavior() {
|
|
171
|
+
return getProps().validationBehavior ?? 'aria';
|
|
172
|
+
},
|
|
173
|
+
get name() {
|
|
174
|
+
return getProps().name;
|
|
175
|
+
},
|
|
176
|
+
});
|
|
146
177
|
|
|
147
178
|
// Set value
|
|
148
179
|
function setSelectedValue(value: string | null): void {
|
|
@@ -165,6 +196,8 @@ export function createRadioGroupState(
|
|
|
165
196
|
if (value != null) {
|
|
166
197
|
p.onChange?.(value);
|
|
167
198
|
}
|
|
199
|
+
|
|
200
|
+
validation.commitValidation();
|
|
168
201
|
}
|
|
169
202
|
|
|
170
203
|
// Set last focused value
|
|
@@ -179,6 +212,11 @@ export function createRadioGroupState(
|
|
|
179
212
|
setSelectedValue,
|
|
180
213
|
lastFocusedValue,
|
|
181
214
|
setLastFocusedValue,
|
|
215
|
+
realtimeValidation: validation.realtimeValidation,
|
|
216
|
+
displayValidation: validation.displayValidation,
|
|
217
|
+
updateValidation: validation.updateValidation,
|
|
218
|
+
resetValidation: validation.resetValidation,
|
|
219
|
+
commitValidation: validation.commitValidation,
|
|
182
220
|
get isDisabled() {
|
|
183
221
|
return getProps().isDisabled ?? false;
|
|
184
222
|
},
|
|
@@ -189,7 +227,7 @@ export function createRadioGroupState(
|
|
|
189
227
|
return getProps().isRequired ?? false;
|
|
190
228
|
},
|
|
191
229
|
get isInvalid() {
|
|
192
|
-
return
|
|
230
|
+
return validation.displayValidation().isInvalid;
|
|
193
231
|
},
|
|
194
232
|
};
|
|
195
233
|
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates state for a search field component.
|
|
3
|
-
* Based on @react-stately/searchfield useSearchFieldState.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { type Accessor, createSignal, createMemo } from 'solid-js';
|
|
7
|
-
import { access, type MaybeAccessor } from '../utils';
|
|
8
|
-
|
|
9
|
-
export interface SearchFieldStateProps {
|
|
10
|
-
/** The current value (controlled). */
|
|
11
|
-
value?: string;
|
|
12
|
-
/** The default value (uncontrolled). */
|
|
13
|
-
defaultValue?: string;
|
|
14
|
-
/** Handler that is called when the value changes. */
|
|
15
|
-
onChange?: (value: string) => void;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface SearchFieldState {
|
|
19
|
-
/** The current value of the search field. */
|
|
20
|
-
value: Accessor<string>;
|
|
21
|
-
/** Sets the value of the search field. */
|
|
22
|
-
setValue: (value: string) => void;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Provides state management for a search field.
|
|
27
|
-
*/
|
|
28
|
-
export function createSearchFieldState(
|
|
29
|
-
props: MaybeAccessor<SearchFieldStateProps>
|
|
30
|
-
): SearchFieldState {
|
|
31
|
-
const getProps = () => access(props);
|
|
32
|
-
|
|
33
|
-
// Controlled vs uncontrolled
|
|
34
|
-
const isControlled = () => getProps().value !== undefined;
|
|
35
|
-
|
|
36
|
-
// Internal signal for uncontrolled mode
|
|
37
|
-
const [internalValue, setInternalValue] = createSignal(
|
|
38
|
-
getProps().defaultValue ?? ''
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
// Current value accessor
|
|
42
|
-
const value = createMemo(() => {
|
|
43
|
-
const p = getProps();
|
|
44
|
-
return isControlled() ? (p.value ?? '') : internalValue();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// Set value function
|
|
48
|
-
const setValue = (newValue: string) => {
|
|
49
|
-
const p = getProps();
|
|
50
|
-
|
|
51
|
-
if (!isControlled()) {
|
|
52
|
-
setInternalValue(newValue);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
p.onChange?.(newValue);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
value,
|
|
60
|
-
setValue,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Creates state for a search field component.
|
|
3
|
+
* Based on @react-stately/searchfield useSearchFieldState.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { type Accessor, createSignal, createMemo } from 'solid-js';
|
|
7
|
+
import { access, type MaybeAccessor } from '../utils';
|
|
8
|
+
|
|
9
|
+
export interface SearchFieldStateProps {
|
|
10
|
+
/** The current value (controlled). */
|
|
11
|
+
value?: string;
|
|
12
|
+
/** The default value (uncontrolled). */
|
|
13
|
+
defaultValue?: string;
|
|
14
|
+
/** Handler that is called when the value changes. */
|
|
15
|
+
onChange?: (value: string) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface SearchFieldState {
|
|
19
|
+
/** The current value of the search field. */
|
|
20
|
+
value: Accessor<string>;
|
|
21
|
+
/** Sets the value of the search field. */
|
|
22
|
+
setValue: (value: string) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Provides state management for a search field.
|
|
27
|
+
*/
|
|
28
|
+
export function createSearchFieldState(
|
|
29
|
+
props: MaybeAccessor<SearchFieldStateProps>
|
|
30
|
+
): SearchFieldState {
|
|
31
|
+
const getProps = () => access(props);
|
|
32
|
+
|
|
33
|
+
// Controlled vs uncontrolled
|
|
34
|
+
const isControlled = () => getProps().value !== undefined;
|
|
35
|
+
|
|
36
|
+
// Internal signal for uncontrolled mode
|
|
37
|
+
const [internalValue, setInternalValue] = createSignal(
|
|
38
|
+
getProps().defaultValue ?? ''
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
// Current value accessor
|
|
42
|
+
const value = createMemo(() => {
|
|
43
|
+
const p = getProps();
|
|
44
|
+
return isControlled() ? (p.value ?? '') : internalValue();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Set value function
|
|
48
|
+
const setValue = (newValue: string) => {
|
|
49
|
+
const p = getProps();
|
|
50
|
+
|
|
51
|
+
if (!isControlled()) {
|
|
52
|
+
setInternalValue(newValue);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
p.onChange?.(newValue);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
value,
|
|
60
|
+
setValue,
|
|
61
|
+
};
|
|
62
|
+
}
|
package/src/searchfield/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createSearchFieldState } from './createSearchFieldState';
|
|
2
|
-
export type {
|
|
3
|
-
SearchFieldState,
|
|
4
|
-
SearchFieldStateProps,
|
|
5
|
-
} from './createSearchFieldState';
|
|
1
|
+
export { createSearchFieldState } from './createSearchFieldState';
|
|
2
|
+
export type {
|
|
3
|
+
SearchFieldState,
|
|
4
|
+
SearchFieldStateProps,
|
|
5
|
+
} from './createSearchFieldState';
|