@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
package/src/Icon.tsx ADDED
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Icon component for solidaria-components
3
+ *
4
+ * Minimal headless Icon that owns ARIA semantics:
5
+ * - Decorative (no label): aria-hidden="true"
6
+ * - Informative (aria-label): role="img" + aria-label
7
+ * - Interactive (onPress): wraps content in headless Button
8
+ *
9
+ * The UI layer consumes this for styling/composition only.
10
+ */
11
+
12
+ import {
13
+ type JSX,
14
+ createContext,
15
+ createMemo,
16
+ Show,
17
+ splitProps,
18
+ } from 'solid-js';
19
+ import {
20
+ type RenderChildren,
21
+ type ClassNameOrFunction,
22
+ type StyleOrFunction,
23
+ type SlotProps,
24
+ useRenderProps,
25
+ filterDOMProps,
26
+ } from './utils';
27
+ import { Button } from './Button';
28
+ import type { PressEvent } from '@proyecto-viviana/solidaria';
29
+
30
+ // ============================================
31
+ // TYPES
32
+ // ============================================
33
+
34
+ export interface IconRenderProps {
35
+ /** Whether the icon is purely decorative (no label). */
36
+ isDecorative: boolean;
37
+ /** Whether the icon is interactive (has onPress). */
38
+ isInteractive: boolean;
39
+ }
40
+
41
+ export interface IconProps extends SlotProps {
42
+ /** Handler called when the icon is pressed (makes it interactive). */
43
+ onPress?: (e: PressEvent) => void;
44
+ /** Accessible label for the icon. When provided, the icon is informative (role="img"). */
45
+ 'aria-label'?: string;
46
+ /** ID of an element that labels this icon. */
47
+ 'aria-labelledby'?: string;
48
+ /** The children of the component. A function may be provided to receive render props. */
49
+ children?: RenderChildren<IconRenderProps>;
50
+ /** The CSS className for the element. */
51
+ class?: ClassNameOrFunction<IconRenderProps>;
52
+ /** The inline style for the element. */
53
+ style?: StyleOrFunction<IconRenderProps>;
54
+ /** The id of the element. */
55
+ id?: string;
56
+ }
57
+
58
+ // ============================================
59
+ // CONTEXT
60
+ // ============================================
61
+
62
+ export const IconContext = createContext<IconProps | null>(null);
63
+
64
+ // ============================================
65
+ // ICON COMPONENT
66
+ // ============================================
67
+
68
+ /**
69
+ * An icon wrapper that provides correct ARIA semantics.
70
+ *
71
+ * - **Decorative** (no `aria-label`): renders `<span aria-hidden="true">`
72
+ * - **Informative** (`aria-label` provided): renders `<span role="img" aria-label="...">`
73
+ * - **Interactive** (`onPress` provided): wraps in headless `Button`
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * // Decorative
78
+ * <Icon><SearchSvg /></Icon>
79
+ *
80
+ * // Informative
81
+ * <Icon aria-label="Search"><SearchSvg /></Icon>
82
+ *
83
+ * // Interactive
84
+ * <Icon onPress={handleSearch} aria-label="Search"><SearchSvg /></Icon>
85
+ * ```
86
+ */
87
+ export function Icon(props: IconProps): JSX.Element {
88
+ const [local, rest] = splitProps(props, [
89
+ 'children',
90
+ 'class',
91
+ 'style',
92
+ 'slot',
93
+ 'onPress',
94
+ 'aria-label',
95
+ 'aria-labelledby',
96
+ ]);
97
+
98
+ const hasLabel = () => !!(local['aria-label'] || local['aria-labelledby']);
99
+ const isInteractive = () => !!local.onPress;
100
+ const isDecorative = () => !hasLabel();
101
+
102
+ // Render props values
103
+ const renderValues = createMemo<IconRenderProps>(() => ({
104
+ isDecorative: isDecorative(),
105
+ isInteractive: isInteractive(),
106
+ }));
107
+
108
+ // Resolve render props
109
+ const renderProps = useRenderProps(
110
+ {
111
+ children: local.children,
112
+ class: local.class,
113
+ style: local.style,
114
+ defaultClassName: 'solidaria-Icon',
115
+ },
116
+ renderValues
117
+ );
118
+
119
+ // Filter DOM props
120
+ const domProps = createMemo(() => filterDOMProps(rest, { global: true }));
121
+
122
+ return (
123
+ <Show
124
+ when={isInteractive()}
125
+ fallback={
126
+ <span
127
+ {...domProps()}
128
+ role={hasLabel() ? 'img' : undefined}
129
+ aria-hidden={isDecorative() ? 'true' : undefined}
130
+ aria-label={local['aria-label']}
131
+ aria-labelledby={local['aria-labelledby']}
132
+ class={renderProps.class()}
133
+ style={renderProps.style()}
134
+ data-interactive={undefined}
135
+ data-decorative={isDecorative() || undefined}
136
+ >
137
+ {renderProps.renderChildren()}
138
+ </span>
139
+ }
140
+ >
141
+ <Button
142
+ {...domProps()}
143
+ onPress={local.onPress}
144
+ aria-label={local['aria-label']}
145
+ aria-labelledby={local['aria-labelledby']}
146
+ class={renderProps.class()}
147
+ style={renderProps.style()}
148
+ data-interactive=""
149
+ >
150
+ {renderProps.renderChildren()}
151
+ </Button>
152
+ </Show>
153
+ );
154
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Keyboard primitive for solidaria-components.
3
+ *
4
+ * Displays keyboard key hints with semantic <kbd> markup.
5
+ * Port direction: react-aria-components/src/Keyboard.tsx
6
+ */
7
+
8
+ import { type JSX, createContext, splitProps, useContext } from 'solid-js';
9
+
10
+ export interface KeyboardProps extends JSX.HTMLAttributes<HTMLElement> {
11
+ children?: JSX.Element;
12
+ }
13
+
14
+ export const KeyboardContext = createContext<KeyboardProps | null>(null);
15
+
16
+ export function Keyboard(props: KeyboardProps): JSX.Element {
17
+ const context = useContext(KeyboardContext);
18
+ const merged = () => ({ ...(context ?? {}), ...props });
19
+ const [local, domProps] = splitProps(merged(), ['children']);
20
+
21
+ return (
22
+ <kbd dir="ltr" {...domProps}>
23
+ {local.children}
24
+ </kbd>
25
+ );
26
+ }
package/src/Link.tsx CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  useRenderProps,
29
29
  filterDOMProps,
30
30
  } from './utils';
31
+ import { handleLinkClick, useRouter } from './RouterProvider';
31
32
 
32
33
  // ============================================
33
34
  // TYPES
@@ -98,6 +99,8 @@ export function Link(props: ParentProps<LinkProps>): JSX.Element {
98
99
  'onHoverEnd',
99
100
  'onHoverChange',
100
101
  ]);
102
+ const router = useRouter();
103
+ const resolvedHref = createMemo(() => ariaProps.href ? router.useHref(ariaProps.href) : undefined);
101
104
 
102
105
  // Determine element type - use 'a' if href is provided and not disabled
103
106
  const elementType = () => {
@@ -111,9 +114,13 @@ export function Link(props: ParentProps<LinkProps>): JSX.Element {
111
114
  const linkAria = createLink({
112
115
  get elementType() { return elementType(); },
113
116
  get isDisabled() { return ariaProps.isDisabled; },
114
- get href() { return ariaProps.href; },
117
+ get href() { return resolvedHref(); },
118
+ get hrefLang() { return ariaProps.hrefLang; },
115
119
  get target() { return ariaProps.target; },
116
120
  get rel() { return ariaProps.rel; },
121
+ get download() { return ariaProps.download; },
122
+ get ping() { return ariaProps.ping; },
123
+ get referrerPolicy() { return ariaProps.referrerPolicy; },
117
124
  get onPress() { return ariaProps.onPress; },
118
125
  get onPressStart() { return ariaProps.onPressStart; },
119
126
  get onPressEnd() { return ariaProps.onPressEnd; },
@@ -178,6 +185,11 @@ export function Link(props: ParentProps<LinkProps>): JSX.Element {
178
185
  const { ref: _ref3, ...rest } = focusProps as Record<string, unknown>;
179
186
  return rest;
180
187
  };
188
+ const onLinkClick = (event: MouseEvent) => {
189
+ const onClick = cleanLinkProps().onClick as ((event: MouseEvent) => void) | undefined;
190
+ onClick?.(event);
191
+ handleLinkClick(event, router, ariaProps.href, ariaProps.routerOptions);
192
+ };
181
193
 
182
194
  return (
183
195
  <Dynamic
@@ -186,6 +198,7 @@ export function Link(props: ParentProps<LinkProps>): JSX.Element {
186
198
  {...cleanLinkProps()}
187
199
  {...cleanHoverProps()}
188
200
  {...cleanFocusProps()}
201
+ onClick={onLinkClick}
189
202
  class={renderProps.class()}
190
203
  style={renderProps.style()}
191
204
  data-hovered={isHovered() || undefined}