@nori-ui/core 1.1.0 → 1.2.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/dist/chunk-XBNVKPJN.js +343 -0
- package/dist/chunk-XBNVKPJN.js.map +1 -0
- package/dist/client.cjs +329 -0
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +1 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.js +8 -7
- package/dist/client.js.map +1 -1
- package/dist/components/DatePicker/index.cjs +3875 -0
- package/dist/components/DatePicker/index.cjs.map +1 -0
- package/dist/components/DatePicker/index.d.cts +58 -0
- package/dist/components/DatePicker/index.d.ts +58 -0
- package/dist/components/DatePicker/index.js +14 -0
- package/dist/components/DatePicker/index.js.map +1 -0
- package/dist/index.cjs +329 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -6
- package/package.json +1 -1
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { Popover } from './chunk-7D2BHQ6M.js';
|
|
2
|
+
import { useLocale, Calendar } from './chunk-HZKXPN6B.js';
|
|
3
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
|
+
import { px } from './chunk-5A2QOOVN.js';
|
|
5
|
+
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
6
|
+
import { __name } from './chunk-WCQVDF3K.js';
|
|
7
|
+
import { getLocalTimeZone } from '@internationalized/date';
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { Platform, Text, Pressable, View } from 'react-native';
|
|
10
|
+
import { jsx, jsxs } from 'nativewind/jsx-runtime';
|
|
11
|
+
|
|
12
|
+
function formatDate(date, locale) {
|
|
13
|
+
try {
|
|
14
|
+
return new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(date.toDate(getLocalTimeZone()));
|
|
15
|
+
} catch {
|
|
16
|
+
return `${date.year}-${String(date.month).padStart(2, "0")}-${String(date.day).padStart(2, "0")}`;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
__name(formatDate, "formatDate");
|
|
20
|
+
function CalendarIcon({ size = 16, color = "currentColor" }) {
|
|
21
|
+
const colors = useThemeColors();
|
|
22
|
+
if (Platform.OS === "web") {
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
"svg",
|
|
25
|
+
{
|
|
26
|
+
width: size,
|
|
27
|
+
height: size,
|
|
28
|
+
viewBox: "0 0 24 24",
|
|
29
|
+
fill: "none",
|
|
30
|
+
stroke: color,
|
|
31
|
+
strokeWidth: "2",
|
|
32
|
+
strokeLinecap: "round",
|
|
33
|
+
strokeLinejoin: "round",
|
|
34
|
+
"aria-hidden": "true",
|
|
35
|
+
children: /* @__PURE__ */ jsx("path", { d: "M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z" })
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
const resolvedColor = color === "currentColor" ? colors.semantic.text.muted : color;
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
Text,
|
|
42
|
+
{
|
|
43
|
+
accessibilityElementsHidden: true,
|
|
44
|
+
importantForAccessibility: "no-hide-descendants",
|
|
45
|
+
style: { fontSize: size, lineHeight: size, color: resolvedColor },
|
|
46
|
+
children: "\u{1F4C5}"
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
__name(CalendarIcon, "CalendarIcon");
|
|
51
|
+
function buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek) {
|
|
52
|
+
const out = {};
|
|
53
|
+
if (minValue !== void 0) {
|
|
54
|
+
out.minValue = minValue;
|
|
55
|
+
}
|
|
56
|
+
if (maxValue !== void 0) {
|
|
57
|
+
out.maxValue = maxValue;
|
|
58
|
+
}
|
|
59
|
+
if (isDateUnavailable !== void 0) {
|
|
60
|
+
out.isDateUnavailable = isDateUnavailable;
|
|
61
|
+
}
|
|
62
|
+
if (firstDayOfWeek !== void 0) {
|
|
63
|
+
out.firstDayOfWeek = firstDayOfWeek;
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
__name(buildCalendarOptional, "buildCalendarOptional");
|
|
68
|
+
function buildTriggerAriaProps(ariaProps) {
|
|
69
|
+
const out = {};
|
|
70
|
+
if (ariaProps["aria-labelledby"] !== void 0) {
|
|
71
|
+
out["aria-labelledby"] = ariaProps["aria-labelledby"];
|
|
72
|
+
}
|
|
73
|
+
if (ariaProps["aria-describedby"] !== void 0) {
|
|
74
|
+
out["aria-describedby"] = ariaProps["aria-describedby"];
|
|
75
|
+
}
|
|
76
|
+
if (ariaProps["aria-invalid"] !== void 0) {
|
|
77
|
+
out["aria-invalid"] = ariaProps["aria-invalid"];
|
|
78
|
+
}
|
|
79
|
+
if (ariaProps["aria-required"] !== void 0) {
|
|
80
|
+
out["aria-required"] = ariaProps["aria-required"];
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
__name(buildTriggerAriaProps, "buildTriggerAriaProps");
|
|
85
|
+
var DatePickerRoot = /* @__PURE__ */ __name(({
|
|
86
|
+
value,
|
|
87
|
+
defaultValue,
|
|
88
|
+
onChange,
|
|
89
|
+
locale: localeProp,
|
|
90
|
+
minValue,
|
|
91
|
+
maxValue,
|
|
92
|
+
isDateUnavailable,
|
|
93
|
+
firstDayOfWeek,
|
|
94
|
+
placeholder,
|
|
95
|
+
disabled = false,
|
|
96
|
+
id,
|
|
97
|
+
name: _name,
|
|
98
|
+
className,
|
|
99
|
+
testID,
|
|
100
|
+
...ariaProps
|
|
101
|
+
}) => {
|
|
102
|
+
const providerLocale = useLocale();
|
|
103
|
+
const locale = localeProp ?? providerLocale;
|
|
104
|
+
const [open, setOpen] = useState(false);
|
|
105
|
+
const isControlled = value !== void 0;
|
|
106
|
+
const [inner, setInner] = useState(defaultValue ?? null);
|
|
107
|
+
const current = isControlled ? value ?? null : inner;
|
|
108
|
+
const handleChange = useCallback(
|
|
109
|
+
(date) => {
|
|
110
|
+
if (!isControlled) {
|
|
111
|
+
setInner(date);
|
|
112
|
+
}
|
|
113
|
+
onChange?.(date);
|
|
114
|
+
setOpen(false);
|
|
115
|
+
},
|
|
116
|
+
[isControlled, onChange]
|
|
117
|
+
);
|
|
118
|
+
const handleOpenChange = useCallback(
|
|
119
|
+
(next) => {
|
|
120
|
+
if (!disabled) {
|
|
121
|
+
setOpen(next);
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
[disabled]
|
|
125
|
+
);
|
|
126
|
+
const displayValue = current ? formatDate(current, locale) : null;
|
|
127
|
+
const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);
|
|
128
|
+
const triggerAriaProps = buildTriggerAriaProps(ariaProps);
|
|
129
|
+
const colors = useThemeColors();
|
|
130
|
+
const hasError = ariaProps["aria-invalid"] === true || ariaProps["aria-invalid"] === "true";
|
|
131
|
+
const pressableStyle = {
|
|
132
|
+
flexDirection: "row",
|
|
133
|
+
alignItems: "center",
|
|
134
|
+
borderWidth: 1,
|
|
135
|
+
borderRadius: px(colors.radius.md),
|
|
136
|
+
paddingHorizontal: px(colors.spacing["3"]),
|
|
137
|
+
paddingVertical: px(colors.spacing["2"]),
|
|
138
|
+
backgroundColor: colors.semantic.background.elevated,
|
|
139
|
+
borderColor: hasError ? colors.color.danger : colors.semantic.border.default,
|
|
140
|
+
opacity: disabled ? 0.6 : 1
|
|
141
|
+
};
|
|
142
|
+
const textStyle = {
|
|
143
|
+
flex: 1,
|
|
144
|
+
fontFamily: colors.fontFamily.body,
|
|
145
|
+
fontSize: px(colors.fontSize.md),
|
|
146
|
+
color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted
|
|
147
|
+
};
|
|
148
|
+
const triggerExtraProps = {
|
|
149
|
+
role: "combobox",
|
|
150
|
+
accessibilityRole: "button",
|
|
151
|
+
"aria-haspopup": "dialog",
|
|
152
|
+
"aria-expanded": open,
|
|
153
|
+
...triggerAriaProps
|
|
154
|
+
};
|
|
155
|
+
if (id !== void 0) {
|
|
156
|
+
triggerExtraProps.id = id;
|
|
157
|
+
triggerExtraProps.nativeID = id;
|
|
158
|
+
}
|
|
159
|
+
if (testID !== void 0) {
|
|
160
|
+
triggerExtraProps.testID = testID;
|
|
161
|
+
}
|
|
162
|
+
if (hasError) {
|
|
163
|
+
triggerExtraProps["aria-invalid"] = true;
|
|
164
|
+
}
|
|
165
|
+
if (ariaProps["aria-required"]) {
|
|
166
|
+
triggerExtraProps["aria-required"] = true;
|
|
167
|
+
}
|
|
168
|
+
if (disabled) {
|
|
169
|
+
triggerExtraProps["aria-disabled"] = true;
|
|
170
|
+
}
|
|
171
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
|
|
172
|
+
/* @__PURE__ */ jsx(Popover.Trigger, { asChild: false, className: cn(className), children: /* @__PURE__ */ jsxs(
|
|
173
|
+
Pressable,
|
|
174
|
+
{
|
|
175
|
+
onPress: disabled ? void 0 : () => setOpen(!open),
|
|
176
|
+
disabled,
|
|
177
|
+
className: cn(
|
|
178
|
+
"flex-row items-center rounded-md border px-3 py-2",
|
|
179
|
+
hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
|
|
180
|
+
disabled ? "opacity-60" : void 0,
|
|
181
|
+
className
|
|
182
|
+
),
|
|
183
|
+
style: pressableStyle,
|
|
184
|
+
...triggerExtraProps,
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsx(Text, { style: textStyle, numberOfLines: 1, children: displayValue ?? placeholder ?? "" }),
|
|
187
|
+
/* @__PURE__ */ jsx(View, { style: { marginLeft: px(colors.spacing["2"]) }, children: /* @__PURE__ */ jsx(CalendarIcon, { size: 16, color: colors.semantic.text.muted }) })
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
) }),
|
|
191
|
+
/* @__PURE__ */ jsx(Popover.Content, { "aria-label": "Date picker", side: "bottom", align: "start", children: /* @__PURE__ */ jsx(
|
|
192
|
+
Calendar,
|
|
193
|
+
{
|
|
194
|
+
mode: "single",
|
|
195
|
+
value: current,
|
|
196
|
+
onChange: (date) => {
|
|
197
|
+
handleChange(date);
|
|
198
|
+
},
|
|
199
|
+
locale,
|
|
200
|
+
...calendarOptional
|
|
201
|
+
}
|
|
202
|
+
) })
|
|
203
|
+
] });
|
|
204
|
+
}, "DatePickerRoot");
|
|
205
|
+
var DatePickerRange = /* @__PURE__ */ __name(({
|
|
206
|
+
value,
|
|
207
|
+
defaultValue,
|
|
208
|
+
onChange,
|
|
209
|
+
locale: localeProp,
|
|
210
|
+
minValue,
|
|
211
|
+
maxValue,
|
|
212
|
+
isDateUnavailable,
|
|
213
|
+
firstDayOfWeek,
|
|
214
|
+
placeholder,
|
|
215
|
+
disabled = false,
|
|
216
|
+
id,
|
|
217
|
+
name: _name,
|
|
218
|
+
className,
|
|
219
|
+
testID,
|
|
220
|
+
...ariaProps
|
|
221
|
+
}) => {
|
|
222
|
+
const providerLocale = useLocale();
|
|
223
|
+
const locale = localeProp ?? providerLocale;
|
|
224
|
+
const [open, setOpen] = useState(false);
|
|
225
|
+
const isControlled = value !== void 0;
|
|
226
|
+
const [inner, setInner] = useState(defaultValue ?? { start: null, end: null });
|
|
227
|
+
const current = isControlled ? value ?? { start: null, end: null } : inner;
|
|
228
|
+
const calendarValue = current.start !== null ? { start: current.start, end: current.end } : null;
|
|
229
|
+
const handleChange = useCallback(
|
|
230
|
+
(calRange) => {
|
|
231
|
+
const next = {
|
|
232
|
+
start: calRange?.start ?? null,
|
|
233
|
+
end: calRange?.end ?? null
|
|
234
|
+
};
|
|
235
|
+
if (!isControlled) {
|
|
236
|
+
setInner(next);
|
|
237
|
+
}
|
|
238
|
+
onChange?.(next);
|
|
239
|
+
if (next.start !== null && next.end !== null) {
|
|
240
|
+
setOpen(false);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
[isControlled, onChange]
|
|
244
|
+
);
|
|
245
|
+
const handleOpenChange = useCallback(
|
|
246
|
+
(next) => {
|
|
247
|
+
if (!disabled) {
|
|
248
|
+
setOpen(next);
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
[disabled]
|
|
252
|
+
);
|
|
253
|
+
let displayValue = null;
|
|
254
|
+
if (current.start !== null) {
|
|
255
|
+
const startStr = formatDate(current.start, locale);
|
|
256
|
+
const endStr = current.end !== null ? formatDate(current.end, locale) : "";
|
|
257
|
+
displayValue = `${startStr} \u2013 ${endStr}`;
|
|
258
|
+
}
|
|
259
|
+
const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);
|
|
260
|
+
const triggerAriaProps = buildTriggerAriaProps(ariaProps);
|
|
261
|
+
const colors = useThemeColors();
|
|
262
|
+
const hasError = ariaProps["aria-invalid"] === true || ariaProps["aria-invalid"] === "true";
|
|
263
|
+
const pressableStyle = {
|
|
264
|
+
flexDirection: "row",
|
|
265
|
+
alignItems: "center",
|
|
266
|
+
borderWidth: 1,
|
|
267
|
+
borderRadius: px(colors.radius.md),
|
|
268
|
+
paddingHorizontal: px(colors.spacing["3"]),
|
|
269
|
+
paddingVertical: px(colors.spacing["2"]),
|
|
270
|
+
backgroundColor: colors.semantic.background.elevated,
|
|
271
|
+
borderColor: hasError ? colors.color.danger : colors.semantic.border.default,
|
|
272
|
+
opacity: disabled ? 0.6 : 1
|
|
273
|
+
};
|
|
274
|
+
const textStyle = {
|
|
275
|
+
flex: 1,
|
|
276
|
+
fontFamily: colors.fontFamily.body,
|
|
277
|
+
fontSize: px(colors.fontSize.md),
|
|
278
|
+
color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted
|
|
279
|
+
};
|
|
280
|
+
const triggerExtraProps = {
|
|
281
|
+
role: "combobox",
|
|
282
|
+
accessibilityRole: "button",
|
|
283
|
+
"aria-haspopup": "dialog",
|
|
284
|
+
"aria-expanded": open,
|
|
285
|
+
...triggerAriaProps
|
|
286
|
+
};
|
|
287
|
+
if (id !== void 0) {
|
|
288
|
+
triggerExtraProps.id = id;
|
|
289
|
+
triggerExtraProps.nativeID = id;
|
|
290
|
+
}
|
|
291
|
+
if (testID !== void 0) {
|
|
292
|
+
triggerExtraProps.testID = testID;
|
|
293
|
+
}
|
|
294
|
+
if (hasError) {
|
|
295
|
+
triggerExtraProps["aria-invalid"] = true;
|
|
296
|
+
}
|
|
297
|
+
if (ariaProps["aria-required"]) {
|
|
298
|
+
triggerExtraProps["aria-required"] = true;
|
|
299
|
+
}
|
|
300
|
+
if (disabled) {
|
|
301
|
+
triggerExtraProps["aria-disabled"] = true;
|
|
302
|
+
}
|
|
303
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
|
|
304
|
+
/* @__PURE__ */ jsx(Popover.Trigger, { asChild: false, className: cn(className), children: /* @__PURE__ */ jsxs(
|
|
305
|
+
Pressable,
|
|
306
|
+
{
|
|
307
|
+
onPress: disabled ? void 0 : () => setOpen(!open),
|
|
308
|
+
disabled,
|
|
309
|
+
className: cn(
|
|
310
|
+
"flex-row items-center rounded-md border px-3 py-2",
|
|
311
|
+
hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
|
|
312
|
+
disabled ? "opacity-60" : void 0,
|
|
313
|
+
className
|
|
314
|
+
),
|
|
315
|
+
style: pressableStyle,
|
|
316
|
+
...triggerExtraProps,
|
|
317
|
+
children: [
|
|
318
|
+
/* @__PURE__ */ jsx(Text, { style: textStyle, numberOfLines: 1, children: displayValue ?? placeholder ?? "" }),
|
|
319
|
+
/* @__PURE__ */ jsx(View, { style: { marginLeft: px(colors.spacing["2"]) }, children: /* @__PURE__ */ jsx(CalendarIcon, { size: 16, color: colors.semantic.text.muted }) })
|
|
320
|
+
]
|
|
321
|
+
}
|
|
322
|
+
) }),
|
|
323
|
+
/* @__PURE__ */ jsx(Popover.Content, { "aria-label": "Date range picker", side: "bottom", align: "start", children: /* @__PURE__ */ jsx(
|
|
324
|
+
Calendar,
|
|
325
|
+
{
|
|
326
|
+
mode: "range",
|
|
327
|
+
value: calendarValue,
|
|
328
|
+
onChange: (range) => {
|
|
329
|
+
handleChange(range);
|
|
330
|
+
},
|
|
331
|
+
locale,
|
|
332
|
+
...calendarOptional
|
|
333
|
+
}
|
|
334
|
+
) })
|
|
335
|
+
] });
|
|
336
|
+
}, "DatePickerRange");
|
|
337
|
+
var DatePicker = Object.assign(DatePickerRoot, {
|
|
338
|
+
Range: DatePickerRange
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
export { DatePicker };
|
|
342
|
+
//# sourceMappingURL=chunk-XBNVKPJN.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-XBNVKPJN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DatePicker/DatePicker.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-XBNVKPJN.js","sourcesContent":["'use client';\n\nimport type { CalendarDate } from '@internationalized/date';\nimport { getLocalTimeZone } from '@internationalized/date';\nimport { useCallback, useState } from 'react';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { useLocale } from '../../i18n/locale';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport type { DateRange } from '../Calendar';\nimport { Calendar } from '../Calendar';\nimport { Popover } from '../Popover';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Format a single CalendarDate for display using Intl. */\nfunction formatDate(date: CalendarDate, locale: string): string {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date.toDate(getLocalTimeZone()));\n } catch {\n return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Calendar icon\n// ---------------------------------------------------------------------------\n\nfunction CalendarIcon({ size = 16, color = 'currentColor' }: { size?: number; color?: string }) {\n const colors = useThemeColors();\n\n if (Platform.OS === 'web') {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z\" />\n </svg>\n );\n }\n\n const resolvedColor = color === 'currentColor' ? colors.semantic.text.muted : color;\n return (\n <RNText\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{ fontSize: size, lineHeight: size, color: resolvedColor }}\n >\n {'📅'}\n </RNText>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DatePickerProps = {\n value?: CalendarDate | null;\n defaultValue?: CalendarDate | null;\n onChange?: (date: CalendarDate | null) => void;\n\n /** BCP 47 locale; defaults from NoriProvider's i18n context. */\n locale?: string;\n\n /** Min/max selectable date. */\n minValue?: CalendarDate;\n maxValue?: CalendarDate;\n\n /** Custom unavailable predicate. */\n isDateUnavailable?: (date: CalendarDate) => boolean;\n\n /** First day of week override (0=Sun, 1=Mon, ...). Defaults from locale. */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n /** Placeholder text shown when no value. */\n placeholder?: string;\n\n /** Disable the whole picker. */\n disabled?: boolean;\n\n // A11y / Field.Control hook props\n id?: string;\n name?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n 'aria-required'?: boolean;\n\n testID?: string;\n className?: string;\n};\n\nexport type DateRangeValue = { start: CalendarDate | null; end: CalendarDate | null };\n\nexport type DatePickerRangeProps = {\n value?: DateRangeValue;\n defaultValue?: DateRangeValue;\n onChange?: (range: DateRangeValue) => void;\n\n locale?: string;\n minValue?: CalendarDate;\n maxValue?: CalendarDate;\n isDateUnavailable?: (date: CalendarDate) => boolean;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n placeholder?: string;\n disabled?: boolean;\n\n id?: string;\n name?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n 'aria-required'?: boolean;\n\n testID?: string;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Shared Calendar optional props builder\n// ---------------------------------------------------------------------------\n\ntype CalendarOptional = {\n minValue?: CalendarDate;\n maxValue?: CalendarDate;\n isDateUnavailable?: (date: CalendarDate) => boolean;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nfunction buildCalendarOptional(\n minValue: CalendarDate | undefined,\n maxValue: CalendarDate | undefined,\n isDateUnavailable: ((date: CalendarDate) => boolean) | undefined,\n firstDayOfWeek: (0 | 1 | 2 | 3 | 4 | 5 | 6) | undefined\n): CalendarOptional {\n const out: CalendarOptional = {};\n if (minValue !== undefined) {\n out.minValue = minValue;\n }\n if (maxValue !== undefined) {\n out.maxValue = maxValue;\n }\n if (isDateUnavailable !== undefined) {\n out.isDateUnavailable = isDateUnavailable;\n }\n if (firstDayOfWeek !== undefined) {\n out.firstDayOfWeek = firstDayOfWeek;\n }\n return out;\n}\n\nfunction buildTriggerAriaProps(ariaProps: {\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n 'aria-required'?: boolean;\n}): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (ariaProps['aria-labelledby'] !== undefined) {\n out['aria-labelledby'] = ariaProps['aria-labelledby'];\n }\n if (ariaProps['aria-describedby'] !== undefined) {\n out['aria-describedby'] = ariaProps['aria-describedby'];\n }\n if (ariaProps['aria-invalid'] !== undefined) {\n out['aria-invalid'] = ariaProps['aria-invalid'];\n }\n if (ariaProps['aria-required'] !== undefined) {\n out['aria-required'] = ariaProps['aria-required'];\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// DatePicker (single)\n//\n// Uses Popover.Trigger + asChild so the Popover correctly sets the trigger\n// ref for web positioning and handles outside-click dismissal.\n// The trigger renders as a Pressable (via Popover.Trigger asChild pattern).\n// ---------------------------------------------------------------------------\n\nconst DatePickerRoot = ({\n value,\n defaultValue,\n onChange,\n locale: localeProp,\n minValue,\n maxValue,\n isDateUnavailable,\n firstDayOfWeek,\n placeholder,\n disabled = false,\n id,\n name: _name,\n className,\n testID,\n ...ariaProps\n}: DatePickerProps) => {\n const providerLocale = useLocale();\n const locale = localeProp ?? providerLocale;\n\n const [open, setOpen] = useState(false);\n\n const isControlled = value !== undefined;\n const [inner, setInner] = useState<CalendarDate | null>(defaultValue ?? null);\n const current = isControlled ? (value ?? null) : inner;\n\n const handleChange = useCallback(\n (date: CalendarDate | null) => {\n if (!isControlled) {\n setInner(date);\n }\n onChange?.(date);\n setOpen(false);\n },\n [isControlled, onChange]\n );\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!disabled) {\n setOpen(next);\n }\n },\n [disabled]\n );\n\n const displayValue = current ? formatDate(current, locale) : null;\n const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);\n const triggerAriaProps = buildTriggerAriaProps(ariaProps);\n\n const colors = useThemeColors();\n const hasError = ariaProps['aria-invalid'] === true || (ariaProps['aria-invalid'] as unknown as string) === 'true';\n\n const pressableStyle = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n borderWidth: 1,\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: hasError ? colors.color.danger : colors.semantic.border.default,\n opacity: disabled ? 0.6 : 1,\n };\n\n const textStyle = {\n flex: 1,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted,\n };\n\n // Extra a11y props for the trigger\n const triggerExtraProps: Record<string, unknown> = {\n role: 'combobox',\n accessibilityRole: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': open,\n ...triggerAriaProps,\n };\n if (id !== undefined) {\n triggerExtraProps.id = id;\n triggerExtraProps.nativeID = id;\n }\n if (testID !== undefined) {\n triggerExtraProps.testID = testID;\n }\n if (hasError) {\n triggerExtraProps['aria-invalid'] = true;\n }\n if (ariaProps['aria-required']) {\n triggerExtraProps['aria-required'] = true;\n }\n if (disabled) {\n triggerExtraProps['aria-disabled'] = true;\n }\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <Popover.Trigger asChild={false} className={cn(className)}>\n <Pressable\n onPress={disabled ? undefined : () => setOpen(!open)}\n disabled={disabled}\n className={cn(\n 'flex-row items-center rounded-md border px-3 py-2',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={pressableStyle}\n {...(triggerExtraProps as Record<string, unknown>)}\n >\n <RNText style={textStyle} numberOfLines={1}>\n {displayValue ?? placeholder ?? ''}\n </RNText>\n <View style={{ marginLeft: px(colors.spacing['2']) }}>\n <CalendarIcon size={16} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n </Popover.Trigger>\n <Popover.Content aria-label=\"Date picker\" side=\"bottom\" align=\"start\">\n <Calendar\n mode=\"single\"\n value={current}\n onChange={(date) => {\n handleChange(date as CalendarDate | null);\n }}\n locale={locale}\n {...calendarOptional}\n />\n </Popover.Content>\n </Popover>\n );\n};\n\n// ---------------------------------------------------------------------------\n// DatePicker.Range\n// ---------------------------------------------------------------------------\n\nconst DatePickerRange = ({\n value,\n defaultValue,\n onChange,\n locale: localeProp,\n minValue,\n maxValue,\n isDateUnavailable,\n firstDayOfWeek,\n placeholder,\n disabled = false,\n id,\n name: _name,\n className,\n testID,\n ...ariaProps\n}: DatePickerRangeProps) => {\n const providerLocale = useLocale();\n const locale = localeProp ?? providerLocale;\n\n const [open, setOpen] = useState(false);\n\n const isControlled = value !== undefined;\n const [inner, setInner] = useState<DateRangeValue>(defaultValue ?? { start: null, end: null });\n const current = isControlled ? (value ?? { start: null, end: null }) : inner;\n\n const calendarValue: DateRange | null = current.start !== null ? { start: current.start, end: current.end } : null;\n\n const handleChange = useCallback(\n (calRange: DateRange | null) => {\n const next: DateRangeValue = {\n start: calRange?.start ?? null,\n end: calRange?.end ?? null,\n };\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n if (next.start !== null && next.end !== null) {\n setOpen(false);\n }\n },\n [isControlled, onChange]\n );\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!disabled) {\n setOpen(next);\n }\n },\n [disabled]\n );\n\n let displayValue: string | null = null;\n if (current.start !== null) {\n const startStr = formatDate(current.start, locale);\n const endStr = current.end !== null ? formatDate(current.end, locale) : '';\n displayValue = `${startStr} – ${endStr}`;\n }\n\n const calendarOptional = buildCalendarOptional(minValue, maxValue, isDateUnavailable, firstDayOfWeek);\n const triggerAriaProps = buildTriggerAriaProps(ariaProps);\n\n const colors = useThemeColors();\n const hasError = ariaProps['aria-invalid'] === true || (ariaProps['aria-invalid'] as unknown as string) === 'true';\n\n const pressableStyle = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n borderWidth: 1,\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: hasError ? colors.color.danger : colors.semantic.border.default,\n opacity: disabled ? 0.6 : 1,\n };\n\n const textStyle = {\n flex: 1,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: displayValue ? colors.semantic.text.default : colors.semantic.text.muted,\n };\n\n const triggerExtraProps: Record<string, unknown> = {\n role: 'combobox',\n accessibilityRole: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': open,\n ...triggerAriaProps,\n };\n if (id !== undefined) {\n triggerExtraProps.id = id;\n triggerExtraProps.nativeID = id;\n }\n if (testID !== undefined) {\n triggerExtraProps.testID = testID;\n }\n if (hasError) {\n triggerExtraProps['aria-invalid'] = true;\n }\n if (ariaProps['aria-required']) {\n triggerExtraProps['aria-required'] = true;\n }\n if (disabled) {\n triggerExtraProps['aria-disabled'] = true;\n }\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <Popover.Trigger asChild={false} className={cn(className)}>\n <Pressable\n onPress={disabled ? undefined : () => setOpen(!open)}\n disabled={disabled}\n className={cn(\n 'flex-row items-center rounded-md border px-3 py-2',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={pressableStyle}\n {...(triggerExtraProps as Record<string, unknown>)}\n >\n <RNText style={textStyle} numberOfLines={1}>\n {displayValue ?? placeholder ?? ''}\n </RNText>\n <View style={{ marginLeft: px(colors.spacing['2']) }}>\n <CalendarIcon size={16} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n </Popover.Trigger>\n <Popover.Content aria-label=\"Date range picker\" side=\"bottom\" align=\"start\">\n <Calendar\n mode=\"range\"\n value={calendarValue}\n onChange={(range) => {\n handleChange(range as DateRange | null);\n }}\n locale={locale}\n {...calendarOptional}\n />\n </Popover.Content>\n </Popover>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public export\n// ---------------------------------------------------------------------------\n\nexport const DatePicker = Object.assign(DatePickerRoot, {\n Range: DatePickerRange,\n});\n"]}
|