@proyecto-viviana/solid-stately 0.0.5 → 0.1.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 (208) hide show
  1. package/README.md +312 -0
  2. package/dist/index.d.ts +3363 -6
  3. package/dist/index.js +6194 -19
  4. package/dist/index.js.map +1 -1
  5. package/package.json +52 -48
  6. package/src/autocomplete/createAutocompleteState.d.ts +46 -0
  7. package/src/autocomplete/createAutocompleteState.d.ts.map +1 -0
  8. package/src/autocomplete/createAutocompleteState.ts +90 -0
  9. package/src/autocomplete/index.d.ts +2 -0
  10. package/src/autocomplete/index.d.ts.map +1 -0
  11. package/src/autocomplete/index.ts +5 -0
  12. package/src/calendar/createCalendarState.d.ts +130 -0
  13. package/src/calendar/createCalendarState.d.ts.map +1 -0
  14. package/src/calendar/createCalendarState.ts +461 -0
  15. package/src/calendar/createDateFieldState.d.ts +110 -0
  16. package/src/calendar/createDateFieldState.d.ts.map +1 -0
  17. package/src/calendar/createDateFieldState.ts +562 -0
  18. package/src/calendar/createRangeCalendarState.d.ts +146 -0
  19. package/src/calendar/createRangeCalendarState.d.ts.map +1 -0
  20. package/src/calendar/createRangeCalendarState.ts +535 -0
  21. package/src/calendar/createTimeFieldState.d.ts +95 -0
  22. package/src/calendar/createTimeFieldState.d.ts.map +1 -0
  23. package/src/calendar/createTimeFieldState.ts +483 -0
  24. package/src/calendar/index.d.ts +7 -0
  25. package/src/calendar/index.d.ts.map +1 -0
  26. package/src/calendar/index.ts +81 -0
  27. package/{dist → src}/checkbox/createCheckboxGroupState.d.ts +1 -0
  28. package/src/checkbox/createCheckboxGroupState.d.ts.map +1 -0
  29. package/{dist → src}/checkbox/index.d.ts +1 -0
  30. package/src/checkbox/index.d.ts.map +1 -0
  31. package/src/collections/ListCollection.d.ts +37 -0
  32. package/src/collections/ListCollection.d.ts.map +1 -0
  33. package/src/collections/ListCollection.ts +146 -0
  34. package/src/collections/createListState.d.ts +79 -0
  35. package/src/collections/createListState.d.ts.map +1 -0
  36. package/src/collections/createListState.ts +264 -0
  37. package/src/collections/createMenuState.d.ts +50 -0
  38. package/src/collections/createMenuState.d.ts.map +1 -0
  39. package/src/collections/createMenuState.ts +106 -0
  40. package/src/collections/createSelectionState.d.ts +76 -0
  41. package/src/collections/createSelectionState.d.ts.map +1 -0
  42. package/src/collections/createSelectionState.ts +336 -0
  43. package/src/collections/index.d.ts +6 -0
  44. package/src/collections/index.d.ts.map +1 -0
  45. package/src/collections/index.ts +46 -0
  46. package/src/collections/types.d.ts +147 -0
  47. package/src/collections/types.d.ts.map +1 -0
  48. package/src/collections/types.ts +169 -0
  49. package/src/color/Color.d.ts +28 -0
  50. package/src/color/Color.d.ts.map +1 -0
  51. package/src/color/Color.ts +951 -0
  52. package/src/color/createColorAreaState.d.ts +76 -0
  53. package/src/color/createColorAreaState.d.ts.map +1 -0
  54. package/src/color/createColorAreaState.ts +293 -0
  55. package/src/color/createColorFieldState.d.ts +55 -0
  56. package/src/color/createColorFieldState.d.ts.map +1 -0
  57. package/src/color/createColorFieldState.ts +292 -0
  58. package/src/color/createColorSliderState.d.ts +67 -0
  59. package/src/color/createColorSliderState.d.ts.map +1 -0
  60. package/src/color/createColorSliderState.ts +241 -0
  61. package/src/color/createColorWheelState.d.ts +51 -0
  62. package/src/color/createColorWheelState.d.ts.map +1 -0
  63. package/src/color/createColorWheelState.ts +211 -0
  64. package/src/color/index.d.ts +10 -0
  65. package/src/color/index.d.ts.map +1 -0
  66. package/src/color/index.ts +47 -0
  67. package/src/color/types.d.ts +106 -0
  68. package/src/color/types.d.ts.map +1 -0
  69. package/src/color/types.ts +127 -0
  70. package/src/combobox/createComboBoxState.d.ts +125 -0
  71. package/src/combobox/createComboBoxState.d.ts.map +1 -0
  72. package/src/combobox/createComboBoxState.ts +703 -0
  73. package/src/combobox/index.d.ts +5 -0
  74. package/src/combobox/index.d.ts.map +1 -0
  75. package/src/combobox/index.ts +13 -0
  76. package/src/disclosure/createDisclosureState.d.ts +64 -0
  77. package/src/disclosure/createDisclosureState.d.ts.map +1 -0
  78. package/src/disclosure/createDisclosureState.ts +193 -0
  79. package/src/disclosure/index.d.ts +2 -0
  80. package/src/disclosure/index.d.ts.map +1 -0
  81. package/src/disclosure/index.ts +9 -0
  82. package/src/dnd/createDragState.d.ts +59 -0
  83. package/src/dnd/createDragState.d.ts.map +1 -0
  84. package/src/dnd/createDragState.ts +153 -0
  85. package/src/dnd/createDraggableCollectionState.d.ts +57 -0
  86. package/src/dnd/createDraggableCollectionState.d.ts.map +1 -0
  87. package/src/dnd/createDraggableCollectionState.ts +165 -0
  88. package/src/dnd/createDropState.d.ts +61 -0
  89. package/src/dnd/createDropState.d.ts.map +1 -0
  90. package/src/dnd/createDropState.ts +212 -0
  91. package/src/dnd/createDroppableCollectionState.d.ts +78 -0
  92. package/src/dnd/createDroppableCollectionState.d.ts.map +1 -0
  93. package/src/dnd/createDroppableCollectionState.ts +357 -0
  94. package/src/dnd/index.d.ts +11 -0
  95. package/src/dnd/index.d.ts.map +1 -0
  96. package/src/dnd/index.ts +76 -0
  97. package/src/dnd/types.d.ts +264 -0
  98. package/src/dnd/types.d.ts.map +1 -0
  99. package/src/dnd/types.ts +317 -0
  100. package/src/form/createFormValidationState.d.ts +100 -0
  101. package/src/form/createFormValidationState.d.ts.map +1 -0
  102. package/src/form/createFormValidationState.ts +389 -0
  103. package/src/form/index.d.ts +2 -0
  104. package/src/form/index.d.ts.map +1 -0
  105. package/src/form/index.ts +15 -0
  106. package/src/grid/createGridState.d.ts +12 -0
  107. package/src/grid/createGridState.d.ts.map +1 -0
  108. package/src/grid/createGridState.ts +327 -0
  109. package/src/grid/index.d.ts +7 -0
  110. package/src/grid/index.d.ts.map +1 -0
  111. package/src/grid/index.ts +13 -0
  112. package/src/grid/types.d.ts +156 -0
  113. package/src/grid/types.d.ts.map +1 -0
  114. package/src/grid/types.ts +179 -0
  115. package/src/index.d.ts +26 -0
  116. package/src/index.d.ts.map +1 -0
  117. package/src/index.ts +350 -1
  118. package/src/numberfield/createNumberFieldState.d.ts +65 -0
  119. package/src/numberfield/createNumberFieldState.d.ts.map +1 -0
  120. package/src/numberfield/createNumberFieldState.ts +383 -0
  121. package/src/numberfield/index.d.ts +2 -0
  122. package/src/numberfield/index.d.ts.map +1 -0
  123. package/src/numberfield/index.ts +5 -0
  124. package/src/overlays/createOverlayTriggerState.d.ts +32 -0
  125. package/src/overlays/createOverlayTriggerState.d.ts.map +1 -0
  126. package/src/overlays/createOverlayTriggerState.ts +67 -0
  127. package/src/overlays/index.d.ts +2 -0
  128. package/src/overlays/index.d.ts.map +1 -0
  129. package/src/overlays/index.ts +5 -0
  130. package/{dist → src}/radio/createRadioGroupState.d.ts +1 -0
  131. package/src/radio/createRadioGroupState.d.ts.map +1 -0
  132. package/{dist → src}/radio/index.d.ts +1 -0
  133. package/src/radio/index.d.ts.map +1 -0
  134. package/src/searchfield/createSearchFieldState.d.ts +25 -0
  135. package/src/searchfield/createSearchFieldState.d.ts.map +1 -0
  136. package/src/searchfield/createSearchFieldState.ts +62 -0
  137. package/src/searchfield/index.d.ts +3 -0
  138. package/src/searchfield/index.d.ts.map +1 -0
  139. package/src/searchfield/index.ts +5 -0
  140. package/src/select/createSelectState.d.ts +73 -0
  141. package/src/select/createSelectState.d.ts.map +1 -0
  142. package/src/select/createSelectState.ts +181 -0
  143. package/src/select/index.d.ts +2 -0
  144. package/src/select/index.d.ts.map +1 -0
  145. package/src/select/index.ts +5 -0
  146. package/src/slider/createSliderState.d.ts +72 -0
  147. package/src/slider/createSliderState.d.ts.map +1 -0
  148. package/src/slider/createSliderState.ts +211 -0
  149. package/src/slider/index.d.ts +3 -0
  150. package/src/slider/index.d.ts.map +1 -0
  151. package/src/slider/index.ts +6 -0
  152. package/{dist → src}/ssr/index.d.ts +5 -0
  153. package/src/ssr/index.d.ts.map +1 -0
  154. package/src/ssr/index.ts +6 -1
  155. package/src/table/TableCollection.d.ts +52 -0
  156. package/src/table/TableCollection.d.ts.map +1 -0
  157. package/src/table/TableCollection.ts +388 -0
  158. package/src/table/createTableState.d.ts +12 -0
  159. package/src/table/createTableState.d.ts.map +1 -0
  160. package/src/table/createTableState.ts +127 -0
  161. package/src/table/index.d.ts +8 -0
  162. package/src/table/index.d.ts.map +1 -0
  163. package/src/table/index.ts +18 -0
  164. package/src/table/types.d.ts +139 -0
  165. package/src/table/types.d.ts.map +1 -0
  166. package/src/table/types.ts +150 -0
  167. package/src/tabs/createTabListState.d.ts +68 -0
  168. package/src/tabs/createTabListState.d.ts.map +1 -0
  169. package/src/tabs/createTabListState.ts +240 -0
  170. package/src/tabs/index.d.ts +2 -0
  171. package/src/tabs/index.d.ts.map +1 -0
  172. package/src/tabs/index.ts +7 -0
  173. package/{dist → src}/textfield/createTextFieldState.d.ts +1 -0
  174. package/src/textfield/createTextFieldState.d.ts.map +1 -0
  175. package/{dist → src}/textfield/index.d.ts +1 -0
  176. package/src/textfield/index.d.ts.map +1 -0
  177. package/src/toast/createToastState.d.ts +118 -0
  178. package/src/toast/createToastState.d.ts.map +1 -0
  179. package/src/toast/createToastState.ts +316 -0
  180. package/src/toast/index.d.ts +2 -0
  181. package/src/toast/index.d.ts.map +1 -0
  182. package/src/toast/index.ts +11 -0
  183. package/{dist → src}/toggle/createToggleState.d.ts +1 -0
  184. package/src/toggle/createToggleState.d.ts.map +1 -0
  185. package/{dist → src}/toggle/index.d.ts +1 -0
  186. package/src/toggle/index.d.ts.map +1 -0
  187. package/src/tooltip/createTooltipTriggerState.d.ts +39 -0
  188. package/src/tooltip/createTooltipTriggerState.d.ts.map +1 -0
  189. package/src/tooltip/createTooltipTriggerState.ts +183 -0
  190. package/src/tooltip/index.d.ts +2 -0
  191. package/src/tooltip/index.d.ts.map +1 -0
  192. package/src/tooltip/index.ts +6 -0
  193. package/src/tree/TreeCollection.d.ts +40 -0
  194. package/src/tree/TreeCollection.d.ts.map +1 -0
  195. package/src/tree/TreeCollection.ts +175 -0
  196. package/src/tree/createTreeState.d.ts +14 -0
  197. package/src/tree/createTreeState.d.ts.map +1 -0
  198. package/src/tree/createTreeState.ts +392 -0
  199. package/src/tree/index.d.ts +7 -0
  200. package/src/tree/index.d.ts.map +1 -0
  201. package/src/tree/index.ts +13 -0
  202. package/src/tree/types.d.ts +157 -0
  203. package/src/tree/types.d.ts.map +1 -0
  204. package/src/tree/types.ts +174 -0
  205. package/{dist → src}/utils/index.d.ts +1 -0
  206. package/src/utils/index.d.ts.map +1 -0
  207. package/{dist → src}/utils/reactivity.d.ts +1 -0
  208. package/src/utils/reactivity.d.ts.map +1 -0
package/README.md ADDED
@@ -0,0 +1,312 @@
1
+ # @proyecto-viviana/solid-stately
2
+
3
+ A SolidJS port of [React Stately](https://react-spectrum.adobe.com/react-stately/) - headless state management for UI components.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add @proyecto-viviana/solid-stately solid-js
9
+ ```
10
+
11
+ ## Overview
12
+
13
+ solid-stately provides state management hooks that handle the complex logic for UI components like toggles, selections, overlays, and collections. These hooks return reactive state and update functions that you can use with any UI.
14
+
15
+ This package is the foundation layer of the Proyecto Viviana component library, providing the state logic that powers the accessibility hooks in `@proyecto-viviana/solidaria`.
16
+
17
+ ## Available Hooks
18
+
19
+ ### Toggle & Selection
20
+
21
+ | Hook | Description |
22
+ |------|-------------|
23
+ | `createToggleState` | Boolean toggle state for checkboxes, switches |
24
+ | `createCheckboxGroupState` | Multi-selection checkbox group |
25
+ | `createRadioGroupState` | Single-selection radio group |
26
+
27
+ ### Overlays
28
+
29
+ | Hook | Description |
30
+ |------|-------------|
31
+ | `createOverlayTriggerState` | Open/close state for modals, popovers, menus |
32
+
33
+ ### Collections & Lists
34
+
35
+ | Hook | Description |
36
+ |------|-------------|
37
+ | `createListState` | List with selection and keyboard focus |
38
+ | `createSingleSelectListState` | Single-selection list (e.g., for select dropdowns) |
39
+ | `createSelectionState` | Low-level selection management |
40
+ | `createMenuState` | Menu state with action support |
41
+ | `createMenuTriggerState` | Menu trigger open/close state |
42
+ | `createSelectState` | Select dropdown state |
43
+ | `ListCollection` | Collection data structure for lists |
44
+ | `createListCollection` | Create a list collection from items |
45
+
46
+ ### Navigation
47
+
48
+ | Hook | Description |
49
+ |------|-------------|
50
+ | `createTabListState` | Tab navigation state with keyboard support |
51
+
52
+ ### Form Controls
53
+
54
+ | Hook | Description |
55
+ |------|-------------|
56
+ | `createTextFieldState` | Text input state |
57
+ | `createNumberFieldState` | Numeric input with validation |
58
+ | `createSearchFieldState` | Search input with clear functionality |
59
+ | `createSliderState` | Range slider state |
60
+ | `createFormValidationState` | Form validation state with realtime/native modes |
61
+
62
+ ### Grid & Table
63
+
64
+ | Hook | Description |
65
+ |------|-------------|
66
+ | `createGridState` | Grid state with keyboard navigation |
67
+ | `createTableState` | Table state with sorting and selection |
68
+ | `TableCollection` | Collection data structure for tables |
69
+
70
+ ### Tree
71
+
72
+ | Hook | Description |
73
+ |------|-------------|
74
+ | `createTreeState` | Tree state with expand/collapse |
75
+ | `TreeCollection` | Collection data structure for trees |
76
+
77
+ ### Color
78
+
79
+ | Hook | Description |
80
+ |------|-------------|
81
+ | `createColorSliderState` | Color channel slider state |
82
+ | `createColorAreaState` | 2D color area picker state |
83
+ | `createColorWheelState` | Circular hue wheel state |
84
+ | `createColorFieldState` | Color text input state |
85
+
86
+ ### Drag & Drop
87
+
88
+ | Hook | Description |
89
+ |------|-------------|
90
+ | `createDragState` | Drag operation state |
91
+ | `createDropState` | Drop target state |
92
+ | `createDraggableCollectionState` | Collection-level drag state |
93
+ | `createDroppableCollectionState` | Collection-level drop state |
94
+
95
+ ### Utilities
96
+
97
+ | Hook | Description |
98
+ |------|-------------|
99
+ | `createId` | Generate unique IDs (SSR-safe) |
100
+ | `createIsSSR` | Detect server-side rendering |
101
+ | `canUseDOM` | Check if DOM is available |
102
+
103
+ ## Usage Examples
104
+
105
+ ### Toggle State
106
+
107
+ ```tsx
108
+ import { createToggleState } from '@proyecto-viviana/solid-stately';
109
+
110
+ function Checkbox(props) {
111
+ const state = createToggleState({
112
+ isSelected: props.isSelected,
113
+ defaultSelected: props.defaultSelected,
114
+ onChange: props.onChange,
115
+ });
116
+
117
+ return (
118
+ <label>
119
+ <input
120
+ type="checkbox"
121
+ checked={state.isSelected()}
122
+ onChange={() => state.toggle()}
123
+ />
124
+ {props.children}
125
+ </label>
126
+ );
127
+ }
128
+ ```
129
+
130
+ ### List State with Selection
131
+
132
+ ```tsx
133
+ import { createListState } from '@proyecto-viviana/solid-stately';
134
+
135
+ function ListBox(props) {
136
+ const state = createListState({
137
+ items: props.items,
138
+ getKey: (item) => item.id,
139
+ getTextValue: (item) => item.name,
140
+ selectionMode: 'single',
141
+ onSelectionChange: props.onSelectionChange,
142
+ });
143
+
144
+ return (
145
+ <ul>
146
+ <For each={props.items}>
147
+ {(item) => {
148
+ const key = item.id;
149
+ const isSelected = () => state.selectionManager.isSelected(key);
150
+
151
+ return (
152
+ <li
153
+ onClick={() => state.selectionManager.toggleSelection(key)}
154
+ style={{ background: isSelected() ? 'blue' : 'white' }}
155
+ >
156
+ {item.name}
157
+ </li>
158
+ );
159
+ }}
160
+ </For>
161
+ </ul>
162
+ );
163
+ }
164
+ ```
165
+
166
+ ### Overlay State
167
+
168
+ ```tsx
169
+ import { createOverlayTriggerState } from '@proyecto-viviana/solid-stately';
170
+
171
+ function Modal(props) {
172
+ const state = createOverlayTriggerState({
173
+ isOpen: props.isOpen,
174
+ defaultOpen: props.defaultOpen,
175
+ onOpenChange: props.onOpenChange,
176
+ });
177
+
178
+ return (
179
+ <>
180
+ <button onClick={() => state.open()}>Open Modal</button>
181
+ <Show when={state.isOpen()}>
182
+ <div class="modal">
183
+ {props.children}
184
+ <button onClick={() => state.close()}>Close</button>
185
+ </div>
186
+ </Show>
187
+ </>
188
+ );
189
+ }
190
+ ```
191
+
192
+ ### Tab State
193
+
194
+ ```tsx
195
+ import { createTabListState } from '@proyecto-viviana/solid-stately';
196
+
197
+ function Tabs(props) {
198
+ const state = createTabListState({
199
+ items: props.tabs,
200
+ getKey: (tab) => tab.id,
201
+ selectedKey: props.selectedKey,
202
+ onSelectionChange: props.onSelectionChange,
203
+ });
204
+
205
+ return (
206
+ <div>
207
+ <div role="tablist">
208
+ <For each={props.tabs}>
209
+ {(tab) => (
210
+ <button
211
+ role="tab"
212
+ aria-selected={state.selectedKey() === tab.id}
213
+ onClick={() => state.setSelectedKey(tab.id)}
214
+ >
215
+ {tab.label}
216
+ </button>
217
+ )}
218
+ </For>
219
+ </div>
220
+ <div role="tabpanel">
221
+ {props.tabs.find(t => t.id === state.selectedKey())?.content}
222
+ </div>
223
+ </div>
224
+ );
225
+ }
226
+ ```
227
+
228
+ ### Slider State
229
+
230
+ ```tsx
231
+ import { createSliderState } from '@proyecto-viviana/solid-stately';
232
+
233
+ function Slider(props) {
234
+ const state = createSliderState({
235
+ value: props.value,
236
+ defaultValue: props.defaultValue ?? 50,
237
+ minValue: props.minValue ?? 0,
238
+ maxValue: props.maxValue ?? 100,
239
+ step: props.step ?? 1,
240
+ onChange: props.onChange,
241
+ });
242
+
243
+ const percent = () => state.getValuePercent() * 100;
244
+
245
+ return (
246
+ <div>
247
+ <input
248
+ type="range"
249
+ min={state.minValue}
250
+ max={state.maxValue}
251
+ step={state.step}
252
+ value={state.value()}
253
+ onInput={(e) => state.setValue(parseFloat(e.target.value))}
254
+ />
255
+ <span>{state.getFormattedValue()}</span>
256
+ </div>
257
+ );
258
+ }
259
+ ```
260
+
261
+ ## Key Concepts
262
+
263
+ ### Controlled vs Uncontrolled
264
+
265
+ All state hooks support both controlled and uncontrolled patterns:
266
+
267
+ ```tsx
268
+ // Uncontrolled - uses internal state
269
+ const state = createToggleState({
270
+ defaultSelected: false,
271
+ onChange: (isSelected) => console.log('Changed:', isSelected),
272
+ });
273
+
274
+ // Controlled - uses external state
275
+ const [isSelected, setIsSelected] = createSignal(false);
276
+ const state = createToggleState({
277
+ isSelected: isSelected(),
278
+ onChange: setIsSelected,
279
+ });
280
+ ```
281
+
282
+ ### MaybeAccessor Pattern
283
+
284
+ Props can be passed as values or accessors for reactive updates:
285
+
286
+ ```tsx
287
+ // Static value
288
+ createToggleState({ defaultSelected: true });
289
+
290
+ // Reactive accessor
291
+ createToggleState({
292
+ get isDisabled() { return props.isDisabled; }
293
+ });
294
+ ```
295
+
296
+ ## TypeScript
297
+
298
+ All hooks are fully typed. Import types as needed:
299
+
300
+ ```tsx
301
+ import {
302
+ createListState,
303
+ type ListState,
304
+ type ListStateProps,
305
+ type Key,
306
+ type Selection,
307
+ } from '@proyecto-viviana/solid-stately';
308
+ ```
309
+
310
+ ## License
311
+
312
+ MIT