@underverse-ui/underverse 2.0.41 → 2.0.43

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.
@@ -283,6 +283,7 @@ var DatePicker = ({
283
283
  id,
284
284
  value,
285
285
  onChange,
286
+ formatDate: formatDate2,
286
287
  placeholder,
287
288
  className,
288
289
  disabled = false,
@@ -491,6 +492,9 @@ var DatePicker = ({
491
492
  setIsOpen(false);
492
493
  };
493
494
  const formatDateDisplay = (date) => {
495
+ if (formatDate2) {
496
+ return formatDate2(date);
497
+ }
494
498
  return date.toLocaleDateString(locale === "vi" ? "vi-VN" : "en-US", {
495
499
  day: "numeric",
496
500
  month: "long",
@@ -950,6 +954,7 @@ var DateRangePicker = ({
950
954
  startDate,
951
955
  endDate,
952
956
  onChange,
957
+ formatDate: formatDate2,
953
958
  placeholder = "Select date range...",
954
959
  className,
955
960
  label,
@@ -982,10 +987,11 @@ var DateRangePicker = ({
982
987
  }, []);
983
988
  const getRangeString = React.useCallback((s, e) => {
984
989
  if (!s) return "";
985
- const startStr = formatDateShort(s, locale);
990
+ const startStr = formatDate2 ? formatDate2(s) : formatDateShort(s, locale);
986
991
  if (!e) return `${startStr} - `;
987
- return `${startStr} - ${formatDateShort(e, locale)}`;
988
- }, [locale]);
992
+ const endStr = formatDate2 ? formatDate2(e) : formatDateShort(e, locale);
993
+ return `${startStr} - ${endStr}`;
994
+ }, [locale, formatDate2]);
989
995
  React.useEffect(() => {
990
996
  setInputValue((currentInput) => {
991
997
  if (startDate) {
@@ -1529,7 +1535,7 @@ var DateRangePicker = ({
1529
1535
  )
1530
1536
  ] })
1531
1537
  ] });
1532
- const displayFormat = (date) => formatDateShort(date);
1538
+ const displayFormat = (date) => formatDate2 ? formatDate2(date) : formatDateShort(date);
1533
1539
  const displayLabel = tempStart && tempEnd ? `${displayFormat(tempStart)} - ${displayFormat(tempEnd)}` : tempStart ? `${displayFormat(tempStart)} - ...` : placeholder;
1534
1540
  const effectiveError = localRequiredError;
1535
1541
  const autoId = useId();
@@ -1689,4 +1695,4 @@ export {
1689
1695
  DateRangePicker,
1690
1696
  CompactDatePicker
1691
1697
  };
1692
- //# sourceMappingURL=chunk-C2EHPHWH.js.map
1698
+ //# sourceMappingURL=chunk-YNALZEN6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/date.ts","../src/components/DatePicker.tsx"],"sourcesContent":["/**\n * Date formatting utilities with locale support\n * Provides consistent date/time formatting across the application\n *\n * @example\n * ```tsx\n * import { DateUtils } from \"@underverse-ui/underverse\";\n *\n * // Format date with default locale (en)\n * DateUtils.formatDate(new Date()); // \"December 25, 2024\"\n *\n * // Format date with Vietnamese locale\n * DateUtils.formatDate(new Date(), \"vi\"); // \"25 tháng 12, 2024\"\n * ```\n */\n\nexport type SupportedLocale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\nconst localeMap: Record<SupportedLocale, string> = {\n en: \"en-US\",\n vi: \"vi-VN\",\n ko: \"ko-KR\",\n ja: \"ja-JP\",\n};\n\n/**\n * Get the browser locale string for a supported locale\n */\nfunction getLocaleString(locale: SupportedLocale = \"en\"): string {\n return localeMap[locale] || localeMap.en;\n}\n\n/**\n * Format date to readable format\n * @example\n * formatDate(new Date(), \"vi\") // \"25 tháng 12, 2024\"\n * formatDate(new Date(), \"en\") // \"December 25, 2024\"\n */\nexport function formatDate(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format date to short format\n * @example\n * formatDateShort(new Date(), \"vi\") // \"25/12/2024\"\n * formatDateShort(new Date(), \"en\") // \"12/25/2024\"\n */\nexport function formatDateShort(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format time only\n * @example formatTime(new Date()) // \"14:30\"\n */\nexport function formatTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleTimeString(getLocaleString(locale), {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date and time\n * @example\n * formatDateTime(new Date(), \"vi\") // \"25/12/2024 14:30\"\n */\nexport function formatDateTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format relative time (time ago)\n * @example\n * formatTimeAgo(new Date(Date.now() - 60000), \"vi\") // \"1 phút trước\"\n * formatTimeAgo(new Date(Date.now() - 60000), \"en\") // \"1 minute ago\"\n */\nexport function formatTimeAgo(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n const labels = {\n en: {\n justNow: \"Just now\",\n minute: (n: number) => `${n} minute${n > 1 ? \"s\" : \"\"} ago`,\n hour: (n: number) => `${n} hour${n > 1 ? \"s\" : \"\"} ago`,\n day: (n: number) => `${n} day${n > 1 ? \"s\" : \"\"} ago`,\n week: (n: number) => `${n} week${n > 1 ? \"s\" : \"\"} ago`,\n month: (n: number) => `${n} month${n > 1 ? \"s\" : \"\"} ago`,\n year: (n: number) => `${n} year${n > 1 ? \"s\" : \"\"} ago`,\n },\n vi: {\n justNow: \"Vừa xong\",\n minute: (n: number) => `${n} phút trước`,\n hour: (n: number) => `${n} giờ trước`,\n day: (n: number) => `${n} ngày trước`,\n week: (n: number) => `${n} tuần trước`,\n month: (n: number) => `${n} tháng trước`,\n year: (n: number) => `${n} năm trước`,\n },\n ko: {\n justNow: \"방금 전\",\n minute: (n: number) => `${n}분 전`,\n hour: (n: number) => `${n}시간 전`,\n day: (n: number) => `${n}일 전`,\n week: (n: number) => `${n}주 전`,\n month: (n: number) => `${n}개월 전`,\n year: (n: number) => `${n}년 전`,\n },\n ja: {\n justNow: \"たった今\",\n minute: (n: number) => `${n}分前`,\n hour: (n: number) => `${n}時間前`,\n day: (n: number) => `${n}日前`,\n week: (n: number) => `${n}週間前`,\n month: (n: number) => `${n}ヶ月前`,\n year: (n: number) => `${n}年前`,\n },\n };\n\n const l = labels[locale] || labels.en;\n\n if (diffSec < 60) return l.justNow;\n if (diffMin < 60) return l.minute(diffMin);\n if (diffHour < 24) return l.hour(diffHour);\n if (diffDay < 7) return l.day(diffDay);\n if (diffWeek < 4) return l.week(diffWeek);\n if (diffMonth < 12) return l.month(diffMonth);\n return l.year(diffYear);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const today = new Date();\n return d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear();\n}\n\n/**\n * Check if date is yesterday\n */\nexport function isYesterday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return d.getDate() === yesterday.getDate() && d.getMonth() === yesterday.getMonth() && d.getFullYear() === yesterday.getFullYear();\n}\n\n/**\n * Format date for input[type=\"date\"]\n * @example formatDateForInput(new Date()) // \"2024-12-25\"\n */\nexport function formatDateForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format date for input[type=\"datetime-local\"]\n * @example formatDateTimeForInput(new Date()) // \"2024-12-25T14:30\"\n */\nexport function formatDateTimeForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = formatDateForInput(date);\n const hours = String(d.getHours()).padStart(2, \"0\");\n const minutes = String(d.getMinutes()).padStart(2, \"0\");\n\n return `${dateStr}T${hours}:${minutes}`;\n}\n\n/**\n * Get day of week\n * @example\n * getDayOfWeek(new Date(), \"vi\") // \"Thứ Hai\"\n * getDayOfWeek(new Date(), \"en\") // \"Monday\"\n */\nexport function getDayOfWeek(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n weekday: \"long\",\n });\n}\n\n/**\n * Format with day of week\n * @example\n * formatDateWithDay(new Date(), \"vi\") // \"Thứ Hai, 25/12/2024\"\n * formatDateWithDay(new Date(), \"en\") // \"Monday, 12/25/2024\"\n */\nexport function formatDateWithDay(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const dayOfWeek = getDayOfWeek(date, locale);\n const dateStr = formatDateShort(date, locale);\n\n return `${dayOfWeek}, ${dateStr}`;\n}\n\n/**\n * Smart date formatting - shows relative time for recent dates, full date for older ones\n * @example\n * formatDateSmart(new Date(), \"vi\")\n * // \"Vừa xong\" (< 1 min)\n * // \"5 phút trước\" (< 1 hour)\n * // \"Hôm nay lúc 14:30\" (today)\n * // \"Hôm qua lúc 14:30\" (yesterday)\n * // \"25/12/2024 14:30\" (older)\n */\nexport function formatDateSmart(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffHour = Math.floor(diffMs / (1000 * 60 * 60));\n\n const labels = {\n en: {\n today: \"Today at\",\n yesterday: \"Yesterday at\",\n },\n vi: {\n today: \"Hôm nay lúc\",\n yesterday: \"Hôm qua lúc\",\n },\n ko: {\n today: \"오늘\",\n yesterday: \"어제\",\n },\n ja: {\n today: \"今日\",\n yesterday: \"昨日\",\n },\n };\n\n const l = labels[locale] || labels.en;\n\n // Less than 1 hour ago - show relative time\n if (diffHour < 1) {\n return formatTimeAgo(date, locale);\n }\n\n // Today\n if (isToday(date)) {\n return `${l.today} ${formatTime(date, locale)}`;\n }\n\n // Yesterday\n if (isYesterday(date)) {\n return `${l.yesterday} ${formatTime(date, locale)}`;\n }\n\n // Less than 7 days - show relative\n if (diffHour < 24 * 7) {\n return formatTimeAgo(date, locale);\n }\n\n // Older - show full date with time\n return formatDateTime(date, locale);\n}\n\n/**\n * Parse date string based on locale\n */\nexport function parseDateString(str: string, locale: SupportedLocale = \"en\"): Date | null {\n if (!str) return null;\n const cleaned = str.trim();\n if (!cleaned) return null;\n\n // Split by common delimiters: /, -, ., or spaces\n const parts = cleaned.split(/[\\/\\-\\.\\s]+/).filter(Boolean);\n if (parts.length !== 3) return null;\n\n let day = 0;\n let month = 0;\n let year = 0;\n\n if (locale === \"vi\") {\n // DD/MM/YYYY\n day = parseInt(parts[0], 10);\n month = parseInt(parts[1], 10);\n year = parseInt(parts[2], 10);\n } else if (locale === \"ja\" || locale === \"ko\") {\n // YYYY/MM/DD\n year = parseInt(parts[0], 10);\n month = parseInt(parts[1], 10);\n day = parseInt(parts[2], 10);\n } else {\n // Default English format: MM/DD/YYYY or YYYY/MM/DD if year comes first\n if (parts[0].length === 4) {\n year = parseInt(parts[0], 10);\n month = parseInt(parts[1], 10);\n day = parseInt(parts[2], 10);\n } else {\n month = parseInt(parts[0], 10);\n day = parseInt(parts[1], 10);\n year = parseInt(parts[2], 10);\n }\n }\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n // Handle 2-digit years (e.g. 26 -> 2026)\n if (year < 100) {\n year += year >= 50 ? 1900 : 2000;\n }\n\n const parsedDate = new Date(year, month - 1, day);\n\n // Validate if day of month is mathematically correct (e.g. rejects Feb 30)\n if (\n parsedDate.getFullYear() === year &&\n parsedDate.getMonth() === month - 1 &&\n parsedDate.getDate() === day\n ) {\n return parsedDate;\n }\n\n return null;\n}\n\n","\"use client\";\n\nimport { useSmartLocale, useSmartTranslations } from \"../hooks/useSmartTranslations\";\nimport { cn } from \"../utils/cn\";\nimport { formatDateShort, parseDateString } from \"../utils/date\";\nimport { useShadCNAnimations } from \"../utils/animations\";\nimport { Calendar, ChevronLeft, ChevronRight, Sparkles, X as XIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useId } from \"react\";\nimport { Popover } from \"./Popover\";\nimport { getBorderRadiusClass, type BorderMode } from \"../utils/radius\";\nimport { useUnderverseUIConfig } from \"../contexts/UnderverseConfigContext\";\nimport {\n formControlFixedClass,\n formControlGroupOutlineClass,\n formControlLabelClass,\n formControlSizeStyles,\n type FormControlSize,\n} from \"../constants/form-control-size\";\n\nfunction normalizeToLocalDate(date: Date | undefined | null): Date | null {\n if (!date) return null;\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/** Public props for the `DatePicker` component. */\nexport interface DatePickerProps {\n id?: string;\n value?: Date;\n onChange: (date: Date | undefined) => void;\n /** Custom date display formatter function */\n formatDate?: (date: Date) => string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n size?: FormControlSize;\n label?: string;\n /** Custom class for label */\n labelClassName?: string;\n required?: boolean;\n todayLabel?: string;\n clearLabel?: string;\n weekdayLabels?: string[];\n /** Disable selecting past dates (before today) */\n disablePastDates?: boolean;\n /** Minimum selectable date (inclusive). Compared by day in local timezone. */\n minDate?: Date;\n /** Maximum selectable date (inclusive). Compared by day in local timezone. */\n maxDate?: Date;\n borderMode?: BorderMode;\n /** Render a compact calendar-button trigger instead of the editable date input. */\n iconOnly?: boolean;\n /** Date format displayed above an icon-only trigger. */\n iconOnlyDateFormat?: \"locale\" | \"year-month-day\";\n /** Resolve the document element that should receive the calendar portal. */\n getPortalContainer?: () => HTMLElement | null;\n}\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n id,\n value,\n onChange,\n formatDate,\n placeholder,\n className,\n disabled = false,\n size: requestedSize = \"md\",\n label,\n labelClassName,\n required,\n todayLabel,\n clearLabel,\n weekdayLabels,\n disablePastDates = false,\n minDate,\n maxDate,\n borderMode,\n iconOnly = false,\n iconOnlyDateFormat = \"locale\",\n getPortalContainer,\n}) => {\n const size = requestedSize === \"xs\" ? \"sm\" : requestedSize === \"xl\" ? \"lg\" : requestedSize;\n const t = useSmartTranslations(\"DatePicker\");\n const tv = useSmartTranslations(\"ValidationInput\");\n const locale = useSmartLocale();\n const [isOpen, setIsOpen] = React.useState(false);\n const [viewDate, setViewDate] = React.useState(value || new Date());\n const [viewMode, setViewMode] = React.useState<\"calendar\" | \"month\" | \"year\">(\"calendar\");\n const [localRequiredError, setLocalRequiredError] = React.useState<string | undefined>();\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const wheelContainerRef = React.useRef<HTMLDivElement>(null);\n const wheelDeltaRef = React.useRef(0);\n\n // Focus and typing state\n const [isFocused, setIsFocused] = React.useState(false);\n const [inputValue, setInputValue] = React.useState<string>(\"\");\n\n React.useEffect(() => {\n setInputValue((currentInput) => {\n if (value) {\n const parsed = parseDateString(currentInput, locale);\n const isSame = parsed && parsed.getTime() === value.getTime();\n return isSame ? currentInput : formatDateShort(value, locale);\n }\n\n return isFocused ? currentInput : \"\";\n });\n }, [isFocused, locale, value]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputValue(text);\n const parsedDate = parseDateString(text, locale);\n if (parsedDate) {\n if (!isDateDisabled(parsedDate)) {\n onChange(parsedDate);\n setViewDate(parsedDate);\n setLocalRequiredError(undefined);\n }\n }\n };\n\n const handleInputBlur = () => {\n setIsFocused(false);\n if (!inputValue.trim()) {\n if (required) {\n setLocalRequiredError(tv(\"required\"));\n } else {\n if (value) onChange(undefined);\n setLocalRequiredError(undefined);\n }\n } else {\n const parsedDate = parseDateString(inputValue, locale);\n if (parsedDate && !isDateDisabled(parsedDate)) {\n onChange(parsedDate);\n setInputValue(formatDateShort(parsedDate, locale));\n setLocalRequiredError(undefined);\n } else {\n if (value) {\n setInputValue(formatDateShort(value, locale));\n setLocalRequiredError(undefined);\n } else {\n setInputValue(\"\");\n if (required) {\n setLocalRequiredError(tv(\"required\"));\n }\n }\n }\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const parsedDate = parseDateString(inputValue, locale);\n if (parsedDate && !isDateDisabled(parsedDate)) {\n onChange(parsedDate);\n setInputValue(formatDateShort(parsedDate, locale));\n setViewDate(parsedDate);\n setIsOpen(false);\n setLocalRequiredError(undefined);\n } else if (!inputValue.trim() && !required) {\n onChange(undefined);\n setIsOpen(false);\n setLocalRequiredError(undefined);\n } else {\n setIsOpen(false);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n const normalizeToLocalDay = React.useCallback((date: Date | undefined): Date | null => {\n if (!date) return null;\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n }, []);\n\n const minDay = React.useMemo(() => normalizeToLocalDay(minDate), [minDate, normalizeToLocalDay]);\n const maxDay = React.useMemo(() => normalizeToLocalDay(maxDate), [maxDate, normalizeToLocalDay]);\n\n const isDateDisabled = React.useCallback(\n (date: Date) => {\n const day = normalizeToLocalDay(date);\n if (!day) return false;\n\n if (disablePastDates) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (day < today) return true;\n }\n\n if (minDay && day < minDay) return true;\n if (maxDay && day > maxDay) return true;\n return false;\n },\n [disablePastDates, maxDay, minDay, normalizeToLocalDay],\n );\n\n // Inject ShadCN animations\n useShadCNAnimations();\n\n // Size styles for consistent sizing across all elements\n const sizeStyles = {\n sm: {\n trigger: formControlSizeStyles.sm.compactControl,\n dayCell: \"w-7 h-7 text-xs\",\n monthCell: \"w-6 h-6 text-xs\",\n navButton: \"p-1.5\",\n navIcon: \"h-3 w-3\",\n calendarIcon: \"h-3.5 w-3.5\",\n clearIcon: \"w-2.5 h-2.5\",\n actionButton: \"px-2 py-1 text-[10px] gap-1\",\n actionIcon: \"w-2.5 h-2.5\",\n contentWidth: 240,\n contentPadding: \"p-4\",\n label: formControlSizeStyles.sm.label,\n weekdayLabel: \"text-[9px] py-1\",\n headerMargin: \"mb-2\",\n footerMargin: \"mt-3 pt-2 gap-1.5\",\n },\n md: {\n trigger: formControlSizeStyles.md.control,\n dayCell: \"w-8 h-8 text-sm\",\n monthCell: \"w-8 h-8 text-sm\",\n navButton: \"p-2\",\n navIcon: \"h-4 w-4\",\n calendarIcon: \"h-4 w-4\",\n clearIcon: \"w-3.5 h-3.5\",\n actionButton: \"px-3 py-2 text-xs gap-2\",\n actionIcon: \"w-3.5 h-3.5\",\n contentWidth: 280,\n contentPadding: \"p-5\",\n label: formControlSizeStyles.md.label,\n weekdayLabel: \"text-[10px] py-1.5\",\n headerMargin: \"mb-4\",\n footerMargin: \"mt-4 pt-3 gap-2\",\n },\n lg: {\n trigger: formControlSizeStyles.lg.control,\n dayCell: \"w-10 h-10 text-base\",\n monthCell: \"w-10 h-10 text-base\",\n navButton: \"p-2.5\",\n navIcon: \"h-5 w-5\",\n calendarIcon: \"h-5 w-5\",\n clearIcon: \"w-4 h-4\",\n actionButton: \"px-4 py-2.5 text-sm gap-2\",\n actionIcon: \"w-4 h-4\",\n contentWidth: 340,\n contentPadding: \"p-6\",\n label: formControlSizeStyles.lg.label,\n weekdayLabel: \"text-xs py-2\",\n headerMargin: \"mb-5\",\n footerMargin: \"mt-5 pt-4 gap-2.5\",\n },\n } as const;\n\n // Keep calendar month synced with current value or today\n React.useEffect(() => {\n if (value) {\n setViewDate(value);\n } else {\n setViewDate(new Date());\n }\n }, [value]);\n\n React.useEffect(() => {\n if (disabled || !required || value) {\n setLocalRequiredError(undefined);\n }\n }, [disabled, required, value]);\n\n // Reset view mode when popover closes\n React.useEffect(() => {\n if (!isOpen) {\n setViewMode(\"calendar\");\n }\n }, [isOpen]);\n\n const handleDateSelect = (date: Date) => {\n // Create date in local timezone, not UTC\n // Preserve time from existing value if it's not midnight; otherwise use current time\n let selectedDate: Date;\n if (value && (value.getHours() !== 0 || value.getMinutes() !== 0 || value.getSeconds() !== 0)) {\n // Preserve existing time\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), value.getHours(), value.getMinutes(), value.getSeconds());\n } else {\n // Use current time\n const now = new Date();\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());\n }\n onChange(selectedDate);\n setLocalRequiredError(undefined);\n setIsOpen(false);\n };\n\n const formatDateDisplay = (date: Date): string => {\n if (formatDate) {\n return formatDate(date);\n }\n // Use locale for date formatting\n return date.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n };\n\n const formatIconOnlyDate = (date: Date): string => {\n if (iconOnlyDateFormat === \"year-month-day\") {\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${date.getFullYear()}/${month}/${day}`;\n }\n\n return formatDateDisplay(date);\n };\n\n const getDaysInMonth = (date: Date): number => {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n };\n\n const getFirstDayOfMonth = (date: Date): number => {\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n };\n\n const navigateMonth = React.useCallback((direction: \"prev\" | \"next\") => {\n setViewDate((prev) => {\n const newDate = new Date(prev);\n newDate.setMonth(prev.getMonth() + (direction === \"next\" ? 1 : -1));\n return newDate;\n });\n }, []);\n\n const isElementVerticallyScrollable = (el: Element) => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n if (overflowY !== \"auto\" && overflowY !== \"scroll\") return false;\n const node = el as HTMLElement;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n const renderCalendar = () => {\n const daysInMonth = getDaysInMonth(viewDate);\n const firstDayOfMonth = getFirstDayOfMonth(viewDate);\n const days = [];\n\n // Empty cells for days before the first day of the month\n for (let i = 0; i < firstDayOfMonth; i++) {\n days.push(<div key={`empty-${i}`} className={sizeStyles[size].dayCell.split(\" \").slice(0, 2).join(\" \")} />);\n }\n\n // Days of the month\n for (let day = 1; day <= daysInMonth; day++) {\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), day);\n const isSelected =\n value && date.getDate() === value.getDate() && date.getMonth() === value.getMonth() && date.getFullYear() === value.getFullYear();\n const isToday = date.toDateString() === new Date().toDateString();\n\n const isDisabled = isDateDisabled(date);\n\n // Calculate which row this day is in (0-based)\n const totalDaysFromStart = firstDayOfMonth + day - 1;\n const rowIndex = Math.floor(totalDaysFromStart / 7);\n\n days.push(\n <button\n key={day}\n type=\"button\"\n onClick={() => !isDisabled && handleDateSelect(date)}\n disabled={isDisabled}\n style={{\n animationDelay: isOpen ? `${rowIndex * 40}ms` : \"0ms\",\n }}\n className={cn(\n sizeStyles[size].dayCell,\n \"datepicker-day rounded-lg relative cursor-pointer\",\n \"transition-all duration-200 font-medium active:scale-95\",\n isDisabled && \"opacity-30 cursor-not-allowed text-muted-foreground active:scale-100\",\n isSelected\n ? \"bg-linear-to-br from-primary to-primary/80 text-primary-foreground font-bold shadow-lg shadow-primary/30 scale-110 z-10 hover:from-primary hover:to-primary/70 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus:outline-none\"\n : !isDisabled && \"hover:bg-accent/80 hover:text-accent-foreground hover:scale-105 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus:outline-none focus:bg-accent/90\",\n isToday && !isSelected && \"bg-primary/15 text-primary font-bold ring-2 ring-primary/30\",\n )}\n >\n {day}\n {isToday && !isSelected && <span className=\"absolute -bottom-0.5 left-1/2 -translate-x-1/2 w-1 h-1 rounded-full bg-primary\" />}\n </button>,\n );\n }\n\n return days;\n };\n\n // Render month selector grid\n const renderMonthSelector = () => {\n const months =\n locale === \"vi\"\n ? [\"Th1\", \"Th2\", \"Th3\", \"Th4\", \"Th5\", \"Th6\", \"Th7\", \"Th8\", \"Th9\", \"Th10\", \"Th11\", \"Th12\"]\n : [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n return (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {months.map((month, idx) => {\n const isSelected = viewDate.getMonth() === idx;\n return (\n <button\n key={month}\n type=\"button\"\n onClick={() => {\n setViewDate(new Date(viewDate.getFullYear(), idx, 1));\n setViewMode(\"calendar\");\n }}\n className={cn(\n \"py-2 px-3 rounded-lg text-sm font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 active:scale-95\",\n isSelected ? \"bg-primary text-primary-foreground shadow-md\" : \"hover:bg-accent/80 text-foreground hover:scale-105\",\n )}\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n };\n\n // Render year selector grid\n const renderYearSelector = () => {\n const currentYear = viewDate.getFullYear();\n const startYear = Math.floor(currentYear / 12) * 12;\n const years = Array.from({ length: 12 }, (_, i) => startYear + i);\n\n return (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {years.map((year) => {\n const isSelected = viewDate.getFullYear() === year;\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => {\n setViewDate(new Date(year, viewDate.getMonth(), 1));\n setViewMode(\"month\");\n }}\n className={cn(\n \"py-2 px-3 rounded-lg text-sm font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 active:scale-95\",\n isSelected ? \"bg-primary text-primary-foreground shadow-md\" : \"hover:bg-accent/80 text-foreground hover:scale-105\",\n )}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n };\n\n // Navigate year range for year selector\n const navigateYearRange = (direction: \"prev\" | \"next\") => {\n const currentYear = viewDate.getFullYear();\n const offset = direction === \"next\" ? 12 : -12;\n setViewDate(new Date(currentYear + offset, viewDate.getMonth(), 1));\n };\n\n const datePickerContent = (\n <div ref={wheelContainerRef} data-datepicker className=\"w-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4 px-1\">\n <button\n type=\"button\"\n onClick={() => (viewMode === \"year\" ? navigateYearRange(\"prev\") : navigateMonth(\"prev\"))}\n className={cn(\n \"p-2 rounded-xl transition-all duration-200\",\n \"bg-muted/50 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"hover:scale-110 active:scale-95 hover:shadow-md\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")}\n className={cn(\n \"text-sm font-bold transition-all duration-200 px-2 py-1 rounded-lg\",\n viewMode === \"month\" ? \"bg-primary/15 text-primary\" : \"text-foreground hover:bg-accent/50\",\n )}\n >\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\" })}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")}\n className={cn(\n \"text-sm font-bold transition-all duration-200 px-2 py-1 rounded-lg\",\n viewMode === \"year\" ? \"bg-primary/15 text-primary\" : \"text-foreground hover:bg-accent/50\",\n )}\n >\n {viewDate.getFullYear()}\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => (viewMode === \"year\" ? navigateYearRange(\"next\") : navigateMonth(\"next\"))}\n className={cn(\n \"p-2 rounded-xl transition-all duration-200\",\n \"bg-muted/50 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"hover:scale-110 active:scale-95 hover:shadow-md\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Content based on view mode */}\n {viewMode === \"calendar\" && (\n <>\n {/* Weekday headers */}\n <div className={cn(\"grid grid-cols-7 gap-1 mb-2 px-0.5\")}>\n {(weekdayLabels || (locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"])).map(\n (day, idx) => (\n <div\n key={day}\n className={cn(\n \"text-center font-bold uppercase tracking-wide\",\n sizeStyles[size].weekdayLabel,\n idx === 0 || idx === 6 ? \"text-primary/70\" : \"text-muted-foreground/60\",\n )}\n >\n {day}\n </div>\n ),\n )}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1 p-1 rounded-xl bg-muted/20\">{renderCalendar()}</div>\n </>\n )}\n\n {viewMode === \"month\" && renderMonthSelector()}\n {viewMode === \"year\" && renderYearSelector()}\n\n {/* Footer actions */}\n <div className={cn(\"flex items-center border-t border-border/50\", sizeStyles[size].footerMargin)}>\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date();\n if (isDateDisabled(today)) return;\n handleDateSelect(today);\n }}\n disabled={isDateDisabled(new Date())}\n className={cn(\n \"flex-1 font-semibold rounded-xl\",\n \"bg-linear-to-r from-primary/10 to-primary/5 border border-primary/30\",\n \"text-primary hover:from-primary/20 hover:to-primary/10 hover:border-primary/50\",\n \"transition-all duration-300 flex items-center justify-center\",\n \"hover:scale-[1.02] active:scale-[0.98] hover:shadow-md hover:shadow-primary/10\",\n sizeStyles[size].actionButton,\n isDateDisabled(new Date()) && \"opacity-50 cursor-not-allowed hover:scale-100 active:scale-100\",\n )}\n >\n <Sparkles className={sizeStyles[size].actionIcon} />\n {todayLabel || t(\"today\")}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n onChange(undefined);\n setIsOpen(false);\n setViewDate(new Date());\n }}\n className={cn(\n \"flex-1 font-semibold rounded-xl\",\n \"bg-linear-to-r from-destructive/10 to-destructive/5 border border-destructive/30\",\n \"text-destructive hover:from-destructive/20 hover:to-destructive/10 hover:border-destructive/50\",\n \"transition-all duration-300 flex items-center justify-center\",\n \"hover:scale-[1.02] active:scale-[0.98] hover:shadow-md hover:shadow-destructive/10\",\n sizeStyles[size].actionButton,\n )}\n >\n <XIcon className={sizeStyles[size].actionIcon} />\n {clearLabel || t(\"clear\")}\n </button>\n </div>\n </div>\n );\n\n const autoId = useId();\n const resolvedId = id ? String(id) : `datepicker-${autoId}`;\n const labelId = label ? `${resolvedId}-label` : undefined;\n const panelId = `${resolvedId}-panel`;\n const labelSize = sizeStyles[size].label;\n\n // Radius consistent with Input: sm => rounded-md, md/lg => rounded-lg\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\n const verticalGap = size === \"sm\" ? \"space-y-1.5\" : size === \"lg\" ? \"space-y-2.5\" : \"space-y-2\";\n const effectiveError = localRequiredError;\n\n const globalConfig = useUnderverseUIConfig();\n const resolvedBorderMode = borderMode ?? globalConfig.borderMode ?? \"full\";\n\n return (\n <div className={cn(\"w-full group\", verticalGap)}>\n {label && (\n <div className=\"flex items-center justify-between mb-2\">\n <label\n id={labelId}\n htmlFor={resolvedId}\n onClick={() => inputRef.current?.focus()}\n className={cn(\n labelSize,\n formControlLabelClass,\n \"transition-colors duration-300 cursor-pointer\",\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary hover:text-primary\",\n isOpen && \"text-primary\",\n effectiveError && \"text-destructive\",\n labelClassName,\n )}\n >\n {label}\n {required && <span className=\"text-destructive ml-1 animate-pulse\">*</span>}\n </label>\n </div>\n )}\n <input\n tabIndex={-1}\n aria-hidden=\"true\"\n value={value ? \"selected\" : \"\"}\n onChange={() => {}}\n required={required}\n disabled={disabled}\n onInvalid={(e) => {\n e.preventDefault();\n setLocalRequiredError(tv(\"required\"));\n }}\n className=\"pointer-events-none absolute h-0 w-0 opacity-0\"\n />\n <Popover\n getPortalContainer={getPortalContainer}\n open={isOpen}\n onOpenChange={setIsOpen}\n contentProps={{ id: panelId }}\n placement=\"bottom-start\"\n disabled={disabled}\n contentWidth={sizeStyles[size].contentWidth}\n borderMode={resolvedBorderMode}\n contentClassName={cn(\n \"p-0\",\n \"backdrop-blur-xl bg-popover/95 border-border/40 shadow-2xl\",\n // Keep usable on small viewports (wheel scroll should stay within the popover if it overflows)\n \"max-w-[calc(100vw-1rem)] max-h-[calc(100vh-6rem)] overflow-auto overscroll-contain\",\n sizeStyles[size].contentPadding,\n \"animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-300\",\n )}\n trigger={\n iconOnly ? (\n <button\n type=\"button\"\n aria-label={value ? formatDateDisplay(value) : (placeholder || t(\"placeholder\"))}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n onMouseDown={(event) => event.preventDefault()}\n className={cn(\n \"inline-flex flex-col items-center gap-0.5 rounded px-1 py-0.5 text-sm text-foreground transition-colors\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/45\",\n className,\n )}\n >\n {value ? <span className=\"text-[10px] leading-none whitespace-nowrap\">{formatIconOnlyDate(value)}</span> : null}\n <Calendar className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ) : (\n <div\n ref={triggerRef}\n className={cn(\n \"group flex w-full items-center justify-between bg-background/80 backdrop-blur-sm\",\n formControlFixedClass,\n formControlGroupOutlineClass,\n getBorderRadiusClass(resolvedBorderMode),\n sizeStyles[size].trigger,\n formControlSizeStyles[requestedSize].control,\n disabled\n ? \"border-border/40 opacity-50 cursor-not-allowed\"\n : [\n \"focus-within:border-ring\",\n \"hover:bg-accent/10\",\n ],\n \"transition-all duration-300 ease-out\",\n isOpen && \"border-ring shadow-lg shadow-primary/10\",\n effectiveError && \"border-destructive/60 bg-destructive/5\",\n className,\n )}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 items-center gap-2.5 overflow-hidden\">\n <div\n className={cn(\n \"flex items-center justify-center transition-colors duration-300\",\n isOpen ? \"text-primary\" : \"text-muted-foreground group-hover:text-primary\",\n )}\n >\n <Calendar className={cn(sizeStyles[size].calendarIcon, \"transition-transform duration-300\", isOpen && \"scale-110\")} />\n </div>\n <input\n ref={inputRef}\n id={resolvedId}\n type=\"text\"\n role=\"combobox\"\n aria-label={value ? formatDateDisplay(value) : (placeholder || t(\"placeholder\"))}\n aria-labelledby={labelId}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-required={required}\n aria-invalid={!!effectiveError}\n disabled={disabled}\n placeholder={placeholder || t(\"placeholder\")}\n value={isFocused ? inputValue : (value ? formatDateDisplay(value) : \"\")}\n onChange={handleInputChange}\n onFocus={() => {\n setIsFocused(true);\n if (!disabled) setIsOpen(true);\n }}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n onClick={(e) => {\n if (isOpen) {\n e.stopPropagation();\n }\n }}\n className=\"h-full min-w-0 flex-1 truncate bg-transparent border-none outline-none focus:outline-none p-0 text-foreground font-medium placeholder-muted-foreground/60\"\n />\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {value && (\n <span\n role=\"button\"\n aria-label={clearLabel || t(\"clear\")}\n tabIndex={0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange(undefined);\n setViewDate(new Date());\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n onChange(undefined);\n setLocalRequiredError(undefined);\n setViewDate(new Date());\n }\n }}\n className={cn(\n \"inline-flex items-center justify-center rounded-lg p-1\",\n \"text-muted-foreground hover:text-destructive hover:bg-destructive/10\",\n \"transition-all duration-200 cursor-pointer hover:scale-110\",\n )}\n >\n <XIcon className=\"h-3.5 w-3.5\" />\n </span>\n )}\n <span\n className={cn(\"transition-all duration-300 text-muted-foreground group-hover:text-foreground\", isOpen && \"rotate-180 text-primary\")}\n >\n <svg className={sizeStyles[size].calendarIcon} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </span>\n </div>\n </div>\n )\n }\n >\n {datePickerContent}\n </Popover>\n {effectiveError && <div className=\"text-xs text-destructive\">{effectiveError}</div>}\n </div>\n );\n};\n\n/** Public props for the `DateRangePicker` component. */\nexport interface DateRangePickerProps {\n id?: string;\n startDate?: Date;\n endDate?: Date | null;\n onChange: (start: Date | undefined, end: Date | null | undefined) => void;\n /** Custom date display formatter function applied to both start and end date */\n formatDate?: (date: Date) => string;\n placeholder?: string;\n className?: string;\n label?: string;\n labelClassName?: string;\n required?: boolean;\n /** Disable selecting past dates (before today) */\n disablePastDates?: boolean;\n /** Minimum selectable date (inclusive). Compared by day in local timezone. */\n minDate?: Date;\n /** Maximum selectable date (inclusive). Compared by day in local timezone. */\n maxDate?: Date;\n /** Size variant */\n size?: FormControlSize;\n disabled?: boolean;\n borderMode?: BorderMode;\n /** Resolve the document element that should receive the calendar portal. */\n getPortalContainer?: () => HTMLElement | null;\n}\n\nexport const DateRangePicker: React.FC<DateRangePickerProps> = ({\n id,\n startDate,\n endDate,\n onChange,\n formatDate,\n placeholder = \"Select date range...\",\n className,\n label,\n labelClassName,\n required = false,\n disablePastDates = false,\n minDate,\n maxDate,\n size: requestedSize = \"md\",\n disabled = false,\n borderMode,\n getPortalContainer,\n}) => {\n const size = requestedSize === \"xs\" ? \"sm\" : requestedSize === \"xl\" ? \"lg\" : requestedSize;\n const locale = useSmartLocale();\n const t = useSmartTranslations(\"DatePicker\");\n const tv = useSmartTranslations(\"ValidationInput\");\n const [isOpen, setIsOpen] = React.useState(false);\n const [viewMode, setViewMode] = React.useState<\"calendar\" | \"month\" | \"year\">(\"calendar\");\n const [localRequiredError, setLocalRequiredError] = React.useState<string | undefined>();\n const wheelContainerRef = React.useRef<HTMLDivElement>(null);\n const wheelDeltaRef = React.useRef(0);\n\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Focus and typing state\n const [isFocused, setIsFocused] = React.useState(false);\n const [inputValue, setInputValue] = React.useState<string>(\"\");\n\n const todayDate = React.useMemo(() => {\n const today = new Date();\n return new Date(today.getFullYear(), today.getMonth(), today.getDate());\n }, []);\n\n const getRangeString = React.useCallback((s: Date | null | undefined, e: Date | null | undefined) => {\n if (!s) return \"\";\n const startStr = formatDate ? formatDate(s) : formatDateShort(s, locale);\n if (!e) return `${startStr} - `;\n const endStr = formatDate ? formatDate(e) : formatDateShort(e, locale);\n return `${startStr} - ${endStr}`;\n }, [locale, formatDate]);\n\n React.useEffect(() => {\n setInputValue((currentInput) => {\n if (startDate) {\n const parts = currentInput.split(/\\s*-\\s*/);\n const inputStart = parts[0] ? parseDateString(parts[0], locale) : null;\n const inputEnd = parts[1] ? parseDateString(parts[1], locale) : null;\n const startSame = inputStart && inputStart.getTime() === startDate.getTime();\n const endSame = (!endDate && !inputEnd) || (endDate && inputEnd && endDate.getTime() === inputEnd.getTime());\n\n return startSame && endSame\n ? currentInput\n : getRangeString(startDate, endDate);\n }\n\n return isFocused ? currentInput : \"\";\n });\n }, [endDate, getRangeString, isFocused, locale, startDate]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputValue(text);\n \n const parts = text.split(/\\s*-\\s*/);\n if (parts.length === 2) {\n const s = parseDateString(parts[0], locale);\n const eVal = parseDateString(parts[1], locale);\n if (s) {\n const isStartDisabled = (disablePastDates && s < todayDate) || (!!minDay && s < minDay) || (!!maxDay && s > maxDay);\n if (!isStartDisabled) {\n setTempStart(s);\n if (eVal) {\n const isEndDisabled = (disablePastDates && eVal < todayDate) || (!!minDay && eVal < minDay) || (!!maxDay && eVal > maxDay);\n if (!isEndDisabled && s <= eVal) {\n setTempEnd(eVal);\n onChange(s, eVal);\n setViewDate(s);\n setLocalRequiredError(undefined);\n } else {\n setTempEnd(null);\n onChange(s, null);\n }\n } else {\n setTempEnd(null);\n onChange(s, null);\n }\n }\n }\n } else if (parts.length === 1 && parts[0].trim()) {\n const s = parseDateString(parts[0], locale);\n if (s) {\n const isStartDisabled = (disablePastDates && s < todayDate) || (!!minDay && s < minDay) || (!!maxDay && s > maxDay);\n if (!isStartDisabled) {\n setTempStart(s);\n setTempEnd(null);\n onChange(s, null);\n }\n }\n }\n };\n\n const handleInputBlur = () => {\n setIsFocused(false);\n if (!inputValue.trim()) {\n if (required) {\n setLocalRequiredError(tv(\"required\"));\n } else {\n setTempStart(null);\n setTempEnd(null);\n if (startDate || endDate) onChange(undefined, undefined);\n setLocalRequiredError(undefined);\n }\n } else {\n const parts = inputValue.split(/\\s*-\\s*/);\n const s = parts[0] ? parseDateString(parts[0], locale) : null;\n const eVal = parts[1] ? parseDateString(parts[1], locale) : null;\n \n if (s) {\n const isStartDisabled = (disablePastDates && s < todayDate) || (!!minDay && s < minDay) || (!!maxDay && s > maxDay);\n if (!isStartDisabled) {\n if (eVal) {\n const isEndDisabled = (disablePastDates && eVal < todayDate) || (!!minDay && eVal < minDay) || (!!maxDay && eVal > maxDay);\n if (!isEndDisabled && s <= eVal) {\n setTempStart(s);\n setTempEnd(eVal);\n onChange(s, eVal);\n setInputValue(getRangeString(s, eVal));\n setLocalRequiredError(undefined);\n return;\n }\n } else {\n setTempStart(s);\n setTempEnd(null);\n onChange(s, null);\n setInputValue(getRangeString(s, null));\n setLocalRequiredError(undefined);\n return;\n }\n }\n }\n \n if (startDate) {\n setTempStart(normalizeToLocalDate(startDate));\n setTempEnd(normalizeToLocalDate(endDate));\n setInputValue(getRangeString(startDate, endDate));\n setLocalRequiredError(undefined);\n } else {\n setTempStart(null);\n setTempEnd(null);\n setInputValue(\"\");\n if (required) {\n setLocalRequiredError(tv(\"required\"));\n }\n }\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const parts = inputValue.split(/\\s*-\\s*/);\n const s = parts[0] ? parseDateString(parts[0], locale) : null;\n const eVal = parts[1] ? parseDateString(parts[1], locale) : null;\n \n if (s) {\n const isStartDisabled = (disablePastDates && s < todayDate) || (!!minDay && s < minDay) || (!!maxDay && s > maxDay);\n if (!isStartDisabled) {\n if (eVal) {\n const isEndDisabled = (disablePastDates && eVal < todayDate) || (!!minDay && eVal < minDay) || (!!maxDay && eVal > maxDay);\n if (!isEndDisabled && s <= eVal) {\n setTempStart(s);\n setTempEnd(eVal);\n onChange(s, eVal);\n setInputValue(getRangeString(s, eVal));\n setViewDate(s);\n setIsOpen(false);\n setLocalRequiredError(undefined);\n return;\n }\n } else {\n setTempStart(s);\n setTempEnd(null);\n onChange(s, null);\n setInputValue(getRangeString(s, null));\n setViewDate(s);\n setIsOpen(false);\n setLocalRequiredError(undefined);\n return;\n }\n }\n }\n setIsOpen(false);\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n // Size styles for consistent sizing across all elements\n const sizeStyles = {\n sm: {\n trigger: formControlSizeStyles.sm.compactControl,\n dayCell: \"w-7 h-7 text-xs\",\n monthCell: \"w-6 h-6 text-xs\",\n navButton: \"p-1.5\",\n navIcon: \"h-3 w-3\",\n calendarIcon: \"h-3.5 w-3.5\",\n clearIcon: \"w-2.5 h-2.5\",\n actionButton: \"px-2 py-1 text-[10px] gap-1\",\n actionIcon: \"w-2.5 h-2.5\",\n contentWidth: 240,\n contentPadding: \"p-4\",\n label: formControlSizeStyles.sm.label,\n weekdayLabel: \"text-[9px] py-1\",\n headerMargin: \"mb-2\",\n footerMargin: \"mt-3 pt-2 gap-1.5\",\n },\n md: {\n trigger: formControlSizeStyles.md.control,\n dayCell: \"w-8 h-8 text-sm\",\n monthCell: \"w-8 h-8 text-sm\",\n navButton: \"p-2\",\n navIcon: \"h-4 w-4\",\n calendarIcon: \"h-4 w-4\",\n clearIcon: \"w-3.5 h-3.5\",\n actionButton: \"px-3 py-2 text-xs gap-2\",\n actionIcon: \"w-3.5 h-3.5\",\n contentWidth: 280,\n contentPadding: \"p-5\",\n label: formControlSizeStyles.md.label,\n weekdayLabel: \"text-[10px] py-1.5\",\n headerMargin: \"mb-4\",\n footerMargin: \"mt-4 pt-3 gap-2\",\n },\n lg: {\n trigger: formControlSizeStyles.lg.control,\n dayCell: \"w-10 h-10 text-base\",\n monthCell: \"w-10 h-10 text-base\",\n navButton: \"p-2.5\",\n navIcon: \"h-5 w-5\",\n calendarIcon: \"h-5 w-5\",\n clearIcon: \"w-4 h-4\",\n actionButton: \"px-4 py-2.5 text-sm gap-2\",\n actionIcon: \"w-4 h-4\",\n contentWidth: 340,\n contentPadding: \"p-6\",\n label: formControlSizeStyles.lg.label,\n weekdayLabel: \"text-xs py-2\",\n headerMargin: \"mb-5\",\n footerMargin: \"mt-5 pt-4 gap-2.5\",\n },\n } as const;\n\n const minDay = normalizeToLocalDate(minDate);\n const maxDay = normalizeToLocalDate(maxDate);\n\n // Use passed-in props as the source of truth, but manage a temporary state for selection.\n const [viewDate, setViewDate] = React.useState<Date>(startDate || new Date());\n const [tempStart, setTempStart] = React.useState<Date | null>(normalizeToLocalDate(startDate));\n const [tempEnd, setTempEnd] = React.useState<Date | null>(normalizeToLocalDate(endDate));\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null);\n\n // Sync temp state with props (normalize to avoid timezone issues)\n React.useEffect(() => {\n setTempStart(normalizeToLocalDate(startDate));\n }, [startDate]);\n\n React.useEffect(() => {\n setTempEnd(normalizeToLocalDate(endDate));\n }, [endDate]);\n\n React.useEffect(() => {\n if (!isOpen) {\n setViewMode(\"calendar\");\n }\n }, [isOpen]);\n\n React.useEffect(() => {\n if (!required || (startDate && endDate)) {\n setLocalRequiredError(undefined);\n }\n }, [endDate, required, startDate]);\n\n const isSameDay = (a: Date | null, b: Date | null) => {\n if (!a || !b) return false;\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n };\n const inRange = (d: Date, s: Date, e: Date) => d > s && d < e;\n const getDaysInMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n const getFirstDayOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1).getDay();\n\n const navigateMonth = (direction: \"prev\" | \"next\") => {\n setViewDate((prev) => new Date(prev.getFullYear(), prev.getMonth() + (direction === \"next\" ? 1 : -1), 1));\n };\n\n const navigateYearRange = (direction: \"prev\" | \"next\") => {\n setViewDate((prev) => new Date(prev.getFullYear() + (direction === \"next\" ? 12 : -12), prev.getMonth(), 1));\n };\n\n const isElementVerticallyScrollable = (el: Element) => {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY;\n if (overflowY !== \"auto\" && overflowY !== \"scroll\") return false;\n const node = el as HTMLElement;\n return node.scrollHeight > node.clientHeight + 1;\n };\n\n React.useEffect(() => {\n if (!isOpen) return;\n const container = wheelContainerRef.current;\n if (!container) return;\n\n const onWheel = (event: WheelEvent) => {\n if (!container.contains(event.target as Node)) return;\n if (event.ctrlKey) return;\n\n let node: Element | null = event.target as Element | null;\n while (node && node !== container) {\n if (isElementVerticallyScrollable(node)) return;\n node = node.parentElement;\n }\n if (isElementVerticallyScrollable(container)) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n wheelDeltaRef.current += event.deltaY;\n const threshold = 70;\n if (Math.abs(wheelDeltaRef.current) < threshold) return;\n\n const steps = Math.trunc(wheelDeltaRef.current / threshold);\n wheelDeltaRef.current -= steps * threshold;\n\n const direction: \"prev\" | \"next\" = steps > 0 ? \"next\" : \"prev\";\n for (let i = 0; i < Math.abs(steps); i++) {\n setViewDate((prev) => new Date(prev.getFullYear(), prev.getMonth() + (direction === \"next\" ? 1 : -1), 1));\n }\n };\n\n container.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => container.removeEventListener(\"wheel\", onWheel);\n }, [isOpen]);\n\n const handleSelect = (date: Date) => {\n // Create date object with local timezone to avoid UTC offset issues\n const localDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n if (!tempStart || (tempStart && tempEnd)) {\n setTempStart(localDate);\n setTempEnd(null);\n setHoveredDate(null);\n onChange(localDate, null);\n } else if (tempStart && !tempEnd) {\n if (localDate < tempStart) {\n setTempStart(localDate);\n onChange(localDate, null);\n } else {\n setTempEnd(localDate);\n setLocalRequiredError(undefined);\n onChange(tempStart, localDate);\n setIsOpen(false);\n }\n }\n };\n\n const handleSelectToday = () => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const localToday = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n\n const isPastDate = disablePastDates && localToday < today;\n const isOutOfRange = (!!minDay && localToday < minDay) || (!!maxDay && localToday > maxDay);\n if (isPastDate || isOutOfRange) return;\n\n setTempStart(localToday);\n setTempEnd(localToday);\n setHoveredDate(null);\n setLocalRequiredError(undefined);\n onChange(localToday, localToday);\n setIsOpen(false);\n };\n\n const handleClear = () => {\n setTempStart(null);\n setTempEnd(null);\n setHoveredDate(null);\n onChange(undefined, undefined);\n setIsOpen(false);\n };\n\n const renderGrid = () => {\n const nodes: React.ReactNode[] = [];\n const daysInMonth = getDaysInMonth(viewDate);\n const firstDay = getFirstDayOfMonth(viewDate);\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n for (let i = 0; i < firstDay; i++) nodes.push(<div key={`e-${i}`} className=\"w-8 h-8\" />);\n\n for (let d = 1; d <= daysInMonth; d++) {\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), d);\n\n // Check if date is in the past (before today)\n const isPastDate = disablePastDates && date < today;\n const isOutOfRange = (!!minDay && date < minDay) || (!!maxDay && date > maxDay);\n const isDisabled = isPastDate || isOutOfRange;\n\n const isSelectedStart = isSameDay(date, tempStart);\n const isSelectedEnd = isSameDay(date, tempEnd);\n\n const isHovering = hoveredDate && tempStart && !tempEnd;\n\n let isInRange = false;\n let isRangeStart = false;\n let isRangeEnd = false;\n\n if (tempStart && tempEnd) {\n if (isSameDay(date, tempStart)) isRangeStart = true;\n if (isSameDay(date, tempEnd)) isRangeEnd = true;\n if (inRange(date, tempStart, tempEnd)) isInRange = true;\n } else if (isHovering) {\n if (hoveredDate > tempStart) {\n if (isSameDay(date, tempStart)) isRangeStart = true;\n if (isSameDay(date, hoveredDate)) isRangeEnd = true;\n if (inRange(date, tempStart, hoveredDate)) isInRange = true;\n } else {\n if (isSameDay(date, hoveredDate)) isRangeStart = true;\n if (isSameDay(date, tempStart)) isRangeEnd = true;\n if (inRange(date, hoveredDate, tempStart)) isInRange = true;\n }\n }\n\n nodes.push(\n <button\n key={d}\n type=\"button\"\n onClick={() => !isDisabled && handleSelect(date)}\n disabled={isDisabled}\n onMouseEnter={() => !isDisabled && tempStart && !tempEnd && setHoveredDate(date)}\n onMouseLeave={() => tempStart && !tempEnd && setHoveredDate(null)}\n className={cn(\n \"transition-all duration-200 focus:outline-none relative font-medium cursor-pointer\",\n sizeStyles[size].dayCell,\n // Disabled/past date state\n isDisabled && \"opacity-30 cursor-not-allowed text-muted-foreground\",\n // Default state\n !isDisabled && !isInRange && !isRangeStart && !isRangeEnd && \"hover:bg-accent/80 hover:text-accent-foreground hover:scale-105 rounded-lg\",\n\n // Range selection styling - smooth continuous background with gradient\n isInRange && \"bg-primary/15 text-foreground\",\n (isRangeStart || isRangeEnd) &&\n \"bg-linear-to-br from-primary to-primary/80 text-primary-foreground hover:from-primary hover:to-primary/70 shadow-lg shadow-primary/25\",\n\n // Only round the actual start and end of the range\n isRangeStart && !isRangeEnd && \"rounded-l-lg rounded-r-none\",\n isRangeEnd && !isRangeStart && \"rounded-r-lg rounded-l-none\",\n isRangeStart && isRangeEnd && \"rounded-lg\", // Single day selection\n\n // Hover effects for range\n isInRange && !isDisabled && \"hover:bg-primary/25\",\n\n !isDisabled && \"focus:bg-accent focus:text-accent-foreground focus:z-10 focus:shadow-md\",\n )}\n >\n {d}\n </button>,\n );\n }\n return nodes;\n };\n\n const renderMonthSelector = () => {\n const months =\n locale === \"vi\"\n ? [\"Th1\", \"Th2\", \"Th3\", \"Th4\", \"Th5\", \"Th6\", \"Th7\", \"Th8\", \"Th9\", \"Th10\", \"Th11\", \"Th12\"]\n : [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n return (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {months.map((month, idx) => {\n const isSelected = viewDate.getMonth() === idx;\n return (\n <button\n key={month}\n type=\"button\"\n onClick={() => {\n setViewDate(new Date(viewDate.getFullYear(), idx, 1));\n setViewMode(\"calendar\");\n }}\n className={cn(\n \"py-2 px-3 rounded-lg text-sm font-medium transition-all duration-200\",\n isSelected ? \"bg-primary text-primary-foreground shadow-md\" : \"hover:bg-accent/80 text-foreground hover:scale-105\",\n )}\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n };\n\n const renderYearSelector = () => {\n const startYear = Math.floor(viewDate.getFullYear() / 12) * 12;\n const years = Array.from({ length: 12 }, (_, i) => startYear + i);\n\n return (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {years.map((year) => {\n const isSelected = viewDate.getFullYear() === year;\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => {\n setViewDate(new Date(year, viewDate.getMonth(), 1));\n setViewMode(\"month\");\n }}\n className={cn(\n \"py-2 px-3 rounded-lg text-sm font-medium transition-all duration-200\",\n isSelected ? \"bg-primary text-primary-foreground shadow-md\" : \"hover:bg-accent/80 text-foreground hover:scale-105\",\n )}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n };\n\n const isTodayUnavailable = (!!minDay && todayDate < minDay) || (!!maxDay && todayDate > maxDay);\n\n const panel = (\n <div ref={wheelContainerRef} className=\"w-full\">\n {/* Header */}\n <div className={cn(\"flex items-center justify-between px-1\", sizeStyles[size].headerMargin)}>\n <button\n type=\"button\"\n onClick={() => (viewMode === \"year\" ? navigateYearRange(\"prev\") : navigateMonth(\"prev\"))}\n className={cn(\n \"rounded-xl transition-all duration-200\",\n sizeStyles[size].navButton,\n \"bg-muted/50 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"hover:scale-110 active:scale-95 hover:shadow-md\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n <ChevronLeft className={sizeStyles[size].navIcon} />\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")}\n className={cn(\n \"rounded-lg px-2 py-0.5 font-bold transition-colors duration-200\",\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n viewMode === \"month\" ? \"bg-primary/15 text-primary\" : \"text-foreground hover:bg-accent/50\",\n )}\n >\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\" })}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")}\n className={cn(\n \"rounded-lg px-2 py-0.5 font-bold transition-colors duration-200\",\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n viewMode === \"year\" ? \"bg-primary/15 text-primary\" : \"text-foreground hover:bg-accent/50\",\n )}\n >\n {viewDate.getFullYear()}\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => (viewMode === \"year\" ? navigateYearRange(\"next\") : navigateMonth(\"next\"))}\n className={cn(\n \"rounded-xl transition-all duration-200\",\n sizeStyles[size].navButton,\n \"bg-muted/50 hover:bg-muted text-muted-foreground hover:text-foreground\",\n \"hover:scale-110 active:scale-95 hover:shadow-md\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n <ChevronRight className={sizeStyles[size].navIcon} />\n </button>\n </div>\n {viewMode === \"calendar\" && (\n <>\n <div className={cn(\"grid grid-cols-7 gap-1 px-0.5\", size === \"sm\" ? \"mb-1\" : size === \"lg\" ? \"mb-3\" : \"mb-2\")}>\n {(locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]).map((d, idx) => (\n <div\n key={d}\n className={cn(\n \"text-center font-bold uppercase tracking-wide\",\n sizeStyles[size].weekdayLabel,\n idx === 0 || idx === 6 ? \"text-primary/70\" : \"text-muted-foreground/60\",\n )}\n >\n {d}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-0.5 p-1 rounded-xl bg-muted/20\">{renderGrid()}</div>\n </>\n )}\n {viewMode === \"month\" && renderMonthSelector()}\n {viewMode === \"year\" && renderYearSelector()}\n\n <div className={cn(\"flex items-center border-t border-border/50\", sizeStyles[size].footerMargin)}>\n <button\n type=\"button\"\n onClick={handleSelectToday}\n disabled={isTodayUnavailable}\n className={cn(\n \"flex-1 font-semibold rounded-xl\",\n \"bg-linear-to-r from-primary/10 to-primary/5 border border-primary/30\",\n \"text-primary hover:from-primary/20 hover:to-primary/10 hover:border-primary/50\",\n \"transition-all duration-300 flex items-center justify-center\",\n \"hover:scale-[1.02] active:scale-[0.98] hover:shadow-md hover:shadow-primary/10\",\n sizeStyles[size].actionButton,\n isTodayUnavailable && \"opacity-50 cursor-not-allowed hover:scale-100 active:scale-100\",\n )}\n >\n <Sparkles className={sizeStyles[size].actionIcon} />\n {t(\"today\")}\n </button>\n <button\n type=\"button\"\n onClick={handleClear}\n className={cn(\n \"flex-1 font-semibold rounded-xl\",\n \"bg-linear-to-r from-destructive/10 to-destructive/5 border border-destructive/30\",\n \"text-destructive hover:from-destructive/20 hover:to-destructive/10 hover:border-destructive/50\",\n \"transition-all duration-300 flex items-center justify-center\",\n \"hover:scale-[1.02] active:scale-[0.98] hover:shadow-md hover:shadow-destructive/10\",\n sizeStyles[size].actionButton,\n )}\n >\n <XIcon className={sizeStyles[size].actionIcon} />\n {t(\"clear\")}\n </button>\n </div>\n </div>\n );\n\n const displayFormat = (date: Date) => formatDate ? formatDate(date) : formatDateShort(date);\n\n const displayLabel =\n tempStart && tempEnd ? `${displayFormat(tempStart)} - ${displayFormat(tempEnd)}` : tempStart ? `${displayFormat(tempStart)} - ...` : placeholder;\n const effectiveError = localRequiredError;\n const autoId = useId();\n const resolvedId = id ? String(id) : `daterangepicker-${autoId}`;\n const labelId = label ? `${resolvedId}-label` : undefined;\n const panelId = `${resolvedId}-panel`;\n\n const globalConfig = useUnderverseUIConfig();\n const resolvedBorderMode = borderMode ?? globalConfig.borderMode ?? \"full\";\n\n return (\n <div className={cn(\"space-y-1.5\", className)}>\n {label && (\n <label\n id={labelId}\n htmlFor={resolvedId}\n onClick={() => inputRef.current?.focus()}\n className={cn(\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n formControlLabelClass,\n \"transition-colors duration-300\",\n disabled ? \"text-muted-foreground cursor-not-allowed\" : \"text-foreground group-focus-within:text-primary hover:text-primary cursor-pointer\",\n isOpen && \"text-primary\",\n effectiveError && \"text-destructive\",\n labelClassName\n )}\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n )}\n <input\n tabIndex={-1}\n aria-hidden=\"true\"\n value={startDate && endDate ? \"selected\" : \"\"}\n onChange={() => {}}\n required={required}\n disabled={disabled}\n onInvalid={(e) => {\n e.preventDefault();\n setLocalRequiredError(tv(\"required\"));\n }}\n className=\"pointer-events-none absolute h-0 w-0 opacity-0\"\n />\n <Popover\n getPortalContainer={getPortalContainer}\n open={isOpen}\n onOpenChange={setIsOpen}\n contentProps={{ id: panelId }}\n placement=\"bottom-start\"\n disabled={disabled}\n contentWidth={sizeStyles[size].contentWidth}\n borderMode={resolvedBorderMode}\n contentClassName={cn(\n \"p-0\",\n \"backdrop-blur-xl bg-popover/95 border-border/40 shadow-2xl\",\n \"max-w-[calc(100vw-1rem)] max-h-[calc(100vh-6rem)] overflow-auto overscroll-contain\",\n sizeStyles[size].contentPadding,\n \"animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-300\",\n )}\n trigger={\n <div\n ref={triggerRef}\n className={cn(\n \"group flex w-full items-center justify-between bg-background/80 backdrop-blur-sm\",\n formControlFixedClass,\n formControlGroupOutlineClass,\n getBorderRadiusClass(resolvedBorderMode),\n sizeStyles[size].trigger,\n formControlSizeStyles[requestedSize].control,\n disabled\n ? \"border-border/40 opacity-50 cursor-not-allowed\"\n : [\n \"focus-within:border-ring\",\n \"hover:bg-accent/10\",\n ],\n \"transition-all duration-300 ease-out\",\n isOpen && \"border-ring shadow-lg shadow-primary/10\",\n effectiveError && \"border-destructive/60 bg-destructive/5\",\n )}\n >\n <div className={cn(\"flex min-h-0 min-w-0 flex-1 items-center overflow-hidden\", size === \"sm\" ? \"gap-1.5\" : \"gap-2.5\")}>\n <div\n className={cn(\n \"flex items-center justify-center transition-colors duration-300\",\n effectiveError ? \"text-destructive\" : isOpen ? \"text-primary\" : \"text-muted-foreground group-hover:text-primary\",\n )}\n >\n <Calendar className={cn(\"transition-transform duration-300\", sizeStyles[size].calendarIcon, isOpen && \"scale-110\")} />\n </div>\n <input\n ref={inputRef}\n id={resolvedId}\n type=\"text\"\n role=\"combobox\"\n aria-label={tempStart ? displayLabel : placeholder}\n aria-labelledby={labelId}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n aria-required={required}\n aria-invalid={!!effectiveError}\n disabled={disabled}\n placeholder={placeholder}\n value={isFocused ? inputValue : (tempStart ? displayLabel : \"\")}\n onChange={handleInputChange}\n onFocus={() => {\n setIsFocused(true);\n if (!disabled) setIsOpen(true);\n }}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n onClick={(e) => {\n if (isOpen) {\n e.stopPropagation();\n }\n }}\n className=\"h-full min-w-0 flex-1 truncate bg-transparent border-none outline-none focus:outline-none p-0 text-foreground font-medium placeholder-muted-foreground/60\"\n />\n </div>\n <span className={cn(\"shrink-0 transition-all duration-300 text-muted-foreground group-hover:text-foreground\", isOpen && \"rotate-180 text-primary\")}>\n <svg className={cn(sizeStyles[size].navIcon)} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </span>\n </div>\n }\n >\n {panel}\n </Popover>\n {effectiveError && <div className=\"text-xs text-destructive\">{effectiveError}</div>}\n </div>\n );\n};\n\nexport const CompactDatePicker: React.FC<{\n value?: Date;\n onChange: (date?: Date) => void;\n className?: string;\n getPortalContainer?: () => HTMLElement | null;\n}> = ({ value, onChange, className, getPortalContainer }) => {\n return (\n <DatePicker\n value={value}\n onChange={onChange as (d: Date | undefined) => void}\n size=\"sm\"\n className={cn(\"max-w-56\", className)}\n placeholder=\"Date\"\n getPortalContainer={getPortalContainer}\n />\n );\n};\n"],"mappings":"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","names":["formatDate","isToday"]}