@proyecto-viviana/solidaria-components 0.2.5 → 0.2.9

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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ActionBar.d.ts +71 -0
  3. package/dist/ActionBar.d.ts.map +1 -0
  4. package/dist/ActionGroup.d.ts +74 -0
  5. package/dist/ActionGroup.d.ts.map +1 -0
  6. package/dist/Alert.d.ts +70 -0
  7. package/dist/Alert.d.ts.map +1 -0
  8. package/dist/Breadcrumbs.d.ts +10 -2
  9. package/dist/Breadcrumbs.d.ts.map +1 -1
  10. package/dist/Button.d.ts +4 -0
  11. package/dist/Button.d.ts.map +1 -1
  12. package/dist/Calendar.d.ts +13 -0
  13. package/dist/Calendar.d.ts.map +1 -1
  14. package/dist/Checkbox.d.ts +2 -2
  15. package/dist/Checkbox.d.ts.map +1 -1
  16. package/dist/Collection.d.ts +125 -0
  17. package/dist/Collection.d.ts.map +1 -0
  18. package/dist/Color.d.ts +114 -2
  19. package/dist/Color.d.ts.map +1 -1
  20. package/dist/ColorEditor.d.ts +42 -0
  21. package/dist/ColorEditor.d.ts.map +1 -0
  22. package/dist/ComboBox.d.ts +64 -0
  23. package/dist/ComboBox.d.ts.map +1 -1
  24. package/dist/ContextualHelpTrigger.d.ts +40 -0
  25. package/dist/ContextualHelpTrigger.d.ts.map +1 -0
  26. package/dist/DateField.d.ts +27 -2
  27. package/dist/DateField.d.ts.map +1 -1
  28. package/dist/DatePicker.d.ts +67 -2
  29. package/dist/DatePicker.d.ts.map +1 -1
  30. package/dist/Dialog.d.ts.map +1 -1
  31. package/dist/Disclosure.d.ts +2 -0
  32. package/dist/Disclosure.d.ts.map +1 -1
  33. package/dist/DragAndDrop.d.ts +80 -0
  34. package/dist/DragAndDrop.d.ts.map +1 -0
  35. package/dist/DragPreview.d.ts +14 -0
  36. package/dist/DragPreview.d.ts.map +1 -0
  37. package/dist/DropZone.d.ts +27 -0
  38. package/dist/DropZone.d.ts.map +1 -0
  39. package/dist/FieldError.d.ts +23 -0
  40. package/dist/FieldError.d.ts.map +1 -0
  41. package/dist/FileTrigger.d.ts +26 -0
  42. package/dist/FileTrigger.d.ts.map +1 -0
  43. package/dist/Focusable.d.ts +27 -0
  44. package/dist/Focusable.d.ts.map +1 -0
  45. package/dist/Form.d.ts +27 -0
  46. package/dist/Form.d.ts.map +1 -0
  47. package/dist/GridList.d.ts +40 -1
  48. package/dist/GridList.d.ts.map +1 -1
  49. package/dist/Icon.d.ts +57 -0
  50. package/dist/Icon.d.ts.map +1 -0
  51. package/dist/Keyboard.d.ts +13 -0
  52. package/dist/Keyboard.d.ts.map +1 -0
  53. package/dist/Link.d.ts.map +1 -1
  54. package/dist/ListBox.d.ts +43 -1
  55. package/dist/ListBox.d.ts.map +1 -1
  56. package/dist/ListDropTargetDelegate.d.ts +38 -0
  57. package/dist/ListDropTargetDelegate.d.ts.map +1 -0
  58. package/dist/Menu.d.ts +20 -2
  59. package/dist/Menu.d.ts.map +1 -1
  60. package/dist/Meter.d.ts +2 -2
  61. package/dist/Meter.d.ts.map +1 -1
  62. package/dist/Modal.d.ts +2 -0
  63. package/dist/Modal.d.ts.map +1 -1
  64. package/dist/NumberField.d.ts +2 -0
  65. package/dist/NumberField.d.ts.map +1 -1
  66. package/dist/Popover.d.ts +4 -2
  67. package/dist/Popover.d.ts.map +1 -1
  68. package/dist/Pressable.d.ts +27 -0
  69. package/dist/Pressable.d.ts.map +1 -0
  70. package/dist/ProgressBar.d.ts +2 -2
  71. package/dist/ProgressBar.d.ts.map +1 -1
  72. package/dist/RadioGroup.d.ts.map +1 -1
  73. package/dist/RangeCalendar.d.ts +5 -0
  74. package/dist/RangeCalendar.d.ts.map +1 -1
  75. package/dist/RouterProvider.d.ts +75 -0
  76. package/dist/RouterProvider.d.ts.map +1 -0
  77. package/dist/SearchField.d.ts +2 -3
  78. package/dist/SearchField.d.ts.map +1 -1
  79. package/dist/Select.d.ts +11 -0
  80. package/dist/Select.d.ts.map +1 -1
  81. package/dist/SelectionIndicator.d.ts +30 -0
  82. package/dist/SelectionIndicator.d.ts.map +1 -0
  83. package/dist/SharedElementTransition.d.ts +39 -0
  84. package/dist/SharedElementTransition.d.ts.map +1 -0
  85. package/dist/Slider.d.ts +6 -3
  86. package/dist/Slider.d.ts.map +1 -1
  87. package/dist/Table.d.ts +39 -0
  88. package/dist/Table.d.ts.map +1 -1
  89. package/dist/Tabs.d.ts +4 -3
  90. package/dist/Tabs.d.ts.map +1 -1
  91. package/dist/TagGroup.d.ts +12 -2
  92. package/dist/TagGroup.d.ts.map +1 -1
  93. package/dist/Text.d.ts +10 -0
  94. package/dist/Text.d.ts.map +1 -0
  95. package/dist/TextField.d.ts +4 -0
  96. package/dist/TextField.d.ts.map +1 -1
  97. package/dist/TimeField.d.ts +26 -1
  98. package/dist/TimeField.d.ts.map +1 -1
  99. package/dist/Toast.d.ts.map +1 -1
  100. package/dist/ToggleButton.d.ts +30 -0
  101. package/dist/ToggleButton.d.ts.map +1 -0
  102. package/dist/ToggleButtonGroup.d.ts +33 -0
  103. package/dist/ToggleButtonGroup.d.ts.map +1 -0
  104. package/dist/Toolbar.d.ts.map +1 -1
  105. package/dist/Tooltip.d.ts +9 -0
  106. package/dist/Tooltip.d.ts.map +1 -1
  107. package/dist/Tree.d.ts +44 -2
  108. package/dist/Tree.d.ts.map +1 -1
  109. package/dist/Virtualizer.d.ts +61 -0
  110. package/dist/Virtualizer.d.ts.map +1 -0
  111. package/dist/VirtualizerLayouts.d.ts +82 -0
  112. package/dist/VirtualizerLayouts.d.ts.map +1 -0
  113. package/dist/VisuallyHidden.d.ts +3 -1
  114. package/dist/VisuallyHidden.d.ts.map +1 -1
  115. package/dist/contexts.d.ts +1 -0
  116. package/dist/contexts.d.ts.map +1 -1
  117. package/dist/index.d.ts +57 -25
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +13961 -5946
  120. package/dist/index.js.map +1 -7
  121. package/dist/index.ssr.js +9612 -2401
  122. package/dist/index.ssr.js.map +1 -7
  123. package/dist/useDragAndDrop.d.ts +93 -0
  124. package/dist/useDragAndDrop.d.ts.map +1 -0
  125. package/dist/utils.d.ts +7 -1
  126. package/dist/utils.d.ts.map +1 -1
  127. package/dist/virtualizer/Layout.d.ts +79 -0
  128. package/dist/virtualizer/Layout.d.ts.map +1 -0
  129. package/package.json +8 -6
  130. package/src/ActionBar.tsx +248 -0
  131. package/src/ActionGroup.tsx +285 -0
  132. package/src/Alert.tsx +177 -0
  133. package/src/Autocomplete.tsx +1 -1
  134. package/src/Breadcrumbs.tsx +103 -17
  135. package/src/Button.tsx +65 -21
  136. package/src/Calendar.tsx +179 -53
  137. package/src/Checkbox.tsx +1 -2
  138. package/src/Collection.tsx +341 -0
  139. package/src/Color.tsx +652 -34
  140. package/src/ColorEditor.tsx +231 -0
  141. package/src/ComboBox.tsx +315 -81
  142. package/src/ContextualHelpTrigger.tsx +183 -0
  143. package/src/DateField.tsx +93 -19
  144. package/src/DatePicker.tsx +495 -25
  145. package/src/Dialog.tsx +40 -9
  146. package/src/Disclosure.tsx +33 -27
  147. package/src/DragAndDrop.tsx +334 -0
  148. package/src/DragPreview.tsx +45 -0
  149. package/src/DropZone.tsx +213 -0
  150. package/src/FieldError.tsx +67 -0
  151. package/src/FileTrigger.tsx +83 -0
  152. package/src/Focusable.tsx +106 -0
  153. package/src/Form.tsx +85 -0
  154. package/src/GridList.tsx +379 -41
  155. package/src/Icon.tsx +154 -0
  156. package/src/Keyboard.tsx +26 -0
  157. package/src/Link.tsx +14 -1
  158. package/src/ListBox.tsx +484 -33
  159. package/src/ListDropTargetDelegate.ts +282 -0
  160. package/src/Menu.tsx +388 -35
  161. package/src/Meter.tsx +7 -3
  162. package/src/Modal.tsx +32 -4
  163. package/src/NumberField.tsx +163 -43
  164. package/src/Popover.tsx +136 -180
  165. package/src/Pressable.tsx +108 -0
  166. package/src/ProgressBar.tsx +7 -3
  167. package/src/RadioGroup.tsx +35 -25
  168. package/src/RangeCalendar.tsx +100 -68
  169. package/src/RouterProvider.tsx +240 -0
  170. package/src/SearchField.tsx +142 -34
  171. package/src/Select.tsx +221 -73
  172. package/src/SelectionIndicator.tsx +105 -0
  173. package/src/SharedElementTransition.tsx +258 -0
  174. package/src/Slider.tsx +16 -6
  175. package/src/Table.tsx +417 -57
  176. package/src/Tabs.tsx +68 -35
  177. package/src/TagGroup.tsx +121 -36
  178. package/src/Text.tsx +18 -0
  179. package/src/TextField.tsx +25 -8
  180. package/src/TimeField.tsx +101 -151
  181. package/src/Toast.tsx +108 -14
  182. package/src/ToggleButton.tsx +159 -0
  183. package/src/ToggleButtonGroup.tsx +136 -0
  184. package/src/Toolbar.tsx +14 -8
  185. package/src/Tooltip.tsx +108 -19
  186. package/src/Tree.tsx +1143 -87
  187. package/src/Virtualizer.tsx +702 -0
  188. package/src/VirtualizerLayouts.ts +265 -0
  189. package/src/VisuallyHidden.tsx +15 -21
  190. package/src/contexts.ts +1 -0
  191. package/src/index.ts +1057 -620
  192. package/src/useDragAndDrop.ts +351 -0
  193. package/src/utils.tsx +37 -3
  194. package/src/virtualizer/Layout.ts +200 -0
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Collection composition primitives for solidaria-components.
3
+ *
4
+ * Foundational parity layer for React Spectrum-style composition:
5
+ * Section / Header / Group.
6
+ */
7
+
8
+ import {
9
+ type JSX,
10
+ createContext,
11
+ createMemo,
12
+ splitProps,
13
+ useContext,
14
+ For,
15
+ } from 'solid-js';
16
+ import type { Key } from '@proyecto-viviana/solid-stately';
17
+ import type { DragTypes, DropOperation, DropTarget } from '@proyecto-viviana/solid-stately';
18
+ import {
19
+ Collection as AriaCollection,
20
+ CollectionBuilder as AriaCollectionBuilder,
21
+ createLeafComponent,
22
+ createBranchComponent,
23
+ type CollectionProps as AriaCollectionProps,
24
+ type CollectionBuilderProps as AriaCollectionBuilderProps,
25
+ } from '@proyecto-viviana/solidaria';
26
+ import {
27
+ type ClassNameOrFunction,
28
+ type StyleOrFunction,
29
+ type SlotProps,
30
+ useRenderProps,
31
+ filterDOMProps,
32
+ } from './utils';
33
+
34
+ // ============================================
35
+ // TYPES
36
+ // ============================================
37
+
38
+ export interface CollectionPrimitiveRenderProps {
39
+ /** Whether the primitive has visible children content. */
40
+ hasChildren: boolean;
41
+ }
42
+
43
+ export interface CollectionDropTargetDelegate {
44
+ getDropTargetFromPoint(
45
+ x: number,
46
+ y: number,
47
+ isValidDropTarget: (target: DropTarget) => boolean
48
+ ): DropTarget | null;
49
+ getDropOperation(
50
+ target: DropTarget,
51
+ types: DragTypes,
52
+ allowedOperations: DropOperation[]
53
+ ): DropOperation;
54
+ getKeyboardNavigationTarget?(
55
+ target: DropTarget | null,
56
+ direction: 'next' | 'previous',
57
+ isValidDropTarget: (target: DropTarget) => boolean
58
+ ): DropTarget | null;
59
+ getKeyboardPageNavigationTarget?(
60
+ target: DropTarget | null,
61
+ direction: 'next' | 'previous',
62
+ isValidDropTarget: (target: DropTarget) => boolean
63
+ ): DropTarget | null;
64
+ }
65
+
66
+ export interface CollectionRendererContextValue<T> {
67
+ /** Render function used by collection parents to render each item node. */
68
+ renderItem: (item: T) => JSX.Element;
69
+ /** Whether collection rendering is currently virtualized. */
70
+ isVirtualized?: boolean;
71
+ /** Optional layout delegate used by virtualized renderers. */
72
+ layoutDelegate?: unknown;
73
+ /** Optional drop target delegate used by DnD-aware collection paths. */
74
+ dropTargetDelegate?: CollectionDropTargetDelegate;
75
+ /** Optional drop indicator renderer for DnD-aware collection paths. */
76
+ renderDropIndicator?: (index: number, position: 'before' | 'after' | 'on') => JSX.Element | undefined;
77
+ }
78
+
79
+ export type CollectionEntry<T> = T | CollectionSection<T>;
80
+
81
+ export interface CollectionSection<T> {
82
+ /** Optional unique key for the section wrapper. */
83
+ key?: Key;
84
+ /** Optional section header title. */
85
+ title?: JSX.Element;
86
+ /** Optional aria-label for section grouping. */
87
+ 'aria-label'?: string;
88
+ /** Items contained in the section. */
89
+ items: T[];
90
+ }
91
+
92
+ export interface SectionProps extends SlotProps {
93
+ /** Section contents, usually Header + Group/items. */
94
+ children?: JSX.Element;
95
+ /** The CSS className for the element. */
96
+ class?: ClassNameOrFunction<CollectionPrimitiveRenderProps>;
97
+ /** The inline style for the element. */
98
+ style?: StyleOrFunction<CollectionPrimitiveRenderProps>;
99
+ }
100
+
101
+ export interface HeaderProps extends SlotProps {
102
+ /** Header contents, usually section title text. */
103
+ children?: JSX.Element;
104
+ /** Optional heading level when rendered as a heading role. */
105
+ 'aria-level'?: number;
106
+ /** The CSS className for the element. */
107
+ class?: ClassNameOrFunction<CollectionPrimitiveRenderProps>;
108
+ /** The inline style for the element. */
109
+ style?: StyleOrFunction<CollectionPrimitiveRenderProps>;
110
+ }
111
+
112
+ export interface GroupProps extends SlotProps {
113
+ /** Group contents, usually section items. */
114
+ children?: JSX.Element;
115
+ /** The CSS className for the element. */
116
+ class?: ClassNameOrFunction<CollectionPrimitiveRenderProps>;
117
+ /** The inline style for the element. */
118
+ style?: StyleOrFunction<CollectionPrimitiveRenderProps>;
119
+ }
120
+
121
+ interface SectionContextValue {
122
+ name: string;
123
+ render: (props: SectionProps, className?: string) => JSX.Element;
124
+ }
125
+
126
+ export interface CollectionBranchProps<T> {
127
+ collection: Iterable<T>;
128
+ parent?: unknown;
129
+ renderDropIndicator?: (target: { type: 'item'; key: Key; dropPosition: 'before' | 'after' | 'on' }) => JSX.Element | undefined;
130
+ }
131
+
132
+ export interface CollectionRootProps<T> {
133
+ collection: Iterable<T>;
134
+ persistedKeys?: Set<Key> | null;
135
+ renderDropIndicator?: (target: { type: 'item'; key: Key; dropPosition: 'before' | 'after' | 'on' }) => JSX.Element | undefined;
136
+ }
137
+
138
+ export interface CollectionRenderer<T = unknown> {
139
+ isVirtualized?: boolean;
140
+ layoutDelegate?: unknown;
141
+ dropTargetDelegate?: CollectionDropTargetDelegate;
142
+ CollectionRoot: (props: CollectionRootProps<T>) => JSX.Element;
143
+ CollectionBranch: (props: CollectionBranchProps<T>) => JSX.Element;
144
+ }
145
+
146
+ // ============================================
147
+ // CONTEXT
148
+ // ============================================
149
+
150
+ export const CollectionRendererContext = createContext<CollectionRendererContextValue<unknown> | null>(null);
151
+ export const SelectableCollectionContext = CollectionRendererContext;
152
+ export const SectionContext = createContext<SectionContextValue | null>(null);
153
+ export const GroupContext = createContext<Partial<GroupProps> | null>(null);
154
+ export const HeaderContext = createContext<Partial<HeaderProps> | null>(null);
155
+ export const HeadingContext = createContext<Partial<HeaderProps> | null>(null);
156
+
157
+ export function useCollectionRenderer<T>(): CollectionRendererContextValue<T> | null {
158
+ return useContext(CollectionRendererContext) as CollectionRendererContextValue<T> | null;
159
+ }
160
+
161
+ // ============================================
162
+ // HELPERS
163
+ // ============================================
164
+
165
+ export function isCollectionSection<T>(entry: CollectionEntry<T>): entry is CollectionSection<T> {
166
+ return typeof entry === 'object' && entry !== null && Array.isArray((entry as CollectionSection<T>).items);
167
+ }
168
+
169
+ export function flattenCollectionEntries<T>(entries: CollectionEntry<T>[]): T[] {
170
+ const flattened: T[] = [];
171
+ for (const entry of entries) {
172
+ if (isCollectionSection(entry)) flattened.push(...entry.items);
173
+ else flattened.push(entry);
174
+ }
175
+ return flattened;
176
+ }
177
+
178
+ function renderCollectionItems<T>(
179
+ collection: Iterable<T>,
180
+ renderDropIndicator?: (target: { type: 'item'; key: Key; dropPosition: 'before' | 'after' | 'on' }) => JSX.Element | undefined
181
+ ): JSX.Element {
182
+ const items = Array.from(collection);
183
+ return (
184
+ <For each={items}>
185
+ {(item, index) => {
186
+ const node = item as { type?: unknown; key?: Key };
187
+ if (node.type === 'content') {
188
+ // Content rows are rendered by their owning item/section branch.
189
+ return <></>;
190
+ }
191
+ const key = node.key ?? index();
192
+ return (
193
+ <>
194
+ {renderDropIndicator?.({ type: 'item', key, dropPosition: 'before' })}
195
+ {(item as unknown as JSX.Element)}
196
+ {renderDropIndicator?.({ type: 'item', key, dropPosition: 'after' })}
197
+ </>
198
+ );
199
+ }}
200
+ </For>
201
+ );
202
+ }
203
+
204
+ export const DefaultCollectionRenderer: CollectionRenderer<unknown> = {
205
+ CollectionRoot(props) {
206
+ return renderCollectionItems(props.collection, props.renderDropIndicator);
207
+ },
208
+ CollectionBranch(props) {
209
+ return renderCollectionItems(props.collection, props.renderDropIndicator);
210
+ },
211
+ };
212
+
213
+ export function CollectionBuilder<T>(props: AriaCollectionBuilderProps<T>): unknown {
214
+ return AriaCollectionBuilder(props);
215
+ }
216
+
217
+ export function Collection<T>(props: AriaCollectionProps<T>): unknown {
218
+ return AriaCollection(props);
219
+ }
220
+
221
+ export { createLeafComponent, createBranchComponent };
222
+
223
+ // ============================================
224
+ // COMPONENTS
225
+ // ============================================
226
+
227
+ /**
228
+ * A semantic section wrapper for grouped collection content.
229
+ */
230
+ export function Section(props: SectionProps): JSX.Element {
231
+ const sectionContext = useContext(SectionContext);
232
+ if (sectionContext) {
233
+ const nodeEnv = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;
234
+ if (nodeEnv !== 'production') {
235
+ console.warn(`<Section> is deprecated. Please use <${sectionContext.name}> instead.`);
236
+ }
237
+ return sectionContext.render(props, 'solidaria-Section');
238
+ }
239
+
240
+ const [local, domProps] = splitProps(props, ['children', 'class', 'style', 'slot']);
241
+
242
+ const renderValues = createMemo<CollectionPrimitiveRenderProps>(() => ({
243
+ hasChildren: local.children != null,
244
+ }));
245
+
246
+ const renderProps = useRenderProps(
247
+ {
248
+ children: local.children,
249
+ class: local.class,
250
+ style: local.style,
251
+ defaultClassName: 'solidaria-Section',
252
+ },
253
+ renderValues
254
+ );
255
+
256
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
257
+
258
+ return (
259
+ <div
260
+ {...filteredDomProps()}
261
+ class={renderProps.class()}
262
+ style={renderProps.style()}
263
+ slot={local.slot}
264
+ data-section
265
+ >
266
+ {renderProps.renderChildren()}
267
+ </div>
268
+ );
269
+ }
270
+
271
+ /**
272
+ * A header/title primitive for collection sections.
273
+ */
274
+ export function Header(props: HeaderProps): JSX.Element {
275
+ const [local, domProps] = splitProps(props, ['children', 'class', 'style', 'slot']);
276
+
277
+ const renderValues = createMemo<CollectionPrimitiveRenderProps>(() => ({
278
+ hasChildren: local.children != null,
279
+ }));
280
+
281
+ const renderProps = useRenderProps(
282
+ {
283
+ children: local.children,
284
+ class: local.class,
285
+ style: local.style,
286
+ defaultClassName: 'solidaria-Header',
287
+ },
288
+ renderValues
289
+ );
290
+
291
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
292
+
293
+ return (
294
+ <div
295
+ {...filteredDomProps()}
296
+ role="heading"
297
+ class={renderProps.class()}
298
+ style={renderProps.style()}
299
+ slot={local.slot}
300
+ data-header
301
+ >
302
+ {renderProps.renderChildren()}
303
+ </div>
304
+ );
305
+ }
306
+
307
+ /**
308
+ * A grouping primitive for section item containers.
309
+ */
310
+ export function Group(props: GroupProps): JSX.Element {
311
+ const [local, domProps] = splitProps(props, ['children', 'class', 'style', 'slot']);
312
+
313
+ const renderValues = createMemo<CollectionPrimitiveRenderProps>(() => ({
314
+ hasChildren: local.children != null,
315
+ }));
316
+
317
+ const renderProps = useRenderProps(
318
+ {
319
+ children: local.children,
320
+ class: local.class,
321
+ style: local.style,
322
+ defaultClassName: 'solidaria-Group',
323
+ },
324
+ renderValues
325
+ );
326
+
327
+ const filteredDomProps = createMemo(() => filterDOMProps(domProps, { global: true }));
328
+
329
+ return (
330
+ <div
331
+ {...filteredDomProps()}
332
+ role="group"
333
+ class={renderProps.class()}
334
+ style={renderProps.style()}
335
+ slot={local.slot}
336
+ data-group
337
+ >
338
+ {renderProps.renderChildren()}
339
+ </div>
340
+ );
341
+ }