@proyecto-viviana/solidaria-components 0.2.5 → 0.3.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 (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -272
  3. package/dist/ActionBar.d.ts +79 -0
  4. package/dist/ActionBar.d.ts.map +1 -0
  5. package/dist/ActionGroup.d.ts +74 -0
  6. package/dist/ActionGroup.d.ts.map +1 -0
  7. package/dist/Alert.d.ts +70 -0
  8. package/dist/Alert.d.ts.map +1 -0
  9. package/dist/Autocomplete.d.ts +5 -5
  10. package/dist/Autocomplete.d.ts.map +1 -1
  11. package/dist/Breadcrumbs.d.ts +27 -8
  12. package/dist/Breadcrumbs.d.ts.map +1 -1
  13. package/dist/Button.d.ts +28 -5
  14. package/dist/Button.d.ts.map +1 -1
  15. package/dist/Calendar.d.ts +51 -7
  16. package/dist/Calendar.d.ts.map +1 -1
  17. package/dist/Checkbox.d.ts +33 -8
  18. package/dist/Checkbox.d.ts.map +1 -1
  19. package/dist/Collection.d.ts +130 -0
  20. package/dist/Collection.d.ts.map +1 -0
  21. package/dist/Color.d.ts +210 -9
  22. package/dist/Color.d.ts.map +1 -1
  23. package/dist/ColorEditor.d.ts +42 -0
  24. package/dist/ColorEditor.d.ts.map +1 -0
  25. package/dist/ComboBox.d.ts +146 -16
  26. package/dist/ComboBox.d.ts.map +1 -1
  27. package/dist/ContextualHelpTrigger.d.ts +40 -0
  28. package/dist/ContextualHelpTrigger.d.ts.map +1 -0
  29. package/dist/DateField.d.ts +35 -8
  30. package/dist/DateField.d.ts.map +1 -1
  31. package/dist/DatePicker.d.ts +101 -5
  32. package/dist/DatePicker.d.ts.map +1 -1
  33. package/dist/DateRangePickerContext.d.ts +30 -0
  34. package/dist/DateRangePickerContext.d.ts.map +1 -0
  35. package/dist/Dialog.d.ts +5 -5
  36. package/dist/Dialog.d.ts.map +1 -1
  37. package/dist/Disclosure.d.ts +25 -5
  38. package/dist/Disclosure.d.ts.map +1 -1
  39. package/dist/DragAndDrop.d.ts +80 -0
  40. package/dist/DragAndDrop.d.ts.map +1 -0
  41. package/dist/DragPreview.d.ts +14 -0
  42. package/dist/DragPreview.d.ts.map +1 -0
  43. package/dist/DropZone.d.ts +27 -0
  44. package/dist/DropZone.d.ts.map +1 -0
  45. package/dist/FieldError.d.ts +27 -0
  46. package/dist/FieldError.d.ts.map +1 -0
  47. package/dist/FileTrigger.d.ts +26 -0
  48. package/dist/FileTrigger.d.ts.map +1 -0
  49. package/dist/Focusable.d.ts +27 -0
  50. package/dist/Focusable.d.ts.map +1 -0
  51. package/dist/Form.d.ts +41 -0
  52. package/dist/Form.d.ts.map +1 -0
  53. package/dist/GridList.d.ts +69 -10
  54. package/dist/GridList.d.ts.map +1 -1
  55. package/dist/HiddenDateInput.d.ts +26 -0
  56. package/dist/HiddenDateInput.d.ts.map +1 -0
  57. package/dist/HiddenTimeInput.d.ts +25 -0
  58. package/dist/HiddenTimeInput.d.ts.map +1 -0
  59. package/dist/Icon.d.ts +57 -0
  60. package/dist/Icon.d.ts.map +1 -0
  61. package/dist/Keyboard.d.ts +13 -0
  62. package/dist/Keyboard.d.ts.map +1 -0
  63. package/dist/Landmark.d.ts +3 -3
  64. package/dist/Landmark.d.ts.map +1 -1
  65. package/dist/Link.d.ts +10 -4
  66. package/dist/Link.d.ts.map +1 -1
  67. package/dist/ListBox.d.ts +73 -11
  68. package/dist/ListBox.d.ts.map +1 -1
  69. package/dist/ListDropTargetDelegate.d.ts +38 -0
  70. package/dist/ListDropTargetDelegate.d.ts.map +1 -0
  71. package/dist/Menu.d.ts +79 -10
  72. package/dist/Menu.d.ts.map +1 -1
  73. package/dist/Meter.d.ts +4 -4
  74. package/dist/Meter.d.ts.map +1 -1
  75. package/dist/Modal.d.ts +6 -4
  76. package/dist/Modal.d.ts.map +1 -1
  77. package/dist/NumberField.d.ts +10 -12
  78. package/dist/NumberField.d.ts.map +1 -1
  79. package/dist/Popover.d.ts +32 -7
  80. package/dist/Popover.d.ts.map +1 -1
  81. package/dist/Pressable.d.ts +27 -0
  82. package/dist/Pressable.d.ts.map +1 -0
  83. package/dist/ProgressBar.d.ts +6 -4
  84. package/dist/ProgressBar.d.ts.map +1 -1
  85. package/dist/RadioGroup.d.ts +43 -9
  86. package/dist/RadioGroup.d.ts.map +1 -1
  87. package/dist/RangeCalendar.d.ts +39 -7
  88. package/dist/RangeCalendar.d.ts.map +1 -1
  89. package/dist/RouterProvider.d.ts +75 -0
  90. package/dist/RouterProvider.d.ts.map +1 -0
  91. package/dist/SearchField.d.ts +23 -21
  92. package/dist/SearchField.d.ts.map +1 -1
  93. package/dist/Select.d.ts +48 -7
  94. package/dist/Select.d.ts.map +1 -1
  95. package/dist/SelectionIndicator.d.ts +30 -0
  96. package/dist/SelectionIndicator.d.ts.map +1 -0
  97. package/dist/Separator.d.ts +9 -3
  98. package/dist/Separator.d.ts.map +1 -1
  99. package/dist/SharedElementTransition.d.ts +41 -0
  100. package/dist/SharedElementTransition.d.ts.map +1 -0
  101. package/dist/Slider.d.ts +15 -8
  102. package/dist/Slider.d.ts.map +1 -1
  103. package/dist/StepList.d.ts +90 -0
  104. package/dist/StepList.d.ts.map +1 -0
  105. package/dist/Switch.d.ts +11 -5
  106. package/dist/Switch.d.ts.map +1 -1
  107. package/dist/Table.d.ts +222 -19
  108. package/dist/Table.d.ts.map +1 -1
  109. package/dist/Tabs.d.ts +47 -10
  110. package/dist/Tabs.d.ts.map +1 -1
  111. package/dist/TagGroup.d.ts +22 -10
  112. package/dist/TagGroup.d.ts.map +1 -1
  113. package/dist/Text.d.ts +10 -0
  114. package/dist/Text.d.ts.map +1 -0
  115. package/dist/TextField.d.ts +19 -11
  116. package/dist/TextField.d.ts.map +1 -1
  117. package/dist/TimeField.d.ts +32 -7
  118. package/dist/TimeField.d.ts.map +1 -1
  119. package/dist/Toast.d.ts +29 -14
  120. package/dist/Toast.d.ts.map +1 -1
  121. package/dist/ToggleButton.d.ts +36 -0
  122. package/dist/ToggleButton.d.ts.map +1 -0
  123. package/dist/ToggleButtonGroup.d.ts +33 -0
  124. package/dist/ToggleButtonGroup.d.ts.map +1 -0
  125. package/dist/Toolbar.d.ts +7 -3
  126. package/dist/Toolbar.d.ts.map +1 -1
  127. package/dist/Tooltip.d.ts +58 -7
  128. package/dist/Tooltip.d.ts.map +1 -1
  129. package/dist/Tree.d.ts +102 -11
  130. package/dist/Tree.d.ts.map +1 -1
  131. package/dist/Virtualizer.d.ts +61 -0
  132. package/dist/Virtualizer.d.ts.map +1 -0
  133. package/dist/VirtualizerLayouts.d.ts +82 -0
  134. package/dist/VirtualizerLayouts.d.ts.map +1 -0
  135. package/dist/VisuallyHidden.d.ts +4 -2
  136. package/dist/VisuallyHidden.d.ts.map +1 -1
  137. package/dist/contexts.d.ts +6 -1
  138. package/dist/contexts.d.ts.map +1 -1
  139. package/dist/index.d.ts +73 -39
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +23342 -10644
  142. package/dist/index.js.map +1 -7
  143. package/dist/index.jsx +18110 -0
  144. package/dist/index.jsx.map +1 -0
  145. package/dist/useDragAndDrop.d.ts +93 -0
  146. package/dist/useDragAndDrop.d.ts.map +1 -0
  147. package/dist/utils.d.ts +8 -2
  148. package/dist/utils.d.ts.map +1 -1
  149. package/dist/virtualizer/Layout.d.ts +79 -0
  150. package/dist/virtualizer/Layout.d.ts.map +1 -0
  151. package/package.json +33 -32
  152. package/src/ActionBar.tsx +251 -0
  153. package/src/ActionGroup.tsx +277 -0
  154. package/src/Alert.tsx +152 -0
  155. package/src/Autocomplete.tsx +39 -44
  156. package/src/Breadcrumbs.tsx +227 -72
  157. package/src/Button.tsx +315 -74
  158. package/src/Calendar.tsx +347 -141
  159. package/src/Checkbox.tsx +414 -123
  160. package/src/Collection.tsx +350 -0
  161. package/src/Color.tsx +1325 -284
  162. package/src/ColorEditor.tsx +213 -0
  163. package/src/ComboBox.tsx +644 -245
  164. package/src/ContextualHelpTrigger.tsx +195 -0
  165. package/src/DateField.tsx +274 -106
  166. package/src/DatePicker.tsx +892 -111
  167. package/src/DateRangePickerContext.tsx +44 -0
  168. package/src/Dialog.tsx +173 -104
  169. package/src/Disclosure.tsx +158 -105
  170. package/src/DragAndDrop.tsx +340 -0
  171. package/src/DragPreview.tsx +47 -0
  172. package/src/DropZone.tsx +233 -0
  173. package/src/FieldError.tsx +89 -0
  174. package/src/FileTrigger.tsx +83 -0
  175. package/src/Focusable.tsx +103 -0
  176. package/src/Form.tsx +140 -0
  177. package/src/GridList.tsx +542 -128
  178. package/src/HiddenDateInput.tsx +153 -0
  179. package/src/HiddenTimeInput.tsx +133 -0
  180. package/src/Icon.tsx +133 -0
  181. package/src/Keyboard.tsx +26 -0
  182. package/src/Landmark.tsx +37 -63
  183. package/src/Link.tsx +132 -69
  184. package/src/ListBox.tsx +656 -106
  185. package/src/ListDropTargetDelegate.ts +283 -0
  186. package/src/Menu.tsx +1234 -132
  187. package/src/Meter.tsx +44 -58
  188. package/src/Modal.tsx +262 -166
  189. package/src/NumberField.tsx +267 -151
  190. package/src/Popover.tsx +452 -343
  191. package/src/Pressable.tsx +108 -0
  192. package/src/ProgressBar.tsx +54 -59
  193. package/src/RadioGroup.tsx +533 -121
  194. package/src/RangeCalendar.tsx +249 -150
  195. package/src/RouterProvider.tsx +223 -0
  196. package/src/SearchField.tsx +460 -133
  197. package/src/Select.tsx +804 -233
  198. package/src/SelectionIndicator.tsx +108 -0
  199. package/src/Separator.tsx +47 -49
  200. package/src/SharedElementTransition.tsx +264 -0
  201. package/src/Slider.tsx +148 -98
  202. package/src/StepList.tsx +272 -0
  203. package/src/Switch.tsx +93 -46
  204. package/src/Table.tsx +1551 -225
  205. package/src/Tabs.tsx +377 -123
  206. package/src/TagGroup.tsx +233 -135
  207. package/src/Text.tsx +18 -0
  208. package/src/TextField.tsx +413 -86
  209. package/src/TimeField.tsx +232 -222
  210. package/src/Toast.tsx +306 -160
  211. package/src/ToggleButton.tsx +169 -0
  212. package/src/ToggleButtonGroup.tsx +141 -0
  213. package/src/Toolbar.tsx +61 -70
  214. package/src/Tooltip.tsx +473 -116
  215. package/src/Tree.tsx +1514 -175
  216. package/src/Virtualizer.tsx +730 -0
  217. package/src/VirtualizerLayouts.ts +280 -0
  218. package/src/VisuallyHidden.tsx +32 -38
  219. package/src/contexts.ts +29 -36
  220. package/src/index.ts +972 -620
  221. package/src/useDragAndDrop.ts +367 -0
  222. package/src/utils.tsx +69 -50
  223. package/src/virtualizer/Layout.ts +192 -0
  224. package/dist/index.ssr.js +0 -9785
  225. package/dist/index.ssr.js.map +0 -7
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Pressable component for solidaria-components
3
+ *
4
+ * A render-prop component that wraps createPress + createFocusable
5
+ * to make an element pressable. Port of React Aria's Pressable.
6
+ */
7
+
8
+ import {
9
+ type JSX,
10
+ children as resolveChildren,
11
+ createEffect,
12
+ onCleanup,
13
+ splitProps,
14
+ } from "solid-js";
15
+ import {
16
+ createPress,
17
+ createFocusable,
18
+ type CreatePressProps,
19
+ type CreateFocusableProps,
20
+ } from "@proyecto-viviana/solidaria";
21
+
22
+ export interface PressableProps extends CreatePressProps {
23
+ /** A single child element to make pressable. */
24
+ children: JSX.Element;
25
+ /** Ref callback. */
26
+ ref?: HTMLElement | ((el: HTMLElement) => void);
27
+ }
28
+
29
+ /**
30
+ * Makes its child element pressable and focusable.
31
+ * Combines createPress and createFocusable for full interaction support.
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * <Pressable onPress={() => console.log('pressed')}>
36
+ * <div role="button" tabIndex={0}>Click me</div>
37
+ * </Pressable>
38
+ * ```
39
+ */
40
+ export function Pressable(props: PressableProps): JSX.Element {
41
+ const [local, pressProps] = splitProps(props, ["children", "ref"]);
42
+
43
+ let ref!: HTMLElement;
44
+ const { pressProps: domPressProps } = createPress(pressProps);
45
+ const { focusableProps: domFocusableProps } = createFocusable(
46
+ pressProps as CreateFocusableProps,
47
+ () => ref,
48
+ );
49
+
50
+ const resolved = resolveChildren(() => local.children);
51
+
52
+ createEffect(() => {
53
+ const child = resolved() as HTMLElement;
54
+ if (child instanceof HTMLElement) {
55
+ ref = child;
56
+ if (typeof local.ref === "function") {
57
+ local.ref(child);
58
+ }
59
+
60
+ // Apply press props
61
+ const allProps = { ...domFocusableProps, ...domPressProps };
62
+ const listeners: Array<[string, EventListener]> = [];
63
+ for (const [key, handler] of Object.entries(allProps)) {
64
+ if (key.startsWith("on") && typeof handler === "function") {
65
+ const eventName = key.slice(2).toLowerCase();
66
+ const listener = handler as EventListener;
67
+ child.addEventListener(eventName, listener);
68
+ listeners.push([eventName, listener]);
69
+ }
70
+ }
71
+
72
+ // Apply non-event press/focusable props (e.g. tabIndex/data attrs).
73
+ // Keep explicit child tabIndex to mirror mergeProps(child.props precedence).
74
+ for (const [key, value] of Object.entries(allProps)) {
75
+ if (key === "ref" || (key.startsWith("on") && typeof value === "function")) continue;
76
+
77
+ if (key === "tabIndex") {
78
+ if (child.hasAttribute("tabindex")) continue;
79
+ if (value == null || value === false) {
80
+ child.removeAttribute("tabindex");
81
+ } else {
82
+ child.tabIndex = Number(value);
83
+ }
84
+ continue;
85
+ }
86
+
87
+ if (key.startsWith("aria-") || key.startsWith("data-") || key === "id" || key === "role") {
88
+ if (child.hasAttribute(key)) continue;
89
+ if (value == null || value === false) {
90
+ child.removeAttribute(key);
91
+ } else if (value === true) {
92
+ child.setAttribute(key, "");
93
+ } else {
94
+ child.setAttribute(key, String(value));
95
+ }
96
+ }
97
+ }
98
+
99
+ onCleanup(() => {
100
+ for (const [eventName, listener] of listeners) {
101
+ child.removeEventListener(eventName, listener);
102
+ }
103
+ });
104
+ }
105
+ });
106
+
107
+ return <>{resolved()}</>;
108
+ }
@@ -5,17 +5,8 @@
5
5
  * Port of react-aria-components/src/ProgressBar.tsx
6
6
  */
7
7
 
8
- import {
9
- type JSX,
10
- type ParentProps,
11
- createContext,
12
- createMemo,
13
- splitProps,
14
- } from 'solid-js';
15
- import {
16
- createProgressBar,
17
- type AriaProgressBarProps,
18
- } from '@proyecto-viviana/solidaria';
8
+ import { type JSX, createContext, createMemo, mergeProps, splitProps, useContext } from "solid-js";
9
+ import { createProgressBar, type AriaProgressBarProps } from "@proyecto-viviana/solidaria";
19
10
  import {
20
11
  type RenderChildren,
21
12
  type ClassNameOrFunction,
@@ -23,11 +14,7 @@ import {
23
14
  type SlotProps,
24
15
  useRenderProps,
25
16
  filterDOMProps,
26
- } from './utils';
27
-
28
- // ============================================
29
- // TYPES
30
- // ============================================
17
+ } from "./utils";
31
18
 
32
19
  export interface ProgressBarRenderProps {
33
20
  /** The value as a percentage between the minimum and maximum (0-100). */
@@ -38,9 +25,9 @@ export interface ProgressBarRenderProps {
38
25
  isIndeterminate: boolean;
39
26
  }
40
27
 
41
- export interface ProgressBarProps
42
- extends AriaProgressBarProps,
43
- SlotProps {
28
+ export interface ProgressBarProps extends AriaProgressBarProps, SlotProps {
29
+ /** The element id. */
30
+ id?: string;
44
31
  /** The children of the component. A function may be provided to receive render props. */
45
32
  children?: RenderChildren<ProgressBarRenderProps>;
46
33
  /** The CSS className for the element. */
@@ -49,23 +36,16 @@ export interface ProgressBarProps
49
36
  style?: StyleOrFunction<ProgressBarRenderProps>;
50
37
  }
51
38
 
52
- // ============================================
53
- // CONTEXT
54
- // ============================================
55
-
56
39
  export const ProgressBarContext = createContext<ProgressBarProps | null>(null);
57
40
 
58
- // ============================================
59
- // UTILITIES
60
- // ============================================
61
-
62
41
  function clamp(value: number, min: number, max: number): number {
63
42
  return Math.min(Math.max(value, min), max);
64
43
  }
65
44
 
66
- // ============================================
67
- // PROGRESSBAR COMPONENT
68
- // ============================================
45
+ function getSafeRange(min: number, max: number): number {
46
+ const range = max - min;
47
+ return Number.isFinite(range) && range > 0 ? range : 1;
48
+ }
69
49
 
70
50
  /**
71
51
  * Progress bars show either determinate or indeterminate progress of an operation
@@ -84,68 +64,83 @@ function clamp(value: number, min: number, max: number): number {
84
64
  * </ProgressBar>
85
65
  * ```
86
66
  */
87
- export function ProgressBar(props: ParentProps<ProgressBarProps>): JSX.Element {
88
- const [local, ariaProps] = splitProps(props, [
89
- 'children',
90
- 'class',
91
- 'style',
92
- 'slot',
93
- ]);
67
+ export function ProgressBar(props: ProgressBarProps): JSX.Element {
68
+ const contextProps = useContext(ProgressBarContext);
69
+ const mergedProps = contextProps ? mergeProps(contextProps, props) : props;
70
+ const [local, ariaProps] = splitProps(mergedProps, ["children", "class", "style", "slot"]);
94
71
 
95
- // Get values for calculations
96
72
  const value = () => ariaProps.value ?? 0;
97
73
  const minValue = () => ariaProps.minValue ?? 0;
98
74
  const maxValue = () => ariaProps.maxValue ?? 100;
99
75
  const isIndeterminate = () => ariaProps.isIndeterminate ?? false;
100
76
 
101
- // Create progress bar aria props
102
77
  const progressAria = createProgressBar({
103
- get value() { return ariaProps.value; },
104
- get minValue() { return ariaProps.minValue; },
105
- get maxValue() { return ariaProps.maxValue; },
106
- get valueLabel() { return ariaProps.valueLabel; },
107
- get isIndeterminate() { return ariaProps.isIndeterminate; },
108
- get formatOptions() { return ariaProps.formatOptions; },
109
- get label() { return ariaProps.label; },
110
- get 'aria-label'() { return ariaProps['aria-label']; },
111
- get 'aria-labelledby'() { return ariaProps['aria-labelledby']; },
112
- get 'aria-describedby'() { return ariaProps['aria-describedby']; },
113
- get 'aria-details'() { return ariaProps['aria-details']; },
78
+ get id() {
79
+ return ariaProps.id;
80
+ },
81
+ get value() {
82
+ return ariaProps.value;
83
+ },
84
+ get minValue() {
85
+ return ariaProps.minValue;
86
+ },
87
+ get maxValue() {
88
+ return ariaProps.maxValue;
89
+ },
90
+ get valueLabel() {
91
+ return ariaProps.valueLabel;
92
+ },
93
+ get isIndeterminate() {
94
+ return ariaProps.isIndeterminate;
95
+ },
96
+ get formatOptions() {
97
+ return ariaProps.formatOptions;
98
+ },
99
+ get label() {
100
+ return ariaProps.label;
101
+ },
102
+ get "aria-label"() {
103
+ return ariaProps["aria-label"];
104
+ },
105
+ get "aria-labelledby"() {
106
+ return ariaProps["aria-labelledby"];
107
+ },
108
+ get "aria-describedby"() {
109
+ return ariaProps["aria-describedby"];
110
+ },
111
+ get "aria-details"() {
112
+ return ariaProps["aria-details"];
113
+ },
114
114
  });
115
115
 
116
- // Calculate percentage
117
116
  const percentage = createMemo(() => {
118
117
  if (isIndeterminate()) {
119
118
  return undefined;
120
119
  }
121
120
  const clampedValue = clamp(value(), minValue(), maxValue());
122
- return ((clampedValue - minValue()) / (maxValue() - minValue())) * 100;
121
+ return ((clampedValue - minValue()) / getSafeRange(minValue(), maxValue())) * 100;
123
122
  });
124
123
 
125
- // Get value text from aria props
126
124
  const valueText = createMemo(() => {
127
- return progressAria.progressBarProps['aria-valuetext'] as string | undefined;
125
+ return progressAria.progressBarProps["aria-valuetext"] as string | undefined;
128
126
  });
129
127
 
130
- // Render props values
131
128
  const renderValues = createMemo<ProgressBarRenderProps>(() => ({
132
129
  percentage: percentage(),
133
130
  valueText: valueText(),
134
131
  isIndeterminate: isIndeterminate(),
135
132
  }));
136
133
 
137
- // Resolve render props
138
134
  const renderProps = useRenderProps(
139
135
  {
140
136
  children: props.children,
141
137
  class: local.class,
142
138
  style: local.style,
143
- defaultClassName: 'solidaria-ProgressBar',
139
+ defaultClassName: "solidaria-ProgressBar",
144
140
  },
145
- renderValues
141
+ renderValues,
146
142
  );
147
143
 
148
- // Filter DOM props
149
144
  const domProps = createMemo(() => filterDOMProps(ariaProps, { global: true }));
150
145
 
151
146
  return (