@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.
@@ -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"]}