@proyecto-viviana/solidaria-components 0.2.9 → 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.
- package/README.md +39 -272
- package/dist/ActionBar.d.ts +21 -13
- package/dist/ActionBar.d.ts.map +1 -1
- package/dist/ActionGroup.d.ts +8 -8
- package/dist/ActionGroup.d.ts.map +1 -1
- package/dist/Alert.d.ts +5 -5
- package/dist/Alert.d.ts.map +1 -1
- package/dist/Autocomplete.d.ts +5 -5
- package/dist/Autocomplete.d.ts.map +1 -1
- package/dist/Breadcrumbs.d.ts +18 -7
- package/dist/Breadcrumbs.d.ts.map +1 -1
- package/dist/Button.d.ts +24 -5
- package/dist/Button.d.ts.map +1 -1
- package/dist/Calendar.d.ts +38 -7
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Checkbox.d.ts +32 -7
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Collection.d.ts +19 -14
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Color.d.ts +103 -14
- package/dist/Color.d.ts.map +1 -1
- package/dist/ColorEditor.d.ts +6 -6
- package/dist/ColorEditor.d.ts.map +1 -1
- package/dist/ComboBox.d.ts +85 -19
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ContextualHelpTrigger.d.ts +2 -2
- package/dist/ContextualHelpTrigger.d.ts.map +1 -1
- package/dist/DateField.d.ts +8 -6
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DatePicker.d.ts +53 -22
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DateRangePickerContext.d.ts +30 -0
- package/dist/DateRangePickerContext.d.ts.map +1 -0
- package/dist/Dialog.d.ts +5 -5
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Disclosure.d.ts +23 -5
- package/dist/Disclosure.d.ts.map +1 -1
- package/dist/DragAndDrop.d.ts +6 -6
- package/dist/DragAndDrop.d.ts.map +1 -1
- package/dist/DragPreview.d.ts +2 -2
- package/dist/DragPreview.d.ts.map +1 -1
- package/dist/DropZone.d.ts +4 -4
- package/dist/DropZone.d.ts.map +1 -1
- package/dist/FieldError.d.ts +9 -5
- package/dist/FieldError.d.ts.map +1 -1
- package/dist/FileTrigger.d.ts +3 -3
- package/dist/FileTrigger.d.ts.map +1 -1
- package/dist/Focusable.d.ts +2 -2
- package/dist/Focusable.d.ts.map +1 -1
- package/dist/Form.d.ts +18 -4
- package/dist/Form.d.ts.map +1 -1
- package/dist/GridList.d.ts +32 -12
- package/dist/GridList.d.ts.map +1 -1
- package/dist/HiddenDateInput.d.ts +26 -0
- package/dist/HiddenDateInput.d.ts.map +1 -0
- package/dist/HiddenTimeInput.d.ts +25 -0
- package/dist/HiddenTimeInput.d.ts.map +1 -0
- package/dist/Icon.d.ts +5 -5
- package/dist/Icon.d.ts.map +1 -1
- package/dist/Keyboard.d.ts +1 -1
- package/dist/Landmark.d.ts +3 -3
- package/dist/Landmark.d.ts.map +1 -1
- package/dist/Link.d.ts +10 -4
- package/dist/Link.d.ts.map +1 -1
- package/dist/ListBox.d.ts +32 -12
- package/dist/ListBox.d.ts.map +1 -1
- package/dist/ListDropTargetDelegate.d.ts +6 -6
- package/dist/ListDropTargetDelegate.d.ts.map +1 -1
- package/dist/Menu.d.ts +65 -14
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Meter.d.ts +3 -3
- package/dist/Meter.d.ts.map +1 -1
- package/dist/Modal.d.ts +5 -5
- package/dist/Modal.d.ts.map +1 -1
- package/dist/NumberField.d.ts +8 -12
- package/dist/NumberField.d.ts.map +1 -1
- package/dist/Popover.d.ts +28 -5
- package/dist/Popover.d.ts.map +1 -1
- package/dist/Pressable.d.ts +2 -2
- package/dist/Pressable.d.ts.map +1 -1
- package/dist/ProgressBar.d.ts +5 -3
- package/dist/ProgressBar.d.ts.map +1 -1
- package/dist/RadioGroup.d.ts +43 -9
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RangeCalendar.d.ts +34 -7
- package/dist/RangeCalendar.d.ts.map +1 -1
- package/dist/RouterProvider.d.ts +2 -2
- package/dist/RouterProvider.d.ts.map +1 -1
- package/dist/SearchField.d.ts +23 -20
- package/dist/SearchField.d.ts.map +1 -1
- package/dist/Select.d.ts +41 -11
- package/dist/Select.d.ts.map +1 -1
- package/dist/SelectionIndicator.d.ts +3 -3
- package/dist/SelectionIndicator.d.ts.map +1 -1
- package/dist/Separator.d.ts +9 -3
- package/dist/Separator.d.ts.map +1 -1
- package/dist/SharedElementTransition.d.ts +6 -4
- package/dist/SharedElementTransition.d.ts.map +1 -1
- package/dist/Slider.d.ts +12 -8
- package/dist/Slider.d.ts.map +1 -1
- package/dist/StepList.d.ts +90 -0
- package/dist/StepList.d.ts.map +1 -0
- package/dist/Switch.d.ts +11 -5
- package/dist/Switch.d.ts.map +1 -1
- package/dist/Table.d.ts +187 -23
- package/dist/Table.d.ts.map +1 -1
- package/dist/Tabs.d.ts +45 -9
- package/dist/Tabs.d.ts.map +1 -1
- package/dist/TagGroup.d.ts +12 -10
- package/dist/TagGroup.d.ts.map +1 -1
- package/dist/Text.d.ts +2 -2
- package/dist/TextField.d.ts +15 -11
- package/dist/TextField.d.ts.map +1 -1
- package/dist/TimeField.d.ts +6 -6
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/Toast.d.ts +29 -14
- package/dist/Toast.d.ts.map +1 -1
- package/dist/ToggleButton.d.ts +11 -5
- package/dist/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButtonGroup.d.ts +7 -7
- package/dist/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/Toolbar.d.ts +7 -3
- package/dist/Toolbar.d.ts.map +1 -1
- package/dist/Tooltip.d.ts +50 -8
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/Tree.d.ts +66 -17
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Virtualizer.d.ts +12 -12
- package/dist/Virtualizer.d.ts.map +1 -1
- package/dist/VirtualizerLayouts.d.ts +2 -2
- package/dist/VirtualizerLayouts.d.ts.map +1 -1
- package/dist/VisuallyHidden.d.ts +1 -1
- package/dist/VisuallyHidden.d.ts.map +1 -1
- package/dist/contexts.d.ts +5 -1
- package/dist/contexts.d.ts.map +1 -1
- package/dist/index.d.ts +73 -71
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23247 -18564
- package/dist/index.js.map +1 -1
- package/dist/index.jsx +18110 -0
- package/dist/index.jsx.map +1 -0
- package/dist/useDragAndDrop.d.ts +13 -13
- package/dist/useDragAndDrop.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/virtualizer/Layout.d.ts +1 -1
- package/dist/virtualizer/Layout.d.ts.map +1 -1
- package/package.json +31 -32
- package/src/ActionBar.tsx +75 -72
- package/src/ActionGroup.tsx +53 -61
- package/src/Alert.tsx +17 -42
- package/src/Autocomplete.tsx +39 -44
- package/src/Breadcrumbs.tsx +149 -80
- package/src/Button.tsx +267 -70
- package/src/Calendar.tsx +218 -138
- package/src/Checkbox.tsx +413 -121
- package/src/Collection.tsx +67 -58
- package/src/Color.tsx +803 -380
- package/src/ColorEditor.tsx +131 -149
- package/src/ComboBox.tsx +414 -249
- package/src/ContextualHelpTrigger.tsx +86 -74
- package/src/DateField.tsx +185 -91
- package/src/DatePicker.tsx +524 -213
- package/src/DateRangePickerContext.tsx +44 -0
- package/src/Dialog.tsx +156 -118
- package/src/Disclosure.tsx +127 -80
- package/src/DragAndDrop.tsx +60 -54
- package/src/DragPreview.tsx +13 -11
- package/src/DropZone.tsx +42 -22
- package/src/FieldError.tsx +45 -23
- package/src/FileTrigger.tsx +19 -19
- package/src/Focusable.tsx +21 -24
- package/src/Form.tsx +71 -16
- package/src/GridList.tsx +273 -197
- package/src/HiddenDateInput.tsx +153 -0
- package/src/HiddenTimeInput.tsx +133 -0
- package/src/Icon.tsx +22 -43
- package/src/Keyboard.tsx +3 -3
- package/src/Landmark.tsx +37 -63
- package/src/Link.tsx +125 -75
- package/src/ListBox.tsx +332 -233
- package/src/ListDropTargetDelegate.ts +81 -80
- package/src/Menu.tsx +1023 -274
- package/src/Meter.tsx +38 -56
- package/src/Modal.tsx +243 -175
- package/src/NumberField.tsx +139 -143
- package/src/Popover.tsx +386 -233
- package/src/Pressable.tsx +21 -21
- package/src/ProgressBar.tsx +48 -57
- package/src/RadioGroup.tsx +524 -122
- package/src/RangeCalendar.tsx +157 -90
- package/src/RouterProvider.tsx +30 -47
- package/src/SearchField.tsx +362 -143
- package/src/Select.tsx +656 -233
- package/src/SelectionIndicator.tsx +18 -15
- package/src/Separator.tsx +47 -49
- package/src/SharedElementTransition.tsx +103 -97
- package/src/Slider.tsx +138 -98
- package/src/StepList.tsx +272 -0
- package/src/Switch.tsx +93 -46
- package/src/Table.tsx +1308 -342
- package/src/Tabs.tsx +324 -103
- package/src/TagGroup.tsx +139 -126
- package/src/Text.tsx +3 -3
- package/src/TextField.tsx +389 -79
- package/src/TimeField.tsx +136 -76
- package/src/Toast.tsx +209 -157
- package/src/ToggleButton.tsx +47 -37
- package/src/ToggleButtonGroup.tsx +39 -34
- package/src/Toolbar.tsx +54 -69
- package/src/Tooltip.tsx +387 -119
- package/src/Tree.tsx +651 -368
- package/src/Virtualizer.tsx +208 -180
- package/src/VirtualizerLayouts.ts +45 -30
- package/src/VisuallyHidden.tsx +19 -19
- package/src/contexts.ts +29 -37
- package/src/index.ts +110 -195
- package/src/useDragAndDrop.ts +87 -71
- package/src/utils.tsx +40 -55
- package/src/virtualizer/Layout.ts +14 -22
- package/dist/index.ssr.js +0 -16996
- package/dist/index.ssr.js.map +0 -1
package/src/DateField.tsx
CHANGED
|
@@ -8,26 +8,29 @@
|
|
|
8
8
|
import {
|
|
9
9
|
type JSX,
|
|
10
10
|
createContext,
|
|
11
|
+
createEffect,
|
|
11
12
|
createMemo,
|
|
12
13
|
createSignal,
|
|
14
|
+
onCleanup,
|
|
13
15
|
splitProps,
|
|
14
16
|
useContext,
|
|
15
17
|
For,
|
|
16
18
|
Show,
|
|
17
|
-
} from
|
|
19
|
+
} from "solid-js";
|
|
18
20
|
import {
|
|
19
21
|
createDateField,
|
|
20
22
|
createDateSegment,
|
|
21
23
|
type AriaDateFieldProps,
|
|
22
|
-
} from
|
|
24
|
+
} from "@proyecto-viviana/solidaria";
|
|
23
25
|
import {
|
|
24
26
|
createDateFieldState,
|
|
27
|
+
access,
|
|
25
28
|
type DateFieldState,
|
|
26
29
|
type DateFieldStateProps,
|
|
27
30
|
type DateSegment as DateSegmentType,
|
|
28
31
|
type CalendarDate,
|
|
29
32
|
type DateValue,
|
|
30
|
-
} from
|
|
33
|
+
} from "@proyecto-viviana/solid-stately";
|
|
31
34
|
import {
|
|
32
35
|
type RenderChildren,
|
|
33
36
|
type ClassNameOrFunction,
|
|
@@ -36,11 +39,13 @@ import {
|
|
|
36
39
|
useRenderProps,
|
|
37
40
|
dataAttr,
|
|
38
41
|
useIsHydrated,
|
|
39
|
-
} from
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
} from "./utils";
|
|
43
|
+
import { HiddenDateInput } from "./HiddenDateInput";
|
|
44
|
+
import { FormContext, type FormProps } from "./Form";
|
|
45
|
+
import {
|
|
46
|
+
DateRangePickerContext,
|
|
47
|
+
type DateRangePickerFieldContextValue,
|
|
48
|
+
} from "./DateRangePickerContext";
|
|
44
49
|
|
|
45
50
|
export interface DateFieldRenderProps {
|
|
46
51
|
/** Whether the field is disabled. */
|
|
@@ -54,8 +59,9 @@ export interface DateFieldRenderProps {
|
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
export interface DateFieldProps<T extends DateValue = DateValue>
|
|
57
|
-
extends
|
|
58
|
-
Omit<
|
|
62
|
+
extends
|
|
63
|
+
Omit<AriaDateFieldProps, "id" | "isDisabled" | "isReadOnly" | "isRequired">,
|
|
64
|
+
Omit<DateFieldStateProps<T>, "locale">,
|
|
59
65
|
SlotProps {
|
|
60
66
|
/** The children of the component. */
|
|
61
67
|
children?: JSX.Element | ((segment: DateSegmentType) => JSX.Element);
|
|
@@ -81,6 +87,8 @@ export interface DateInputProps extends SlotProps {
|
|
|
81
87
|
class?: ClassNameOrFunction<DateInputRenderProps>;
|
|
82
88
|
/** The inline style for the element. */
|
|
83
89
|
style?: StyleOrFunction<DateInputRenderProps>;
|
|
90
|
+
/** Handler called during the pointer down capture phase. */
|
|
91
|
+
onPointerDownCapture?: JSX.EventHandler<HTMLDivElement, PointerEvent>;
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
export interface DateSegmentRenderProps {
|
|
@@ -91,7 +99,7 @@ export interface DateSegmentRenderProps {
|
|
|
91
99
|
/** Whether the segment is a placeholder. */
|
|
92
100
|
isPlaceholder: boolean;
|
|
93
101
|
/** The segment type. */
|
|
94
|
-
type: DateSegmentType[
|
|
102
|
+
type: DateSegmentType["type"];
|
|
95
103
|
/** The text to display. */
|
|
96
104
|
text: string;
|
|
97
105
|
}
|
|
@@ -107,10 +115,6 @@ export interface DateSegmentProps extends SlotProps {
|
|
|
107
115
|
style?: StyleOrFunction<DateSegmentRenderProps>;
|
|
108
116
|
}
|
|
109
117
|
|
|
110
|
-
// ============================================
|
|
111
|
-
// CONTEXT
|
|
112
|
-
// ============================================
|
|
113
|
-
|
|
114
118
|
export interface DateFieldContextValue {
|
|
115
119
|
state: DateFieldState<DateValue>;
|
|
116
120
|
aria: {
|
|
@@ -124,17 +128,79 @@ export interface DateFieldContextValue {
|
|
|
124
128
|
export const DateFieldContext = createContext<DateFieldContextValue | null>(null);
|
|
125
129
|
export const DateFieldStateContext = createContext<DateFieldState<DateValue> | null>(null);
|
|
126
130
|
|
|
131
|
+
function withFormValidationBehavior<P extends object>(props: P, formContext: FormProps | null): P {
|
|
132
|
+
if (!formContext?.validationBehavior) {
|
|
133
|
+
return props;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return new Proxy(props, {
|
|
137
|
+
get(target, property, receiver) {
|
|
138
|
+
const localValue = Reflect.get(target, property, receiver);
|
|
139
|
+
if (property === "validationBehavior" && localValue === undefined) {
|
|
140
|
+
return formContext.validationBehavior;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return localValue;
|
|
144
|
+
},
|
|
145
|
+
has(target, property) {
|
|
146
|
+
return (
|
|
147
|
+
Reflect.has(target, property) ||
|
|
148
|
+
(property === "validationBehavior" && formContext.validationBehavior !== undefined)
|
|
149
|
+
);
|
|
150
|
+
},
|
|
151
|
+
ownKeys(target) {
|
|
152
|
+
const keys = new Set(Reflect.ownKeys(target));
|
|
153
|
+
if (formContext.validationBehavior !== undefined) {
|
|
154
|
+
keys.add("validationBehavior");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return Array.from(keys);
|
|
158
|
+
},
|
|
159
|
+
getOwnPropertyDescriptor(target, property) {
|
|
160
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
|
|
161
|
+
if (descriptor) {
|
|
162
|
+
return descriptor;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (property === "validationBehavior" && formContext.validationBehavior !== undefined) {
|
|
166
|
+
return {
|
|
167
|
+
enumerable: true,
|
|
168
|
+
configurable: true,
|
|
169
|
+
get: () => formContext.validationBehavior,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return undefined;
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
127
178
|
export function useDateFieldContext(): DateFieldContextValue {
|
|
128
179
|
const context = useContext(DateFieldContext);
|
|
129
180
|
if (!context) {
|
|
130
|
-
throw new Error(
|
|
181
|
+
throw new Error("DateField components must be used within a DateField");
|
|
131
182
|
}
|
|
132
183
|
return context;
|
|
133
184
|
}
|
|
134
185
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
186
|
+
function useDateInputContext(
|
|
187
|
+
slot?: string,
|
|
188
|
+
): DateFieldContextValue | DateRangePickerFieldContextValue {
|
|
189
|
+
const dateFieldContext = useContext(DateFieldContext);
|
|
190
|
+
if (dateFieldContext) {
|
|
191
|
+
return dateFieldContext;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const dateRangePickerContext = useContext(DateRangePickerContext);
|
|
195
|
+
if (dateRangePickerContext && slot === "start") {
|
|
196
|
+
return dateRangePickerContext.startFieldContext;
|
|
197
|
+
}
|
|
198
|
+
if (dateRangePickerContext && slot === "end") {
|
|
199
|
+
return dateRangePickerContext.endFieldContext;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
throw new Error("DateInput components must be used within a DateField or DateRangePicker slot");
|
|
203
|
+
}
|
|
138
204
|
|
|
139
205
|
/**
|
|
140
206
|
* A date field allows users to enter and edit date values using a keyboard.
|
|
@@ -150,56 +216,68 @@ export function useDateFieldContext(): DateFieldContextValue {
|
|
|
150
216
|
* ```
|
|
151
217
|
*/
|
|
152
218
|
export function DateField<T extends DateValue = CalendarDate>(
|
|
153
|
-
props: DateFieldProps<T
|
|
219
|
+
props: DateFieldProps<T>,
|
|
154
220
|
): JSX.Element {
|
|
155
221
|
// Use hydration-safe pattern for client-only rendering
|
|
156
222
|
const isHydrated = useIsHydrated();
|
|
223
|
+
const formContext = useContext(FormContext);
|
|
157
224
|
|
|
158
225
|
return (
|
|
159
226
|
<Show
|
|
160
227
|
when={isHydrated()}
|
|
161
|
-
fallback={
|
|
228
|
+
fallback={
|
|
229
|
+
<div class="solidaria-DateField solidaria-DateField--placeholder" aria-hidden="true" />
|
|
230
|
+
}
|
|
162
231
|
>
|
|
163
|
-
<DateFieldInner {...props} />
|
|
232
|
+
<DateFieldInner {...props} __formContext={formContext} />
|
|
164
233
|
</Show>
|
|
165
234
|
);
|
|
166
235
|
}
|
|
167
236
|
|
|
237
|
+
type DateFieldInnerProps<T extends DateValue = DateValue> = DateFieldProps<T> & {
|
|
238
|
+
__formContext?: FormProps | null;
|
|
239
|
+
};
|
|
240
|
+
|
|
168
241
|
/**
|
|
169
242
|
* Internal DateField component that renders after client mount.
|
|
170
243
|
*/
|
|
171
244
|
function DateFieldInner<T extends DateValue = CalendarDate>(
|
|
172
|
-
props:
|
|
245
|
+
props: DateFieldInnerProps<T>,
|
|
173
246
|
): JSX.Element {
|
|
247
|
+
const formContext = props.__formContext ?? useContext(FormContext);
|
|
248
|
+
const mergedProps = withFormValidationBehavior(props, formContext);
|
|
174
249
|
const [local, stateProps, rest] = splitProps(
|
|
175
|
-
|
|
176
|
-
[
|
|
250
|
+
mergedProps,
|
|
251
|
+
["children", "class", "style", "slot", "__formContext"],
|
|
177
252
|
[
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
253
|
+
"value",
|
|
254
|
+
"defaultValue",
|
|
255
|
+
"onChange",
|
|
256
|
+
"minValue",
|
|
257
|
+
"maxValue",
|
|
258
|
+
"isInvalid",
|
|
259
|
+
"isDisabled",
|
|
260
|
+
"isReadOnly",
|
|
261
|
+
"isRequired",
|
|
262
|
+
"locale",
|
|
263
|
+
"granularity",
|
|
264
|
+
"hourCycle",
|
|
265
|
+
"hideTimeZone",
|
|
266
|
+
"placeholderValue",
|
|
267
|
+
"shouldForceLeadingZeros",
|
|
268
|
+
"validationState",
|
|
269
|
+
"validationBehavior",
|
|
270
|
+
"validate",
|
|
271
|
+
"description",
|
|
272
|
+
"errorMessage",
|
|
273
|
+
"isDateUnavailable",
|
|
274
|
+
],
|
|
195
275
|
);
|
|
196
276
|
|
|
197
277
|
const [fieldRef, setFieldRef] = createSignal<HTMLDivElement | null>(null);
|
|
198
278
|
|
|
199
|
-
// Create date field state
|
|
200
279
|
const state = createDateFieldState(stateProps);
|
|
201
280
|
|
|
202
|
-
// Create date field ARIA props
|
|
203
281
|
const fieldAria = createDateField(
|
|
204
282
|
() => ({
|
|
205
283
|
...(rest as Record<string, unknown>),
|
|
@@ -207,10 +285,9 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
|
|
|
207
285
|
errorMessage: stateProps.errorMessage,
|
|
208
286
|
}),
|
|
209
287
|
state as unknown as DateFieldState<DateValue>,
|
|
210
|
-
fieldRef
|
|
288
|
+
fieldRef,
|
|
211
289
|
);
|
|
212
290
|
|
|
213
|
-
// Render props values
|
|
214
291
|
const renderValues = createMemo<DateFieldRenderProps>(() => ({
|
|
215
292
|
isDisabled: state.isDisabled(),
|
|
216
293
|
isReadOnly: state.isReadOnly(),
|
|
@@ -218,16 +295,20 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
|
|
|
218
295
|
isInvalid: state.isInvalid(),
|
|
219
296
|
}));
|
|
220
297
|
|
|
221
|
-
// Resolve render props
|
|
222
298
|
const renderProps = useRenderProps(
|
|
223
299
|
{
|
|
224
300
|
class: local.class,
|
|
225
301
|
style: local.style,
|
|
226
|
-
defaultClassName:
|
|
302
|
+
defaultClassName: "solidaria-DateField",
|
|
227
303
|
},
|
|
228
|
-
renderValues
|
|
304
|
+
renderValues,
|
|
229
305
|
);
|
|
230
306
|
|
|
307
|
+
const validationBehavior = () =>
|
|
308
|
+
(stateProps as { validationBehavior?: "aria" | "native" }).validationBehavior ??
|
|
309
|
+
formContext?.validationBehavior ??
|
|
310
|
+
"native";
|
|
311
|
+
|
|
231
312
|
return (
|
|
232
313
|
<DateFieldStateContext.Provider value={state as unknown as DateFieldState<DateValue>}>
|
|
233
314
|
<DateFieldContext.Provider
|
|
@@ -251,77 +332,92 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
|
|
|
251
332
|
data-required={dataAttr(state.isRequired())}
|
|
252
333
|
data-invalid={dataAttr(state.isInvalid())}
|
|
253
334
|
>
|
|
254
|
-
{
|
|
335
|
+
{local.children as JSX.Element}
|
|
255
336
|
</div>
|
|
337
|
+
<Show when={(rest as Record<string, unknown>).name}>
|
|
338
|
+
<HiddenDateInput
|
|
339
|
+
name={(rest as Record<string, unknown>).name as string | undefined}
|
|
340
|
+
form={(rest as Record<string, unknown>).form as string | undefined}
|
|
341
|
+
value={state.value()}
|
|
342
|
+
autoComplete={(rest as Record<string, unknown>).autoComplete as string | undefined}
|
|
343
|
+
isDisabled={state.isDisabled()}
|
|
344
|
+
isRequired={state.isRequired()}
|
|
345
|
+
validationBehavior={validationBehavior()}
|
|
346
|
+
validationState={state}
|
|
347
|
+
focus={() => {
|
|
348
|
+
fieldRef()?.querySelector<HTMLElement>('[role="spinbutton"]')?.focus();
|
|
349
|
+
}}
|
|
350
|
+
minValue={access(stateProps.minValue) as DateValue | undefined}
|
|
351
|
+
maxValue={access(stateProps.maxValue) as DateValue | undefined}
|
|
352
|
+
granularity={state.granularity}
|
|
353
|
+
/>
|
|
354
|
+
</Show>
|
|
256
355
|
</DateFieldContext.Provider>
|
|
257
356
|
</DateFieldStateContext.Provider>
|
|
258
357
|
);
|
|
259
358
|
}
|
|
260
359
|
|
|
261
|
-
// ============================================
|
|
262
|
-
// DATE INPUT COMPONENT
|
|
263
|
-
// ============================================
|
|
264
|
-
|
|
265
360
|
/**
|
|
266
361
|
* The input area containing date segments.
|
|
267
362
|
*/
|
|
268
363
|
export function DateInput(props: DateInputProps): JSX.Element {
|
|
269
|
-
const context =
|
|
364
|
+
const context = useDateInputContext(props.slot);
|
|
270
365
|
const { state, aria } = context;
|
|
271
366
|
const [isFocused, setIsFocused] = createSignal(false);
|
|
367
|
+
const [inputRef, setInputRef] = createSignal<HTMLDivElement | null>(null);
|
|
272
368
|
|
|
273
|
-
// Render props values
|
|
274
369
|
const renderValues = createMemo<DateInputRenderProps>(() => ({
|
|
275
370
|
isDisabled: state.isDisabled(),
|
|
276
371
|
isFocused: isFocused(),
|
|
277
372
|
}));
|
|
278
373
|
|
|
279
|
-
// Resolve render props
|
|
280
374
|
const renderProps = useRenderProps(
|
|
281
375
|
{
|
|
282
376
|
class: props.class,
|
|
283
377
|
style: props.style,
|
|
284
|
-
defaultClassName:
|
|
378
|
+
defaultClassName: "solidaria-DateInput",
|
|
285
379
|
},
|
|
286
|
-
renderValues
|
|
380
|
+
renderValues,
|
|
287
381
|
);
|
|
288
382
|
|
|
383
|
+
createEffect(() => {
|
|
384
|
+
const element = inputRef();
|
|
385
|
+
const handler = props.onPointerDownCapture;
|
|
386
|
+
if (!element || !handler) return;
|
|
387
|
+
|
|
388
|
+
const listener = (event: PointerEvent) =>
|
|
389
|
+
(handler as unknown as (event: PointerEvent) => void)(event);
|
|
390
|
+
element.addEventListener("pointerdown", listener, { capture: true });
|
|
391
|
+
onCleanup(() => element.removeEventListener("pointerdown", listener, { capture: true }));
|
|
392
|
+
});
|
|
393
|
+
|
|
289
394
|
return (
|
|
290
|
-
<
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
395
|
+
<DateFieldContext.Provider value={context as DateFieldContextValue}>
|
|
396
|
+
<div
|
|
397
|
+
ref={setInputRef}
|
|
398
|
+
{...aria.inputProps}
|
|
399
|
+
class={renderProps.class()}
|
|
400
|
+
style={renderProps.style()}
|
|
401
|
+
data-disabled={dataAttr(state.isDisabled())}
|
|
402
|
+
data-focused={dataAttr(isFocused())}
|
|
403
|
+
onFocusIn={() => setIsFocused(true)}
|
|
404
|
+
onFocusOut={() => setIsFocused(false)}
|
|
405
|
+
>
|
|
406
|
+
<For each={state.segments()}>{(segment) => props.children?.(segment)}</For>
|
|
407
|
+
</div>
|
|
408
|
+
</DateFieldContext.Provider>
|
|
303
409
|
);
|
|
304
410
|
}
|
|
305
411
|
|
|
306
|
-
// ============================================
|
|
307
|
-
// DATE SEGMENT COMPONENT
|
|
308
|
-
// ============================================
|
|
309
|
-
|
|
310
412
|
/**
|
|
311
413
|
* A segment of a date field (year, month, day, etc.).
|
|
312
414
|
*/
|
|
313
415
|
export function DateSegment(props: DateSegmentProps): JSX.Element {
|
|
314
416
|
const { state } = useDateFieldContext();
|
|
315
|
-
const [segmentRef, setSegmentRef] = createSignal<
|
|
417
|
+
const [segmentRef, setSegmentRef] = createSignal<HTMLElement | null>(null);
|
|
316
418
|
|
|
317
|
-
|
|
318
|
-
const segmentAria = createDateSegment(
|
|
319
|
-
{ segment: props.segment },
|
|
320
|
-
state,
|
|
321
|
-
segmentRef
|
|
322
|
-
);
|
|
419
|
+
const segmentAria = createDateSegment({ segment: props.segment }, state, segmentRef);
|
|
323
420
|
|
|
324
|
-
// Render props values
|
|
325
421
|
const renderValues = createMemo<DateSegmentRenderProps>(() => ({
|
|
326
422
|
isFocused: segmentAria.isFocused,
|
|
327
423
|
isEditable: segmentAria.isEditable,
|
|
@@ -330,27 +426,26 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
|
|
|
330
426
|
text: segmentAria.text,
|
|
331
427
|
}));
|
|
332
428
|
|
|
333
|
-
// Resolve render props
|
|
334
429
|
const renderProps = useRenderProps(
|
|
335
430
|
{
|
|
336
431
|
children: props.children,
|
|
337
432
|
class: props.class,
|
|
338
433
|
style: props.style,
|
|
339
|
-
defaultClassName:
|
|
434
|
+
defaultClassName: "solidaria-DateSegment",
|
|
340
435
|
},
|
|
341
|
-
renderValues
|
|
436
|
+
renderValues,
|
|
342
437
|
);
|
|
343
438
|
|
|
344
439
|
// Determine children content - avoid Show for SSR hydration compatibility
|
|
345
440
|
const getChildren = () => {
|
|
346
|
-
if (typeof props.children ===
|
|
441
|
+
if (typeof props.children === "function") {
|
|
347
442
|
return renderProps.renderChildren();
|
|
348
443
|
}
|
|
349
444
|
return segmentAria.text;
|
|
350
445
|
};
|
|
351
446
|
|
|
352
447
|
return (
|
|
353
|
-
<
|
|
448
|
+
<span
|
|
354
449
|
ref={setSegmentRef}
|
|
355
450
|
{...segmentAria.segmentProps}
|
|
356
451
|
class={renderProps.class()}
|
|
@@ -361,7 +456,7 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
|
|
|
361
456
|
data-type={props.segment.type}
|
|
362
457
|
>
|
|
363
458
|
{getChildren()}
|
|
364
|
-
</
|
|
459
|
+
</span>
|
|
365
460
|
);
|
|
366
461
|
}
|
|
367
462
|
|
|
@@ -407,5 +502,4 @@ export function DateFieldErrorMessage(props: DateFieldErrorMessageProps): JSX.El
|
|
|
407
502
|
);
|
|
408
503
|
}
|
|
409
504
|
|
|
410
|
-
// Re-export types
|
|
411
505
|
export type { DateFieldState, DateSegmentType };
|