@proyecto-viviana/solid-stately 0.2.4 → 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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/autocomplete/createAutocompleteState.d.ts +2 -1
  3. package/dist/checkbox/createCheckboxGroupState.d.ts +10 -1
  4. package/dist/collections/types.d.ts +11 -0
  5. package/dist/color/getColorChannels.d.ts +20 -0
  6. package/dist/data/createAsyncList.d.ts +111 -0
  7. package/dist/data/createListData.d.ts +65 -0
  8. package/dist/data/createTreeData.d.ts +61 -0
  9. package/dist/data/index.d.ts +3 -0
  10. package/dist/datepicker/index.d.ts +10 -0
  11. package/dist/grid/types.d.ts +5 -1
  12. package/dist/index.d.ts +6 -1
  13. package/dist/index.js +3737 -2697
  14. package/dist/index.js.map +1 -7
  15. package/dist/menu/index.d.ts +8 -0
  16. package/dist/radio/createRadioGroupState.d.ts +10 -1
  17. package/dist/select/createSelectState.d.ts +17 -0
  18. package/dist/selection/index.d.ts +11 -0
  19. package/dist/toast/createToastState.d.ts +7 -1
  20. package/dist/toggle/createToggleGroupState.d.ts +45 -0
  21. package/dist/toggle/index.d.ts +1 -0
  22. package/dist/tree/TreeCollection.d.ts +3 -2
  23. package/package.json +6 -5
  24. package/src/autocomplete/createAutocompleteState.ts +10 -11
  25. package/src/calendar/createDateFieldState.ts +24 -1
  26. package/src/checkbox/createCheckboxGroupState.ts +42 -6
  27. package/src/collections/ListCollection.ts +152 -146
  28. package/src/collections/createListState.ts +266 -264
  29. package/src/collections/createMenuState.ts +106 -106
  30. package/src/collections/createSelectionState.ts +336 -336
  31. package/src/collections/index.ts +46 -46
  32. package/src/collections/types.ts +181 -169
  33. package/src/color/Color.ts +951 -951
  34. package/src/color/createColorAreaState.ts +293 -293
  35. package/src/color/createColorFieldState.ts +292 -292
  36. package/src/color/createColorSliderState.ts +241 -241
  37. package/src/color/createColorWheelState.ts +211 -211
  38. package/src/color/getColorChannels.ts +34 -0
  39. package/src/color/index.ts +47 -47
  40. package/src/color/types.ts +127 -127
  41. package/src/combobox/createComboBoxState.ts +703 -703
  42. package/src/combobox/index.ts +13 -13
  43. package/src/data/createAsyncList.ts +377 -0
  44. package/src/data/createListData.ts +298 -0
  45. package/src/data/createTreeData.ts +433 -0
  46. package/src/data/index.ts +25 -0
  47. package/src/datepicker/index.ts +36 -0
  48. package/src/disclosure/createDisclosureState.ts +4 -4
  49. package/src/dnd/createDragState.ts +153 -153
  50. package/src/dnd/createDraggableCollectionState.ts +165 -165
  51. package/src/dnd/createDropState.ts +212 -212
  52. package/src/dnd/createDroppableCollectionState.ts +357 -357
  53. package/src/dnd/index.ts +76 -76
  54. package/src/dnd/types.ts +317 -317
  55. package/src/form/createFormValidationState.ts +389 -389
  56. package/src/form/index.ts +15 -15
  57. package/src/grid/types.ts +5 -0
  58. package/src/index.ts +49 -0
  59. package/src/menu/index.ts +19 -0
  60. package/src/numberfield/createNumberFieldState.ts +427 -383
  61. package/src/numberfield/index.ts +5 -5
  62. package/src/overlays/createOverlayTriggerState.ts +67 -67
  63. package/src/overlays/index.ts +5 -5
  64. package/src/radio/createRadioGroupState.ts +44 -6
  65. package/src/searchfield/createSearchFieldState.ts +62 -62
  66. package/src/searchfield/index.ts +5 -5
  67. package/src/select/createSelectState.ts +290 -181
  68. package/src/select/index.ts +5 -5
  69. package/src/selection/index.ts +28 -0
  70. package/src/slider/createSliderState.ts +211 -211
  71. package/src/slider/index.ts +6 -6
  72. package/src/tabs/createTabListState.ts +37 -11
  73. package/src/toast/createToastState.d.ts +6 -1
  74. package/src/toast/createToastState.ts +8 -1
  75. package/src/toggle/createToggleGroupState.ts +127 -0
  76. package/src/toggle/index.ts +6 -0
  77. package/src/tooltip/createTooltipTriggerState.ts +183 -183
  78. package/src/tooltip/index.ts +6 -6
  79. package/src/tree/TreeCollection.ts +208 -175
  80. package/src/tree/createTreeState.ts +392 -392
  81. package/src/tree/index.ts +13 -13
  82. package/src/tree/types.ts +174 -174
@@ -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
+ }
@@ -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
- // Check if invalid
143
- const isInvalid = () => {
144
- return getProps().isInvalid ?? false;
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 isInvalid();
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
+ }
@@ -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';