@bug-on/m3-expressive 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/buttons.d.mts +26 -5
  3. package/dist/buttons.d.ts +26 -5
  4. package/dist/buttons.js +581 -345
  5. package/dist/buttons.js.map +1 -1
  6. package/dist/buttons.mjs +573 -345
  7. package/dist/buttons.mjs.map +1 -1
  8. package/dist/core.js +52 -13
  9. package/dist/core.js.map +1 -1
  10. package/dist/core.mjs +52 -13
  11. package/dist/core.mjs.map +1 -1
  12. package/dist/feedback.js +52 -13
  13. package/dist/feedback.js.map +1 -1
  14. package/dist/feedback.mjs +52 -13
  15. package/dist/feedback.mjs.map +1 -1
  16. package/dist/forms.js +4 -1
  17. package/dist/forms.js.map +1 -1
  18. package/dist/forms.mjs +4 -1
  19. package/dist/forms.mjs.map +1 -1
  20. package/dist/{icon-button-sSt6PPLg.d.mts → icon-button-CSsDmuQC.d.mts} +13 -0
  21. package/dist/{icon-button-sSt6PPLg.d.ts → icon-button-CSsDmuQC.d.ts} +13 -0
  22. package/dist/index.d.mts +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +1268 -1005
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +1127 -865
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/layout.js +15 -7
  29. package/dist/layout.js.map +1 -1
  30. package/dist/layout.mjs +15 -7
  31. package/dist/layout.mjs.map +1 -1
  32. package/dist/navigation.d.mts +1 -1
  33. package/dist/navigation.d.ts +1 -1
  34. package/dist/navigation.js +66 -16
  35. package/dist/navigation.js.map +1 -1
  36. package/dist/navigation.mjs +66 -16
  37. package/dist/navigation.mjs.map +1 -1
  38. package/dist/overlays.js +52 -13
  39. package/dist/overlays.js.map +1 -1
  40. package/dist/overlays.mjs +52 -13
  41. package/dist/overlays.mjs.map +1 -1
  42. package/dist/pickers.js +177 -111
  43. package/dist/pickers.js.map +1 -1
  44. package/dist/pickers.mjs +177 -111
  45. package/dist/pickers.mjs.map +1 -1
  46. package/dist/{split-button-trailing-uncheckable-BcPD_7uK.d.ts → split-button-trailing-uncheckable-C-qQlyZx.d.ts} +74 -19
  47. package/dist/{split-button-trailing-uncheckable-DtFJkTFr.d.mts → split-button-trailing-uncheckable-DHJqNeq_.d.mts} +74 -19
  48. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/ui/date-time-pickers/shared/calendar-model.ts","../src/ui/date-time-pickers/date-picker/date-picker-input.tsx","../src/ui/shared/motion-tokens.ts","../src/ui/date-time-pickers/shared/animation-tokens.ts","../src/ui/date-time-pickers/date-picker/subcomponents/day-cell.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/weekday-row.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/calendar-grid.tsx","../src/ui/loading-indicator.tsx","../src/ui/progress-indicator/utils.ts","../src/ui/progress-indicator/circular.tsx","../src/ui/progress-indicator/hooks.ts","../src/ui/progress-indicator/linear-flat.tsx","../src/ui/progress-indicator/linear-wavy.tsx","../src/ui/progress-indicator/linear.tsx","../src/ui/progress-indicator/index.tsx","../src/ui/ripple.tsx","../src/ui/shared/constants.ts","../src/ui/shared/touch-target.tsx","../src/ui/buttons/icon-button/icon-button.tsx","../src/ui/icon.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/calendar-header.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/month-picker-list.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/year-picker-list.tsx","../src/ui/date-time-pickers/date-picker/date-picker.tsx","../src/ui/date-time-pickers/date-picker/date-picker.tokens.ts","../src/ui/scroll-area.tsx","../src/ui/dialog.tsx","../src/ui/date-time-pickers/date-picker/date-picker-dialog.tsx","../src/ui/date-time-pickers/date-picker/date-range-picker.tsx","../src/ui/date-time-pickers/shared/types.ts","../src/ui/date-time-pickers/date-picker/use-date-picker-state.ts","../src/ui/date-time-pickers/date-picker/use-date-range-picker-state.ts","../src/ui/date-time-pickers/time-picker/time-picker.tokens.ts","../src/ui/date-time-pickers/time-picker/subcomponents/period-selector.tsx","../src/ui/date-time-pickers/time-picker/subcomponents/time-field.tsx","../src/ui/date-time-pickers/time-picker/time-input.tsx","../src/ui/date-time-pickers/time-picker/subcomponents/clock-dial.tsx","../src/ui/date-time-pickers/time-picker/time-picker.tsx","../src/ui/date-time-pickers/time-picker/time-picker-dialog.tsx","../src/ui/date-time-pickers/time-picker/use-time-picker-state.ts"],"names":["twMerge","clsx","React","jsx","jsxs","React2","m","React3","React4","AnimatePresence","React5","IndeterminateSvg","Fragment","DeterminateSvg","React6","LazyMotion","domMax","React7","React8","FlatLinearTrack","React9","WavyLinearTrack","useMotionValue","animate","useAnimationFrame","React10","React11","React12","RippleItem","useReducedMotion","React13","_a","_b","Slot","React14","React15","React16","navigateMonth","React17","React18","RadixScrollArea","RadixDialog","React19","RadixDialog2","React20","useState","useCallback","useMemo","DEFAULT_YEAR_RANGE","useReducer","React21","React22","raw","React23","React24","RadixDialog3"],"mappings":"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","file":"pickers.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","/**\n * @file date-time-pickers/shared/calendar-model.ts\n *\n * Pure calendar math functions — no React dependencies.\n * 100% testable, reusable for Date Pickers and Time Pickers.\n *\n * All timestamps are in UTC milliseconds to prevent timezone shift issues.\n */\n\nimport type {\n\tCalendarWeek,\n\tDateLocale,\n\tResolvedDateLocale,\n\tSelectableDates,\n} from \"./types\";\n\n// ─── UTC Date Helpers ─────────────────────────────────────────────────────────\n\n/**\n * Normalizes a timestamp to UTC midnight (00:00:00.000 UTC).\n * Essential for consistent day comparison across timezones.\n */\nexport const startOfDayUTC = (ms: number): number => {\n\tconst d = new Date(ms);\n\treturn Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());\n};\n\n/** Gets UTC midnight of today */\nexport const todayUTC = (): number => startOfDayUTC(Date.now());\n\n/** Gets UTC midnight of 1st day of month */\nexport const startOfMonthUTC = (year: number, month: number): number =>\n\tDate.UTC(year, month, 1);\n\n/** Gets total days in month */\nexport const getDaysInMonth = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n\n/** Gets day-of-week (0=Sun, 6=Sat) for 1st day of month */\nexport const getFirstDayOfWeek = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month, 1)).getUTCDay();\n\n// ─── Calendar Grid ────────────────────────────────────────────────────────────\n\n/**\n * Generates calendar grid for a specific month.\n * Returns array of weeks, each week containing 7 cells (null = padding).\n *\n * @param year - Full year\n * @param month - Month (0–11)\n * @param weekStartsOn - 0 = Sunday, 1 = Monday\n */\nexport const getWeeksInMonth = (\n\tyear: number,\n\tmonth: number,\n\tweekStartsOn: 0 | 1,\n): CalendarWeek[] => {\n\tconst todayMs = todayUTC();\n\tconst daysInMonth = getDaysInMonth(year, month);\n\tconst firstDow = getFirstDayOfWeek(year, month); // 0 = Sun\n\n\t// Compute start padding cells according to weekStartsOn\n\tconst startPadding = (firstDow - weekStartsOn + 7) % 7;\n\n\t// Total cells = padding + actual days\n\tconst totalCells = startPadding + daysInMonth;\n\tconst totalWeeks = Math.ceil(totalCells / 7);\n\n\tconst weeks: CalendarWeek[] = [];\n\n\tfor (let w = 0; w < totalWeeks; w++) {\n\t\tconst week: CalendarWeek = [];\n\t\tfor (let d = 0; d < 7; d++) {\n\t\t\tconst cellIndex = w * 7 + d;\n\t\t\tconst dayNumber = cellIndex - startPadding + 1;\n\n\t\t\tif (dayNumber < 1 || dayNumber > daysInMonth) {\n\t\t\t\tweek.push(null);\n\t\t\t} else {\n\t\t\t\tconst utcMs = Date.UTC(year, month, dayNumber);\n\t\t\t\tweek.push({\n\t\t\t\t\tutcMs,\n\t\t\t\t\tday: dayNumber,\n\t\t\t\t\tmonth,\n\t\t\t\t\tyear,\n\t\t\t\t\tisCurrentMonth: true,\n\t\t\t\t\tisToday: utcMs === todayMs,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tweeks.push(week);\n\t}\n\n\treturn weeks;\n};\n\n// ─── Date Comparison ──────────────────────────────────────────────────────────\n\n/** Compares if two timestamps share the same UTC date */\nexport const isSameDay = (a: number, b: number): boolean =>\n\tstartOfDayUTC(a) === startOfDayUTC(b);\n\n/** Checks if ms falls within [startMs, endMs] (inclusive) */\nexport const isDateInRange = (\n\tms: number,\n\tstartMs: number | null,\n\tendMs: number | null,\n): boolean => {\n\tif (startMs === null || endMs === null) return false;\n\tconst day = startOfDayUTC(ms);\n\tconst start = startOfDayUTC(startMs);\n\tconst end = startOfDayUTC(endMs);\n\treturn day >= start && day <= end;\n};\n\n/** Checks if ms is the start date of range */\nexport const isRangeStart = (ms: number, startMs: number | null): boolean =>\n\tstartMs !== null && isSameDay(ms, startMs);\n\n/** Checks if ms is the end date of range */\nexport const isRangeEnd = (ms: number, endMs: number | null): boolean =>\n\tendMs !== null && isSameDay(ms, endMs);\n\n/** Checks if year is selectable according to `SelectableDates` config */\nexport const isYearSelectable = (\n\tyear: number,\n\tselectableDates: SelectableDates,\n): boolean => selectableDates.isSelectableYear(year);\n\n// ─── Locale / Month Normalization ─────────────────────────────────────────────\n\n/** Resolves partial DateLocale config with fallback values */\nexport const resolveLocale = (locale?: DateLocale): ResolvedDateLocale => ({\n\tlocale:\n\t\tlocale?.locale ??\n\t\t(typeof navigator !== \"undefined\" ? navigator.language : \"en-US\"),\n\tweekStartsOn: locale?.weekStartsOn ?? 1,\n});\n\n/** Normalizes any timestamp to UTC midnight on the 1st of that month */\nexport const normalizeToMonthStart = (ms: number): number => {\n\tconst d = new Date(ms);\n\treturn Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);\n};\n\n// ─── Month Navigation ─────────────────────────────────────────────────────────\n\n/**\n * Navigates to next/previous month.\n * @returns UTC ms of the 1st day of target month\n */\nexport const navigateMonth = (\n\tcurrentMs: number,\n\tdirection: \"prev\" | \"next\",\n): number => {\n\tconst d = new Date(currentMs);\n\tconst year = d.getUTCFullYear();\n\tconst month = d.getUTCMonth();\n\tif (direction === \"next\") {\n\t\treturn month === 11\n\t\t\t? Date.UTC(year + 1, 0, 1)\n\t\t\t: Date.UTC(year, month + 1, 1);\n\t}\n\treturn month === 0 ? Date.UTC(year - 1, 11, 1) : Date.UTC(year, month - 1, 1);\n};\n\n/** Whether a month can be displayed under the picker year constraints. */\nexport const isMonthNavigable = (\n\tyear: number,\n\tyearRange: [number, number],\n\tselectableDates: SelectableDates,\n): boolean =>\n\tyear >= yearRange[0] &&\n\tyear <= yearRange[1] &&\n\tselectableDates.isSelectableYear(year);\n\n/**\n * Return the adjacent month only when its year is allowed. This keeps imperative\n * hook actions and the header controls subject to exactly the same constraints.\n */\nexport const getNavigableMonth = (\n\tcurrentMs: number,\n\tdirection: \"prev\" | \"next\",\n\tyearRange: [number, number],\n\tselectableDates: SelectableDates,\n): number | null => {\n\tconst targetMs = navigateMonth(currentMs, direction);\n\tconst targetYear = new Date(targetMs).getUTCFullYear();\n\treturn isMonthNavigable(targetYear, yearRange, selectableDates)\n\t\t? targetMs\n\t\t: null;\n};\n\n// ─── Date Formatting ──────────────────────────────────────────────────────────\n\n/**\n * Formats a UTC timestamp into a locale-aware date string.\n *\n * @example\n\n * ```ts\n * formatDate(Date.UTC(2025, 5, 26), { locale: 'en-US', weekStartsOn: 1 })\n * // → \"June 26, 2025\"\n * ```\n */\nexport const formatDate = (\n\tutcMs: number,\n\tlocale: ResolvedDateLocale,\n\toptions?: Intl.DateTimeFormatOptions,\n): string => {\n\tconst defaultOptions: Intl.DateTimeFormatOptions = {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t};\n\treturn new Intl.DateTimeFormat(locale.locale, {\n\t\t...defaultOptions,\n\t\t...options,\n\t}).format(new Date(utcMs));\n};\n\n/**\n * Formats month + year for calendar header (e.g., \"June 2025\").\n */\nexport const formatMonthYear = (\n\tutcMs: number,\n\tlocale: ResolvedDateLocale,\n): string =>\n\tnew Intl.DateTimeFormat(locale.locale, {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(utcMs));\n\n/**\n * Returns weekday names (narrow) according to locale and weekStartsOn.\n * @returns Array of 7 names, starting from weekStartsOn day.\n *\n * @example\n * ```ts\n * getWeekdayNames({ locale: 'en-US', weekStartsOn: 1 })\n * // → ['M', 'T', 'W', 'T', 'F', 'S', 'S']\n * ```\n */\nexport const getWeekdayNames = (locale: ResolvedDateLocale): string[] => {\n\t// Fixed reference week (2025-01-05 is Sunday) to extract day names\n\tconst SUNDAY_MS = Date.UTC(2025, 0, 5);\n\tconst formatter = new Intl.DateTimeFormat(locale.locale, {\n\t\tweekday: \"narrow\",\n\t\ttimeZone: \"UTC\",\n\t});\n\n\tconst allDays = Array.from({ length: 7 }, (_, i) =>\n\t\tformatter.format(new Date(SUNDAY_MS + i * 86_400_000)),\n\t);\n\n\t// Rotate according to weekStartsOn: 0=Sun (no rotate), 1=Mon (rotate 1)\n\treturn [\n\t\t...allDays.slice(locale.weekStartsOn),\n\t\t...allDays.slice(0, locale.weekStartsOn),\n\t];\n};\n\n// ─── Parse helpers ────────────────────────────────────────────────────────────\n\n/**\n * Parses date string in \"MM/DD/YYYY\" format into UTC ms.\n * @returns UTC ms if valid, null if invalid\n */\nexport const parseDateInput = (input: string): number | null => {\n\tconst match = input.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n\tif (!match) return null;\n\n\tconst [, mm, dd, yyyy] = match;\n\tconst month = parseInt(mm, 10) - 1;\n\n\tconst day = parseInt(dd, 10);\n\tconst year = parseInt(yyyy, 10);\n\n\tif (month < 0 || month > 11 || day < 1 || day > 31 || year < 1) return null;\n\n\tconst maxDay = getDaysInMonth(year, month);\n\tif (day > maxDay) return null;\n\n\treturn Date.UTC(year, month, day);\n};\n","/**\n * @file date-picker/date-picker-input.tsx\n *\n * Text input mode for Date Picker — manual entry in MM/DD/YYYY format.\n * Uses library TextField component.\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport * as React from \"react\";\nimport { parseDateInput } from \"../shared/calendar-model\";\nimport type { DatePickerInputProps } from \"./date-picker.types\";\n\n/**\n * Text input for Date Picker with MM/DD/YYYY format.\n * Validates realtime, commits on blur or Enter.\n */\nexport const DatePickerInput: React.FC<DatePickerInputProps> = ({\n\tvalue,\n\tonChange,\n\tonCommit,\n\tlabel = \"Enter date\",\n\terror,\n\tlocale,\n\tclassName,\n}) => {\n\tconst inputId = React.useId();\n\tconst errorId = `${inputId}-error`;\n\t// Format hint according to locale\n\tconst placeholder = React.useMemo(() => {\n\t\tif (locale?.startsWith(\"vi\")) return \"DD/MM/YYYY\";\n\t\treturn \"MM/DD/YYYY\";\n\t}, [locale]);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\tconst parsed = parseDateInput(value);\n\t\t\t\tonCommit(parsed);\n\t\t\t}\n\t\t},\n\t\t[value, onCommit],\n\t);\n\n\tconst handleBlur = React.useCallback(() => {\n\t\tconst parsed = parseDateInput(value);\n\t\tonCommit(parsed);\n\t}, [value, onCommit]);\n\n\t// Auto-format: inserts \"/\" after month and day digits\n\tconst handleChange = React.useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tlet raw = e.target.value.replace(/\\D/g, \"\"); // retain numbers only\n\n\t\t\tif (raw.length > 8) raw = raw.slice(0, 8);\n\n\t\t\tlet formatted = raw;\n\t\t\tif (raw.length > 2) {\n\t\t\t\tformatted = `${raw.slice(0, 2)}/${raw.slice(2)}`;\n\t\t\t}\n\t\t\tif (raw.length > 4) {\n\t\t\t\tformatted = `${raw.slice(0, 2)}/${raw.slice(2, 4)}/${raw.slice(4)}`;\n\t\t\t}\n\n\t\t\tonChange(formatted);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t<div className=\"px-6 py-4\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\tclassName=\"block text-[length:var(--md-typescale-label-large-size,14px)]\n\t\t\t\t\t\t\tfont-[number:var(--md-typescale-label-large-weight,500)]\n\t\t\t\t\t\t\ttext-m3-on-surface-variant\n\t\t\t\t\t\t\tmb-1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\t\taria-describedby={error ? errorId : undefined}\n\t\t\t\t\t\tmaxLength={10}\n\t\t\t\t\t\tclassName=\"w-full h-14 px-4 rounded-m3-xs\n\t\t\t\t\t\t\tbg-m3-surface-container-highest\n\t\t\t\t\t\t\ttext-[length:var(--md-typescale-body-large-size,16px)]\n\t\t\t\t\t\t\thover:bg-m3-on-surface/8\n\t\t\t\t\t\t\ttext-m3-on-surface\n\t\t\t\t\t\t\tcaret-m3-primary\n\t\t\t\t\t\t\tplaceholder:text-m3-on-surface-variant\n\t\t\t\t\t\t\toutline-none border-0\n\t\t\t\t\t\t\tfocus:ring-2 focus:ring-m3-primary\n\t\t\t\t\t\t\ttransition-m3-fast-effects\"\n\t\t\t\t\t/>\n\t\t\t\t\t{/* Supporting text / error */}\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<p id={errorId} className=\"mt-1 text-xs text-m3-error px-1\">\n\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nDatePickerInput.displayName = \"DatePickerInput\";\n","/**\n * @file ui/shared/motion-tokens.ts\n *\n * Framer Motion spring presets derived from the official MD3 Expressive\n * motion physics system (May 2025).\n *\n * Usage hierarchy:\n * 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.\n * 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.\n * 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n * @see https://m3.material.io/styles/motion/overview/specs\n */\n\nimport type { Transition } from \"motion/react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Spring Token Structure\n//\n// MD3 defines springs as dampingRatio (0–1) + stiffness.\n// Framer Motion uses absolute `damping` coefficient.\n//\n// Conversion (with Framer's default mass = 1):\n// damping = 2 × dampingRatio × √stiffness\n//\n// Computed values (rounded to 2 decimal places):\n//\n// fast spatial: 2 × 0.6 × √800 = 2 × 0.6 × 28.28 ≈ 33.94\n// fast effects: 2 × 1.0 × √3800 = 2 × 61.64 ≈ 123.29\n// default spatial: 2 × 0.8 × √380 = 2 × 0.8 × 19.49 ≈ 31.19\n// default effects: 2 × 1.0 × √1600 = 2 × 40 = 80\n// slow spatial: 2 × 0.8 × √200 = 2 × 0.8 × 14.14 ≈ 22.63\n// slow effects: 2 × 1.0 × √800 = 2 × 28.28 ≈ 56.57\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Spatial springs — use for position, size, border-radius, rotation, scale ─\n\n/**\n * MD3 Expressive — Fast Spatial Spring\n * `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)\n *\n * Use for: small components (buttons, switches, chips).\n * Has notable bounce/overshoot — feels snappy and expressive.\n */\nexport const FAST_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 33.94,\n} as const;\n\n/**\n * MD3 Expressive — Default Spatial Spring\n * `md.sys.motion.spring.default.spatial` (dampingRatio: 0.8, stiffness: 380)\n *\n * Use for: medium elements (bottom sheets, menus, navigation rail).\n * Gentle overshoot — the go-to spring for most UI animations.\n */\nexport const DEFAULT_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 380,\n\tdamping: 31.19,\n} as const;\n\n/**\n * MD3 Expressive — Slow Spatial Spring\n * `md.sys.motion.spring.slow.spatial` (dampingRatio: 0.8, stiffness: 200)\n *\n * Use for: full-screen transitions and large layout shifts.\n * Subtle, slow overshoot.\n */\nexport const SLOW_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 22.63,\n} as const;\n\n// ── Effects springs — use for color, opacity (critically damped, no bounce) ──\n\n/**\n * MD3 Expressive — Fast Effects Spring\n * `md.sys.motion.spring.fast.effects` (dampingRatio: 1.0, stiffness: 3800)\n *\n * Use for: color changes on switches, icon swaps, badge counts.\n * Critically damped — very fast, no overshoot.\n */\nexport const FAST_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 3800,\n\tdamping: 123.29,\n} as const;\n\n/**\n * MD3 Expressive — Default Effects Spring\n * `md.sys.motion.spring.default.effects` (dampingRatio: 1.0, stiffness: 1600)\n *\n * Use for: opacity fades, color transitions for medium-sized elements.\n * Critically damped — smooth with no overshoot.\n */\nexport const DEFAULT_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 1600,\n\tdamping: 80,\n} as const;\n\n/**\n * MD3 Expressive — Slow Effects Spring\n * `md.sys.motion.spring.slow.effects` (dampingRatio: 1.0, stiffness: 800)\n *\n * Use for: full-screen opacity/color transitions.\n * Critically damped — slow and smooth.\n */\nexport const SLOW_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 56.57,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dynamic helper\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SpringSpeed = \"fast\" | \"default\" | \"slow\";\nexport type SpringAnimationType = \"spatial\" | \"effects\";\n\nconst springMap = {\n\tfast: { spatial: FAST_SPATIAL_SPRING, effects: FAST_EFFECTS_SPRING },\n\tdefault: { spatial: DEFAULT_SPATIAL_SPRING, effects: DEFAULT_EFFECTS_SPRING },\n\tslow: { spatial: SLOW_SPATIAL_SPRING, effects: SLOW_EFFECTS_SPRING },\n} as const;\n\n/**\n * Pick a Framer Motion spring by speed and type.\n *\n * @example\n * ```tsx\n * transition={getMotionSpring(\"fast\", \"spatial\")}\n * ```\n */\nexport function getMotionSpring(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n): Transition {\n\treturn springMap[speed][type];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS transition strings\n// For contexts where Framer Motion is not used (plain CSS / Tailwind).\n// Uses official Web spring → CSS cubic-bezier conversion table.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst CSS_CURVES = {\n\texpressive: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.42, 1.67, 0.21, 0.90)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.38, 1.21, 0.22, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.39, 1.29, 0.35, 0.98)\",\n\t\t\t\tdurationMs: 650,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n\tstandard: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 750,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n} as const;\n\nexport type MotionScheme = \"expressive\" | \"standard\";\n\n/**\n * Returns a CSS `transition` value string using the official MD3 web curve\n * conversion, e.g. `\"500ms cubic-bezier(0.38, 1.21, 0.22, 1.00)\"`.\n *\n * @example\n * ```ts\n * element.style.transition = `border-radius ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n * ```\n */\nexport function getMotionTransitionCSS(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n\tscheme: MotionScheme = \"expressive\",\n): string {\n\tconst { curve, durationMs } = CSS_CURVES[scheme][speed][type];\n\treturn `${durationMs}ms ${curve}`;\n}\n","/**\n * @file date-time-pickers/shared/animation-tokens.ts\n *\n * MD3 Expressive animation constants for picker overlays.\n * Reuses shared motion-tokens from ui/shared and adds picker-specific animations.\n *\n * CSS variables sourced from packages/tailwind/src/index.css.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n */\n\nimport type { TargetAndTransition, Transition, Variants } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n} from \"../../shared/motion-tokens\";\n\n// ─── Dialog / Overlay Animations ─────────────────────────────────────────────\n\n/** Scrim fade animation — 200ms standard-decelerate */\nexport const PICKER_OVERLAY_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: [0, 0, 0, 1] as const },\n\t},\n\texit: {\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n/**\n * Content panel enter animation — MD3 default.spatial spring (380/0.8).\n * Scales from 0.85 to 1 + fade in.\n */\nexport const PICKER_CONTENT_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0, scale: 0.85, y: 16 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ty: 0,\n\t\ttransition: DEFAULT_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 8,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n// ─── Calendar Grid Navigation ─────────────────────────────────────────────────\n\n/**\n * Slide animation when navigating to next month (→).\n * FAST_SPATIAL_SPRING — 350ms, cubic-bezier(0.42, 1.67, 0.21, 0.9).\n */\nexport const CALENDAR_SLIDE_VARIANTS: Variants = {\n\tenterFromRight: {\n\t\tx: \"100%\",\n\t\topacity: 0,\n\t},\n\tenterFromLeft: {\n\t\tx: \"-100%\",\n\t\topacity: 0,\n\t},\n\tcenter: {\n\t\tx: 0,\n\t\topacity: 1,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texitToLeft: {\n\t\tx: \"-100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n\texitToRight: {\n\t\tx: \"100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n// ─── Year Grid ────────────────────────────────────────────────────────────────\n\n/** Year grid fade in/out — DEFAULT_EFFECTS_SPRING (1600/1.0) */\nexport const YEAR_GRID_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0, scale: 0.95 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ttransition: DEFAULT_EFFECTS_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ttransition: { duration: 0.1, ease: \"easeIn\" as const },\n\t},\n};\n\n// ─── Day Cell ─────────────────────────────────────────────────────────────────\n\n/** State layer transition cho day cell — FAST_EFFECTS_SPRING (3800/1.0) */\nexport const DAY_CELL_STATE_TRANSITION: Transition = FAST_EFFECTS_SPRING;\n\n// ─── Re-exports for convenience ───────────────────────────────────────────────\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n};\n","/**\n * @file date-picker/subcomponents/day-cell.tsx\n *\n * Day cell in calendar grid with complete MD3 states.\n * Tokens from DatePickerModalTokens.kt:\n * - DateContainerShape = CornerFull (pill)\n * - DateContainerHeight/Width = 40px\n * - DateSelectedContainerColor = Primary\n * - DateTodayContainerOutlineColor = Primary\n * - RangeSelectionActiveIndicatorContainerColor = SecondaryContainer\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { DAY_CELL_STATE_TRANSITION } from \"../../shared/animation-tokens\";\nimport {\n\tisDateInRange,\n\tisRangeEnd,\n\tisRangeStart,\n\tisSameDay,\n} from \"../../shared/calendar-model\";\nimport type { CalendarDay } from \"../../shared/types\";\n\ninterface DayCellProps {\n\tday: CalendarDay;\n\tselectedMs: number | null;\n\tselectedStartMs?: number | null;\n\tselectedEndMs?: number | null;\n\tisRangePicker?: boolean;\n\tisSelectable: boolean;\n\tonSelect(ms: number): void;\n\tlocale?: string;\n}\n\n/**\n * Day cell with 6 visual MD3 states:\n * - default, today, selected, in-range, range-start/end, disabled\n */\n\nexport const DayCell: React.FC<DayCellProps> = ({\n\tday,\n\tselectedMs,\n\tselectedStartMs = null,\n\tselectedEndMs = null,\n\tisRangePicker = false,\n\tisSelectable,\n\tonSelect,\n\tlocale,\n}) => {\n\tconst { utcMs, day: dayNum, isToday } = day;\n\n\t// ── State computation ───────────────────────────────────────────────────────\n\tconst isSelected =\n\t\t!isRangePicker && selectedMs !== null && isSameDay(utcMs, selectedMs);\n\tconst isStart = isRangePicker && isRangeStart(utcMs, selectedStartMs);\n\tconst isEnd = isRangePicker && isRangeEnd(utcMs, selectedEndMs);\n\tconst isInRange =\n\t\tisRangePicker &&\n\t\t!isStart &&\n\t\t!isEnd &&\n\t\tisDateInRange(utcMs, selectedStartMs, selectedEndMs);\n\tconst isDisabled = !isSelectable;\n\n\t// ── Accessible label ────────────────────────────────────────────────────────\n\tconst ariaLabel = new Intl.DateTimeFormat(locale, {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(utcMs));\n\n\t// ── Range half-fill classes ─────────────────────────────────────────────────\n\t// Range start → fill right half; Range end → fill left half; In range → full fill\n\tconst rangeHighlightClass = cn(\n\t\t\"absolute inset-y-0 bg-m3-secondary-container\",\n\t\tisStart && selectedEndMs !== null && \"left-1/2 right-0\",\n\t\tisEnd && selectedStartMs !== null && \"left-0 right-1/2\",\n\t\tisInRange && \"inset-x-0\",\n\t);\n\n\t// ── Day circle classes ──────────────────────────────────────────────────────\n\tconst circleClass = cn(\n\t\t\"relative z-10 flex items-center justify-center w-10 h-10 rounded-m3-full\",\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)]\",\n\t\t\"font-[number:var(--md-typescale-body-large-weight,400)]\",\n\t\t\"transition-m3-fast-effects\",\n\t\t// Selected (single) or range endpoints\n\t\t(isSelected || isStart || isEnd) && [\"bg-m3-primary\", \"text-m3-on-primary\"],\n\t\t// In-range text\n\t\tisInRange && \"text-m3-on-secondary-container\",\n\t\t// Today outline (only when not selected)\n\t\tisToday &&\n\t\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd && [\"outline outline-1 outline-m3-primary\", \"text-m3-primary\"],\n\t\t// Default text\n\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd &&\n\t\t\t!isInRange &&\n\t\t\t!isToday &&\n\t\t\t\"text-m3-on-surface\",\n\t\t// Hover states (only when selectable and not selected/range endpoints)\n\t\t!isDisabled &&\n\t\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd && [\n\t\t\t\tisInRange\n\t\t\t\t\t? \"hover:bg-m3-on-secondary-container/8\"\n\t\t\t\t\t: \"hover:bg-m3-on-surface/8\",\n\t\t\t],\n\t\t// Disabled\n\t\tisDisabled && \"opacity-[0.38]\",\n\t);\n\n\tconst handleClick = React.useCallback(() => {\n\t\tif (isDisabled) return;\n\t\tonSelect(utcMs);\n\t}, [isDisabled, utcMs, onSelect]);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleClick();\n\t\t\t}\n\t\t},\n\t\t[handleClick],\n\t);\n\n\treturn (\n\t\t<td className=\"relative flex items-center justify-center\">\n\t\t\t{/* Range highlight background (full row width) */}\n\t\t\t{isRangePicker && (isInRange || isStart || isEnd) && (\n\t\t\t\t<div className={rangeHighlightClass} />\n\t\t\t)}\n\n\t\t\t{/* Day circle */}\n\t\t\t<m.button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tcircleClass,\n\t\t\t\t\tisDisabled && \"pointer-events-none cursor-not-allowed\",\n\t\t\t\t)}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-selected={isSelected || isStart || isEnd || undefined}\n\t\t\t\taria-disabled={isDisabled || undefined}\n\t\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\t\twhileTap={\n\t\t\t\t\t!isDisabled\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tscale: 0.94,\n\t\t\t\t\t\t\t\ttransition: DAY_CELL_STATE_TRANSITION,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{dayNum}\n\t\t\t</m.button>\n\t\t</td>\n\t);\n};\n\nDayCell.displayName = \"DayCell\";\n","/**\n * @file date-picker/subcomponents/weekday-row.tsx\n *\n * Header row displaying weekday names.\n * Locale-aware via Intl.DateTimeFormat.\n * Supports weekStartsOn = 0 (Sun) or 1 (Mon).\n */\n\nimport * as React from \"react\";\nimport { getWeekdayNames } from \"../../shared/calendar-model\";\nimport type { ResolvedDateLocale } from \"../../shared/types\";\n\ninterface WeekdayRowProps {\n\tlocale: ResolvedDateLocale;\n}\n\n/**\n * Weekday header row (Mon Tue Wed Thu Fri Sat Sun).\n * Locale-aware, following weekStartsOn configuration.\n */\n\nexport const WeekdayRow: React.FC<WeekdayRowProps> = ({ locale }) => {\n\tconst names = React.useMemo(() => getWeekdayNames(locale), [locale]);\n\n\treturn (\n\t\t<tr className=\"grid grid-cols-7 mb-1\">\n\t\t\t{names.map((name, i) => (\n\t\t\t\t<th\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable weekday order\n\t\t\t\t\tkey={i}\n\t\t\t\t\tscope=\"col\"\n\t\t\t\t\taria-label={name}\n\t\t\t\t\tclassName=\"flex items-center justify-center h-10 w-10 mx-auto\n\t\t\t\t\t\ttext-[length:var(--md-typescale-label-large-size,14px)]\n\t\t\t\t\t\tfont-[number:var(--md-typescale-label-large-weight,500)]\n\t\t\t\t\t\ttext-m3-on-surface\n\t\t\t\t\t\tselect-none\n\t\t\t\t\t\tfont-normal\"\n\t\t\t\t>\n\t\t\t\t\t{name}\n\t\t\t\t</th>\n\t\t\t))}\n\t\t</tr>\n\t);\n};\n\nWeekdayRow.displayName = \"WeekdayRow\";\n","/**\n * @file date-picker/subcomponents/calendar-grid.tsx\n *\n * 7-column calendar grid with slide animation during month navigation.\n * Uses AnimatePresence + direction-aware variants for smooth transitions.\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { CALENDAR_SLIDE_VARIANTS } from \"../../shared/animation-tokens\";\nimport { getWeeksInMonth } from \"../../shared/calendar-model\";\nimport type { ResolvedDateLocale, SelectableDates } from \"../../shared/types\";\nimport { DayCell } from \"./day-cell\";\nimport { WeekdayRow } from \"./weekday-row\";\n\ninterface CalendarGridProps {\n\t/** UTC ms of 1st day of month being displayed */\n\tdisplayedMonthMs: number;\n\t/** Navigation direction determining slide animation axis */\n\tslideDirection: \"prev\" | \"next\" | null;\n\tlocale: ResolvedDateLocale;\n\tselectableDates: SelectableDates;\n\tselectedMs: number | null;\n\tselectedStartMs?: number | null;\n\tselectedEndMs?: number | null;\n\tisRangePicker?: boolean;\n\tonDaySelect(ms: number): void;\n}\n\n/**\n * Calendar grid 6×7 with direction-aware slide animation.\n * Renders WeekdayRow + 6 day rows.\n */\n\nexport const CalendarGrid: React.FC<CalendarGridProps> = ({\n\tdisplayedMonthMs,\n\tslideDirection,\n\tlocale,\n\tselectableDates,\n\tselectedMs,\n\tselectedStartMs = null,\n\tselectedEndMs = null,\n\tisRangePicker = false,\n\tonDaySelect,\n}) => {\n\tconst d = new Date(displayedMonthMs);\n\tconst year = d.getUTCFullYear();\n\tconst month = d.getUTCMonth();\n\n\tconst weeks = React.useMemo(\n\t\t() => getWeeksInMonth(year, month, locale.weekStartsOn),\n\t\t[year, month, locale.weekStartsOn],\n\t);\n\n\tconst enterVariant =\n\t\tslideDirection === \"next\" ? \"enterFromRight\" : \"enterFromLeft\";\n\tconst exitVariant = slideDirection === \"next\" ? \"exitToLeft\" : \"exitToRight\";\n\n\treturn (\n\t\t<table className=\"w-full px-3 border-collapse block\">\n\t\t\t<thead className=\"block\">\n\t\t\t\t<WeekdayRow locale={locale} />\n\t\t\t</thead>\n\t\t\t<AnimatePresence initial={false} mode=\"popLayout\">\n\t\t\t\t<m.tbody\n\t\t\t\t\tkey={displayedMonthMs}\n\t\t\t\t\tvariants={CALENDAR_SLIDE_VARIANTS}\n\t\t\t\t\tinitial={slideDirection !== null ? enterVariant : false}\n\t\t\t\t\tanimate=\"center\"\n\t\t\t\t\texit={slideDirection !== null ? exitVariant : undefined}\n\t\t\t\t\tclassName=\"overflow-hidden block\"\n\t\t\t\t\taria-label={new Intl.DateTimeFormat(locale.locale, {\n\t\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\t\tmonth: \"long\",\n\t\t\t\t\t\ttimeZone: \"UTC\",\n\t\t\t\t\t}).format(new Date(displayedMonthMs))}\n\t\t\t\t>\n\t\t\t\t\t{weeks.map((week, weekIdx) => (\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable week index per month\n\t\t\t\t\t\t\tkey={weekIdx}\n\t\t\t\t\t\t\tclassName=\"grid grid-cols-7\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{week.map((day, dayIdx) =>\n\t\t\t\t\t\t\t\tday === null ? (\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: empty cells have no stable domain identifier\n\t\t\t\t\t\t\t\t\t\tkey={`empty-${weekIdx}-${dayIdx}`}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 mx-auto block\"\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<DayCell\n\t\t\t\t\t\t\t\t\t\tkey={day.utcMs}\n\t\t\t\t\t\t\t\t\t\tday={day}\n\t\t\t\t\t\t\t\t\t\tselectedMs={selectedMs}\n\t\t\t\t\t\t\t\t\t\tselectedStartMs={selectedStartMs}\n\t\t\t\t\t\t\t\t\t\tselectedEndMs={selectedEndMs}\n\t\t\t\t\t\t\t\t\t\tisRangePicker={isRangePicker}\n\t\t\t\t\t\t\t\t\t\tisSelectable={selectableDates.isSelectableDate(day.utcMs)}\n\t\t\t\t\t\t\t\t\t\tonSelect={onDaySelect}\n\t\t\t\t\t\t\t\t\t\tlocale={locale.locale}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</m.tbody>\n\t\t\t</AnimatePresence>\n\t\t</table>\n\t);\n};\n\nCalendarGrid.displayName = \"CalendarGrid\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// Delays <animate> tag insertion by 1 frame via requestAnimationFrame\n\t// to bypass Chromium SMIL freezing bugs when parent container executes CSS transforms/animations.\n\n\tconst [ready, setReady] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tconst raf = requestAnimationFrame(() => setReady(true));\n\t\treturn () => cancelAnimationFrame(raf);\n\t}, []);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t>\n\t\t\t<path d={SHAPE_VALUES.split(\";\")[0]}>\n\t\t\t\t{ready && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={SHAPE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={SHAPE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={SHAPE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<animateTransform\n\t\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\t\tattributeType=\"XML\"\n\t\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={ROTATE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={ROTATE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={ROTATE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</path>\n\t\t</svg>\n\t);\n});\n\n// ─── Determinate SVG (React-controlled morph + counterclockwise rotation) ────\n// Uses CSS transition for smooth d attribute changes where supported (Chromium),\n// with a style-based transform fallback for rotation.\nconst DeterminateSvg = React.memo(function DeterminateSvg({\n\tsize,\n\tprogress,\n}: {\n\tsize: number;\n\tprogress: number;\n}) {\n\t// Clamp and interpolate progress between 0 (circle) and 1 (soft burst)\n\tconst p = Math.min(1, Math.max(0, progress));\n\n\t// Counterclockwise rotation: 0° at 0% → -180° at 100% (per Android spec)\n\tconst rotation = -180 * p;\n\n\t// The path morphs from circle (p=0) to soft-burst (p=1).\n\t// We use a SMIL animate with begin=\"indefinite\" that we snap to progress.\n\t// For maximum compatibility, render the correct endpoint shape based on progress,\n\t// relying on the CSS `d` property transition for smooth animation.\n\tconst pathD = p < 0.5 ? DETERMINATE_CIRCLE : DETERMINATE_SOFT_BURST;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tstyle={{\n\t\t\t\ttransform: `rotate(${rotation}deg)`,\n\t\t\t\ttransition: \"transform 0.3s ease\",\n\t\t\t}}\n\t\t>\n\t\t\t<path d={pathD} style={{ transition: \"d 0.3s ease\" }} />\n\t\t</svg>\n\t);\n});\n\n// ─── Main Component ───────────────────────────────────────────────────────────\nexport const LoadingIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tLoadingIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"uncontained\",\n\t\t\tsize = 48,\n\t\t\tprogress,\n\t\t\tcolor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isContained = variant === \"contained\";\n\t\tconst isDeterminate = progress !== undefined;\n\n\t\t// MD3 spec: strict size range [24dp, 240dp]\n\t\tconst clampedSize = Math.min(240, Math.max(24, size));\n\n\t\t// Proportional scaling based on the default 48dp spec size\n\t\tconst scaleFactor = clampedSize / 48;\n\n\t\t// MD3 spec: contained → 38dp container, 24dp active indicator\n\t\t// Ratio: 38/24 = 1.583 — preserved at all sizes\n\t\tconst containerSize = isContained ? 38 * scaleFactor : undefined;\n\t\tconst indicatorSize = isContained ? 24 * scaleFactor : clampedSize;\n\n\t\t// MD3 color tokens (with per-variant defaults)\n\t\tconst activeColor = isContained\n\t\t\t? (color ?? \"var(--md-sys-color-indicator-contained-active)\")\n\t\t\t: (color ?? \"var(--md-sys-color-indicator-active)\");\n\n\t\t// aria-valuenow is only set in determinate mode (per ARIA spec)\n\t\tconst ariaNow = isDeterminate\n\t\t\t? Math.round(Math.min(1, Math.max(0, progress)) * 100)\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuenow={ariaNow}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: clampedSize,\n\t\t\t\t\theight: clampedSize,\n\t\t\t\t\tcolor: activeColor,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{isContained ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-center rounded-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: containerSize,\n\t\t\t\t\t\t\theight: containerSize,\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\"var(--md-sys-color-indicator-contained-container)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : isDeterminate ? (\n\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t) : (\n\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n","export function easeInOutCubic(x: number): number {\n\treturn x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function generateWavyCircularPath(\n\tcenter: number,\n\tradius: number,\n\tamplitude: number,\n\twavelength: number,\n): string {\n\tconst circumference = 2 * Math.PI * radius;\n\tconst numWaves = Math.max(\n\t\t3,\n\t\tMath.round(circumference / Math.max(1, wavelength)),\n\t);\n\tconst steps = numWaves * 4;\n\tconst dt = (2 * Math.PI) / steps;\n\n\tconst rAt = (t: number) => radius + amplitude * Math.sin(numWaves * t);\n\tconst drAt = (t: number) => amplitude * numWaves * Math.cos(numWaves * t);\n\tconst xAt = (t: number) => center + rAt(t) * Math.cos(t);\n\tconst yAt = (t: number) => center + rAt(t) * Math.sin(t);\n\tconst dxAt = (t: number) => drAt(t) * Math.cos(t) - rAt(t) * Math.sin(t);\n\tconst dyAt = (t: number) => drAt(t) * Math.sin(t) + rAt(t) * Math.cos(t);\n\n\tlet d = \"\";\n\tconst tStart = 0;\n\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst t0 = tStart + i * dt;\n\t\tconst t1 = tStart + (i + 1) * dt;\n\n\t\tconst scale = dt / 3;\n\t\tconst cp1x = xAt(t0) + scale * dxAt(t0);\n\t\tconst cp1y = yAt(t0) + scale * dyAt(t0);\n\t\tconst cp2x = xAt(t1) - scale * dxAt(t1);\n\t\tconst cp2y = yAt(t1) - scale * dyAt(t1);\n\n\t\tif (i === 0) d += `M ${xAt(t0).toFixed(2)} ${yAt(t0).toFixed(2)}`;\n\t\td += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${xAt(t1).toFixed(2)} ${yAt(t1).toFixed(2)}`;\n\t}\n\td += \" Z\";\n\treturn d;\n}\n\nexport function getSinePath(\n\tstartX: number,\n\tendX: number,\n\tphase: number,\n\twl: number,\n\tamp: number,\n) {\n\tif (startX >= endX) return \"\";\n\tlet d = \"\";\n\tconst step = amp === 0 ? Math.max(10, endX - startX) : 1;\n\n\tconst yStart = Math.sin(((startX + phase) / wl) * 2 * Math.PI) * amp;\n\td += `M ${startX.toFixed(2)} ${yStart.toFixed(2)}`;\n\n\tlet nextX = Math.ceil(startX / step) * step;\n\tif (nextX === startX) nextX += step;\n\n\twhile (nextX < endX) {\n\t\tconst y = Math.sin(((nextX + phase) / wl) * 2 * Math.PI) * amp;\n\t\td += ` L ${nextX.toFixed(2)} ${y.toFixed(2)}`;\n\t\tnextX += step;\n\t}\n\n\tconst yEnd = Math.sin(((endX + phase) / wl) * 2 * Math.PI) * amp;\n\td += ` L ${endX.toFixed(2)} ${yEnd.toFixed(2)}`;\n\n\treturn d;\n}\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CircularProgressProps } from \"./types\";\nimport { generateWavyCircularPath } from \"./utils\";\n\nexport const CircularProgress = React.forwardRef<\n\tHTMLDivElement,\n\tCircularProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tsize = 48,\n\t\t\ttrackHeight = 4,\n\t\t\tshape = \"flat\",\n\t\t\tamplitude,\n\t\t\twavelength,\n\t\t\tgapSize = 4,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst radius = (size - trackHeight) / 2;\n\t\tconst center = size / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\tconst isWavy = shape === \"wavy\";\n\n\t\tconst BASELINE_SIZE = 48;\n\t\tconst scaleFactor = size / BASELINE_SIZE;\n\t\tconst effectiveAmplitude = React.useMemo(\n\t\t\t() => amplitude ?? 1.6 * scaleFactor,\n\t\t\t[amplitude, scaleFactor],\n\t\t);\n\t\tconst effectiveWavelength = React.useMemo(\n\t\t\t() => wavelength ?? 15 * scaleFactor,\n\t\t\t[wavelength, scaleFactor],\n\t\t);\n\n\t\tconst wavyActivePath = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisWavy\n\t\t\t\t\t? generateWavyCircularPath(\n\t\t\t\t\t\t\tcenter,\n\t\t\t\t\t\t\tradius,\n\t\t\t\t\t\t\teffectiveAmplitude,\n\t\t\t\t\t\t\teffectiveWavelength,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t[isWavy, center, radius, effectiveAmplitude, effectiveWavelength],\n\t\t);\n\n\t\tconst circumference = React.useMemo(() => 2 * Math.PI * radius, [radius]);\n\t\tconst gapForTrack = React.useMemo(\n\t\t\t() => (gapSize + trackHeight) / circumference,\n\t\t\t[gapSize, trackHeight, circumference],\n\t\t);\n\t\tconst activeAngularFraction = isDeterminate ? clampedValue / 100 : 0;\n\n\t\tconst trackOffset = isDeterminate ? activeAngularFraction + gapForTrack : 0;\n\t\tconst trackLength = isDeterminate\n\t\t\t? Math.max(0.001, 1 - activeAngularFraction - 2 * gapForTrack)\n\t\t\t: 1;\n\n\t\tconst ActiveCircleElem = m.circle;\n\t\tconst ActivePathElem = m.path;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{ transform: \"rotate(-90deg)\", overflow: \"visible\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tinitial={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\tanimate={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{isDeterminate &&\n\t\t\t\t\t\t\t(isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{!isDeterminate && (\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\t\trotate: \"-90deg\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{ rotate: [\"-90deg\", \"270deg\"] }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\trotate: {\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tpathLength: [\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.75 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\trotate: [\n\t\t\t\t\t\t\t\t\t\t`${(0.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.0 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.svg>\n\t\t\t\t\t)}\n\t\t\t\t</LazyMotion>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCircularProgress.displayName = \"CircularProgress\";\n","import * as React from \"react\";\n\nexport function useContainerWidth() {\n\tconst [width, setWidth] = React.useState(0);\n\tconst observerRef = React.useRef<ResizeObserver | null>(null);\n\n\tconst ref = React.useCallback((node: HTMLDivElement | null) => {\n\t\tif (observerRef.current) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\n\t\tif (node) {\n\t\t\tconst obs = new ResizeObserver((entries) => {\n\t\t\t\tconst contentRect = entries[0].contentRect;\n\t\t\t\tsetWidth(contentRect.width);\n\t\t\t});\n\t\t\tobs.observe(node);\n\t\t\tobserverRef.current = obs;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (observerRef.current) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn [ref, width] as const;\n}\n\nexport function useMergedRef<T>(\n\t...refs: (React.Ref<T> | undefined | null)[]\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\tfor (const ref of refs) {\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t\t(ref as React.MutableRefObject<T | null>).current = node;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[refs],\n\t);\n}\n","import { m } from \"motion/react\";\nimport * as React from \"react\";\n\nexport const FlatLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\tcrawlerSpeed: number;\n}>(function FlatLinearTrack({\n\ttrackHeight,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\tcrawlerSpeed,\n}) {\n\tconst isDeterminate = value !== undefined;\n\tconst radius = trackHeight / 2;\n\tconst minActiveWidth = trackHeight;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: trackHeight, borderRadius: radius }}\n\t\t>\n\t\t\t{isDeterminate ? (\n\t\t\t\t<>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: trackColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, 0%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, ${value}%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: activeColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\tminWidth: minActiveWidth,\n\t\t\t\t\t\t\t...(isRtl ? { right: 0 } : { left: 0 }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{ width: `${minActiveWidth}px` }}\n\t\t\t\t\t\tanimate={{ width: `${value}%` }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: trackColor, borderRadius: radius }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: activeColor, borderRadius: radius }}\n\t\t\t\t\t\tinitial={{ left: \"-40%\", width: \"40%\" }}\n\t\t\t\t\t\tanimate={{ left: [\"-40%\", \"100%\"], width: [\"40%\", \"20%\", \"40%\"] }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { animate, useAnimationFrame, useMotionValue } from \"motion/react\";\nimport * as React from \"react\";\nimport { useContainerWidth } from \"./hooks\";\nimport { easeInOutCubic, getSinePath } from \"./utils\";\n\nexport const WavyLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tsvgHeight: number;\n\tamplitude: number;\n\twavelength: number;\n\tindeterminateWavelength: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\twaveSpeed: number;\n\tcrawlerSpeed: number;\n\tdeterminateAnimation: \"md3\" | \"continuous\";\n\tindeterminateAnimation: \"md3\" | \"continuous\";\n\ttrackShape: \"flat\" | \"wavy\";\n}>(function WavyLinearTrack({\n\ttrackHeight,\n\tsvgHeight,\n\tamplitude,\n\twavelength,\n\tindeterminateWavelength,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\twaveSpeed,\n\tcrawlerSpeed,\n\tdeterminateAnimation,\n\tindeterminateAnimation,\n\ttrackShape,\n}) {\n\tconst isDeterminate = typeof value === \"number\";\n\tconst clampedValue = isDeterminate ? Math.max(0, Math.min(100, value)) : 100;\n\tconst titleId = React.useId();\n\n\tconst [containerRef, width] = useContainerWidth();\n\n\tconst activePathRef = React.useRef<SVGPathElement>(null);\n\tconst trackPathRef = React.useRef<SVGPathElement>(null);\n\n\tconst amplitudeMV = useMotionValue(amplitude);\n\tconst fractionMV = useMotionValue(isDeterminate ? clampedValue / 100 : 1);\n\n\tReact.useEffect(() => {\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = clampedValue / 100;\n\n\t\t\t// Handle Flattening Logic based on determinateAnimation prop\n\t\t\tlet targetAmp = amplitude;\n\t\t\tif (determinateAnimation === \"md3\") {\n\t\t\t\ttargetAmp = fraction <= 0.1 || fraction >= 0.95 ? 0 : amplitude;\n\t\t\t}\n\n\t\t\tanimate(amplitudeMV, targetAmp, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tbounce: 0,\n\t\t\t\tduration: 0.5,\n\t\t\t});\n\t\t\tanimate(fractionMV, fraction, { duration: 0.4, ease: [0.2, 0, 0, 1] });\n\t\t}\n\t}, [\n\t\tclampedValue,\n\t\tisDeterminate,\n\t\tamplitude,\n\t\tamplitudeMV,\n\t\tfractionMV,\n\t\tdeterminateAnimation,\n\t]);\n\n\tconst activeWavelength = Math.max(\n\t\t1,\n\t\tisDeterminate ? wavelength : indeterminateWavelength,\n\t);\n\tconst trackAmp = trackShape === \"wavy\" ? amplitude : 0;\n\n\tuseAnimationFrame((time) => {\n\t\tif (width === 0) return;\n\n\t\tconst currentAmp = amplitudeMV.get();\n\t\tconst phase = (time / 1000) * waveSpeed * activeWavelength;\n\t\tconst capWidth = trackHeight / 2;\n\n\t\tlet activePathD = \"\";\n\t\tlet trackD = \"\";\n\t\tconst totalGap = gapSize + trackHeight;\n\n\t\t// 1. DETERMINATE MODE\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = fractionMV.get();\n\t\t\tconst barHead = fraction * width;\n\n\t\t\tconst adjHead = Math.max(capWidth, Math.min(width - capWidth, barHead));\n\t\t\tconst adjTail = capWidth;\n\n\t\t\tif (fraction > 0 && adjHead - adjTail > 0.1) {\n\t\t\t\tactivePathD = getSinePath(\n\t\t\t\t\tadjTail,\n\t\t\t\t\tadjHead,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\tcurrentAmp,\n\t\t\t\t);\n\t\t\t} else if (fraction === 0) {\n\t\t\t\tactivePathD = `M ${capWidth} 0 L ${capWidth + 0.01} 0`;\n\t\t\t}\n\n\t\t\tconst trackStart = adjHead + totalGap;\n\t\t\tif (trackStart < width - capWidth) {\n\t\t\t\ttrackD = getSinePath(\n\t\t\t\t\ttrackStart,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// 2. INDETERMINATE MODE\n\t\telse {\n\t\t\tconst safeCrawlerSpeed = Math.max(0.1, crawlerSpeed);\n\t\t\tconst activeLines: { tail: number; head: number }[] = [];\n\n\t\t\tif (indeterminateAnimation === \"continuous\") {\n\t\t\t\tconst cycle = 2000 / safeCrawlerSpeed;\n\t\t\t\tconst fraction = (time % cycle) / cycle;\n\t\t\t\tactiveLines.push({\n\t\t\t\t\ttail: easeInOutCubic(Math.max(0, fraction * 1.5 - 0.5)),\n\t\t\t\t\thead: easeInOutCubic(Math.min(1, fraction * 1.5)),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cycle = 1750 / safeCrawlerSpeed;\n\t\t\t\tconst t = (time % cycle) * safeCrawlerSpeed;\n\n\t\t\t\tconst l1H = easeInOutCubic(Math.max(0, Math.min(1, t / 1000)));\n\t\t\t\tconst l1T = easeInOutCubic(Math.max(0, Math.min(1, (t - 250) / 1000)));\n\t\t\t\tconst l2H = easeInOutCubic(Math.max(0, Math.min(1, (t - 650) / 850)));\n\t\t\t\tconst l2T = easeInOutCubic(Math.max(0, Math.min(1, (t - 900) / 850)));\n\n\t\t\t\tactiveLines.push({ tail: l1T, head: l1H });\n\t\t\t\tactiveLines.push({ tail: l2T, head: l2H });\n\t\t\t}\n\n\t\t\tconst segments = activeLines\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst barTail = line.tail * width;\n\t\t\t\t\tconst barHead = line.head * width;\n\t\t\t\t\tconst adjTail = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barTail),\n\t\t\t\t\t);\n\t\t\t\t\tconst adjHead = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barHead),\n\t\t\t\t\t);\n\t\t\t\t\treturn { adjTail, adjHead };\n\t\t\t\t})\n\t\t\t\t.filter((seg) => seg.adjHead - seg.adjTail > 0.1);\n\n\t\t\tactivePathD = segments\n\t\t\t\t.map((seg) =>\n\t\t\t\t\tgetSinePath(\n\t\t\t\t\t\tseg.adjTail,\n\t\t\t\t\t\tseg.adjHead,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tactiveWavelength,\n\t\t\t\t\t\tcurrentAmp,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.join(\" \");\n\n\t\t\tlet currentTrackX = capWidth;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst trackEnd = seg.adjTail - totalGap;\n\t\t\t\tif (trackEnd > currentTrackX) {\n\t\t\t\t\ttrackD += `${getSinePath(currentTrackX, trackEnd, phase, activeWavelength, trackAmp)} `;\n\t\t\t\t}\n\t\t\t\tcurrentTrackX = Math.max(currentTrackX, seg.adjHead + totalGap);\n\t\t\t}\n\t\t\tif (currentTrackX < width - capWidth) {\n\t\t\t\ttrackD += getSinePath(\n\t\t\t\t\tcurrentTrackX,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (activePathRef.current)\n\t\t\tactivePathRef.current.setAttribute(\"d\", activePathD);\n\t\tif (trackPathRef.current)\n\t\t\ttrackPathRef.current.setAttribute(\"d\", trackD.trim());\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: svgHeight }}\n\t\t>\n\t\t\t{width > 0 && (\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"absolute inset-0 w-full h-full\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\ttransform: isRtl ? \"scaleX(-1)\" : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t>\n\t\t\t\t\t<title id={titleId}>\n\t\t\t\t\t\t{isDeterminate\n\t\t\t\t\t\t\t? `Progress: ${clampedValue}%`\n\t\t\t\t\t\t\t: \"Indeterminate loading progress\"}\n\t\t\t\t\t</title>\n\t\t\t\t\t<g transform={`translate(0, ${svgHeight / 2})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={trackPathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={trackColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={activePathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMergedRef } from \"./hooks\";\nimport { FlatLinearTrack } from \"./linear-flat\";\nimport { WavyLinearTrack } from \"./linear-wavy\";\nimport type { LinearProgressProps } from \"./types\";\n\nexport const LinearProgress = React.forwardRef<\n\tHTMLDivElement,\n\tLinearProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tshape = \"flat\",\n\t\t\ttrackShape,\n\t\t\ttrackHeight = 4,\n\t\t\tamplitude,\n\t\t\twavelength = 40,\n\t\t\tindeterminateWavelength = 20,\n\t\t\twaveSpeed = 1,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tdeterminateAnimation = \"md3\",\n\t\t\tindeterminateAnimation = \"continuous\",\n\t\t\tgapSize = 4,\n\t\t\tshowStopIndicator = \"auto\",\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, containerRef);\n\t\tconst [isRtl, setIsRtl] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (containerRef.current) {\n\t\t\t\tconst dir = getComputedStyle(containerRef.current).direction;\n\t\t\t\tsetIsRtl(dir === \"rtl\");\n\t\t\t}\n\t\t}, []);\n\n\t\tconst isWavy = shape === \"wavy\";\n\t\tconst resolvedTrackShape = trackShape ?? shape;\n\n\t\tconst effectiveAmplitude = React.useMemo(() => amplitude ?? 3, [amplitude]);\n\t\tconst svgHeight = React.useMemo(\n\t\t\t() => (isWavy ? trackHeight + effectiveAmplitude * 2 : trackHeight),\n\t\t\t[isWavy, trackHeight, effectiveAmplitude],\n\t\t);\n\n\t\tconst shouldShowStop = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisDeterminate &&\n\t\t\t\tresolvedTrackShape === \"flat\" &&\n\t\t\t\t(showStopIndicator === true ||\n\t\t\t\t\t(showStopIndicator === \"auto\" && isDeterminate)),\n\t\t\t[isDeterminate, resolvedTrackShape, showStopIndicator],\n\t\t);\n\n\t\tconst stopSize = React.useMemo(\n\t\t\t() => Math.max(2, trackHeight > 4 ? 4 : trackHeight / 2),\n\t\t\t[trackHeight],\n\t\t);\n\n\t\tconst stopOffset = (trackHeight - stopSize) / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex w-full flex-col justify-center\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: svgHeight }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t<WavyLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tsvgHeight={svgHeight}\n\t\t\t\t\t\t\tamplitude={effectiveAmplitude}\n\t\t\t\t\t\t\twavelength={wavelength}\n\t\t\t\t\t\t\tindeterminateWavelength={indeterminateWavelength}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\twaveSpeed={waveSpeed}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t\tdeterminateAnimation={determinateAnimation}\n\t\t\t\t\t\t\tindeterminateAnimation={indeterminateAnimation}\n\t\t\t\t\t\t\ttrackShape={resolvedTrackShape}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlatLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowStop && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute rounded-full\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: stopSize,\n\t\t\t\t\t\t\t\theight: stopSize,\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-indicator-stop)\",\n\t\t\t\t\t\t\t\ttop: svgHeight / 2 - stopSize / 2,\n\t\t\t\t\t\t\t\t...(isRtl ? { left: stopOffset } : { right: stopOffset }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nLinearProgress.displayName = \"LinearProgress\";\n","import * as React from \"react\";\nimport { CircularProgress } from \"./circular\";\nimport { LinearProgress } from \"./linear\";\nimport type { ProgressIndicatorProps } from \"./types\";\n\n/**\n * Progress Indicator component based on Material Design 3 Expressive guidelines.\n * Flexible support for 2 presentation variants: Linear and Circular,\n * with smooth dynamic Wavy shape profiles.\n *\n * @example\n * ```tsx\n * // Determinate Flat Linear\n * <ProgressIndicator variant=\"linear\" value={60} aria-label=\"Loading profile...\" />\n *\n * // Indeterminate Wavy Linear\n * <ProgressIndicator variant=\"linear\" shape=\"wavy\" aria-label=\"Connecting to server...\" />\n *\n * // Determinate Flat Circular\n * <ProgressIndicator variant=\"circular\" value={45} size={48} aria-label=\"Syncing...\" />\n * ```\n */\n\nexport const ProgressIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tProgressIndicatorProps\n>((props, ref) => {\n\tif (props.variant === \"circular\") {\n\t\treturn <CircularProgress ref={ref} {...props} />;\n\t}\n\treturn <LinearProgress ref={ref} {...props} />;\n});\n\nProgressIndicator.displayName = \"ProgressIndicator\";\n\nexport type {\n\tCircularProgressProps,\n\tLinearProgressProps,\n\tProgressIndicatorProps,\n} from \"./types\";\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.hypot(rect.width, rect.height) * 2;\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","/**\n * @file shared/constants.ts\n *\n * Shared animation constants for MD3 Expressive UI components.\n * Centralises spring transition configs and motion variant objects to avoid\n * duplication across button, icon-button, FAB, and other interactive components.\n *\n * @see https://m3.material.io/foundations/animation/overview\n */\n\nimport type { Target, TargetAndTransition, Transition } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n} from \"./motion-tokens\";\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tgetMotionSpring,\n\tgetMotionTransitionCSS,\n\tSLOW_EFFECTS_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"./motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast spring — used for border-radius morphing, icon swaps.\n * Maps to MD3 `fast.effects` (critically damped, stiffness 3800).\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Standard spring — used for icon/content scale animations.\n * Maps to MD3 `default.effects` (critically damped, stiffness 1600).\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = DEFAULT_EFFECTS_SPRING;\n\n/**\n * MD3 Expressive spring — active indicator expand/collapse.\n * Maps to MD3 `default.spatial` (dampingRatio: 0.8, stiffness: 380).\n * Gentle bounce for the \"pop\" effect per MD3 Expressive spec.\n */\nexport const SPRING_TRANSITION_EXPRESSIVE: Transition = DEFAULT_SPATIAL_SPRING;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon Span Motion Variants\n// Used for icon/loading indicator swap animation inside FAB and IconButton.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Framer Motion variants for animating icon spans in/out.\n *\n * Scale from near-zero → 1 on enter; back to near-zero on exit.\n * The near-zero value (0.01) avoids the SMIL freeze bug on Chromium\n * that occurs when an element starts at exactly `scale(0)`.\n *\n * @example\n * ```tsx\n * <AnimatePresence mode=\"wait\">\n * {loading ? (\n * <m.span key=\"loading\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * <LoadingIndicator />\n * </m.span>\n * ) : (\n * <m.span key=\"icon\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * {icon}\n * </m.span>\n * )}\n * </AnimatePresence>\n * ```\n */\nexport const ICON_SPAN_VARIANTS: {\n\tinitial: Target;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { scale: 0.01 },\n\tanimate: { scale: 1 },\n\texit: { scale: 0.01 },\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 TextField Animation Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Standard easing curve — used for label float, active indicator expand.\n * cubic-bezier(0.2, 0, 0, 1)\n *\n * @see https://m3.material.io/foundations/animation/easing-and-duration\n */\nexport const MD3_STANDARD_EASING: [number, number, number, number] = [\n\t0.2, 0, 0, 1,\n];\n\n/**\n * Duration for floating label transition: 150ms.\n * Used when label moves between inline position ↔ floated position.\n */\nexport const MD3_LABEL_FLOAT_DURATION = 0.15;\n\n/**\n * Duration for active indicator expand/collapse: 200ms.\n * Used for the bottom border (filled) and outline (outlined) on focus.\n */\nexport const MD3_INDICATOR_DURATION = 0.2;\n\n/**\n * Duration for supporting text / error text appear/disappear: 120ms.\n */\nexport const MD3_SUPPORTING_DURATION = 0.12;\n\n/**\n * Duration for trailing icon appear/disappear (clear button, password toggle): 100ms.\n */\nexport const MD3_ICON_SWAP_DURATION = 0.1;\n","/**\n * @file shared/touch-target.tsx\n *\n * Invisible 48×48dp touch-target expander for small interactive elements.\n *\n * WCAG 2.5.5 (Level AA) requires interactive targets to be at least 44×44 CSS pixels.\n * MD3 specifies a minimum 48dp touch target for all interactive components.\n * For button sizes XS (32dp) and SM (40dp) that are smaller than this minimum,\n * an invisible absolutely-positioned `<span>` is overlaid to extend the\n * effective tap area without affecting visual layout.\n *\n * @see https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n * @see https://m3.material.io/foundations/accessible-design/accessibility-basics\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TouchTarget Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invisible 48×48dp touch area expander — satisfies WCAG 2.5.5 + MD3 spec.\n *\n * Place as a direct child of any interactive element whose visual size is\n * smaller than 48dp (e.g. `xs`/`sm` buttons and icon buttons).\n * The parent element **must** have `position: relative`.\n *\n * @remarks\n * - Hidden from assistive technologies via `aria-hidden=\"true\"`.\n * - `pointer-events: none` ensures it does not intercept click events.\n * - Centred with `left: 50% / top: 50%` + negative translate for symmetry.\n *\n * @example\n * ```tsx\n * // Used inside a 32dp XS button:\n * <button className=\"relative h-8 w-auto ...\">\n * <TouchTarget />\n * Label\n * </button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/specs (Touch target section)\n */\nexport function TouchTarget() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 min-w-12 min-h-12 cursor-pointer pointer-events-none\"\n\t\t/>\n\t);\n}\n","/**\n * @file icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size container dimensions (Tailwind utility classes).\n * MD3 Expressive sizing tokens (v14.1.0): XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n * @internal\n */\nconst SIZE_STYLES: Record<string, string> = {\n\txs: \"h-8 w-8\",\n\tsm: \"h-10 w-10\",\n\tmd: \"h-14 w-14\",\n\tlg: \"h-24 w-24\",\n\txl: \"h-[8.5rem] w-[8.5rem]\",\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n\t/**\n\t * Change the component to the underlying child element and merge props/behavior.\n\t * Useful when wrapping in Next.js `<Link>` or custom anchor tags.\n\t * @default false\n\t */\n\tasChild?: boolean;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"content\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{asChild\n\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\tReact.Children.only(children) as React.ReactElement<{\n\t\t\t\t\t\t\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t).props.children\n\t\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst containerClassName = cn(\n\t\t\tbaseIconButtonClasses,\n\t\t\tresolvedColorClass,\n\t\t\toutlineWidthClass,\n\t\t\tdisabledBgClass,\n\t\t\t\"overflow-hidden\",\n\t\t\tSIZE_STYLES[size],\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tstyle={{ ...(style as React.CSSProperties), borderRadius: `${animateRadius}px` }}\n\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t{...(restProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SPRING_TRANSITION_FAST } from \"./shared/constants\";\n\n// @internal — font must be loaded via '@bug-on/m3-expressive/material-symbols.css'\nconst VARIANT_FONT: Record<NonNullable<IconProps[\"variant\"]>, string> = {\n\toutlined: \"'Material Symbols Outlined'\",\n\trounded: \"'Material Symbols Rounded'\",\n\tsharp: \"'Material Symbols Sharp'\",\n};\n\n/**\n * Props cho component {@link Icon}.\n *\n * All variable font axes are mapped directly to `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Name of the Material Symbol in snake_case format.\n\t * @example \"home\", \"arrow_forward\", \"settings\"\n\t * @see https://fonts.google.com/icons\n\t */\n\tname: string;\n\n\t/**\n\t * Geometric style variant — maps to font family.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * `FILL` axis. `0` = outlined, `1` = filled.\n\t * Features spring animation when `animateFill` is true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * `wght` axis — stroke weight. Should match surrounding text weight.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * `GRAD` axis — fine-tunes visual weight without affecting layout dimensions.\n\t * Use `-25` on dark backgrounds to offset light halation effects.\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * `opsz` axis — optical size in dp. Used to set `font-size` if `size` is not specified.\n\t * Match rendered pixel size for best quality.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Direct `font-size` override in px. `opsz` axis still respects `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * Enables smooth spring animation when toggling FILL axis (uses `SPRING_TRANSITION_FAST`).\n\t * Requires `motion` dependency.\n\t * @default false\n\t * @example <Icon name=\"favorite\" fill={isLiked ? 1 : 0} animateFill />\n\t */\n\tanimateFill?: boolean;\n}\n\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvariant = \"outlined\",\n\t\t\tfill = 0,\n\t\t\tweight = 400,\n\t\t\tgrade = 0,\n\t\t\topticalSize = 24,\n\t\t\tsize,\n\t\t\tanimateFill = false,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst fontVariationSettings = `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' ${opticalSize}`;\n\n\t\tconst computedStyle: React.CSSProperties = {\n\t\t\tfontFamily: VARIANT_FONT[variant],\n\t\t\tfontSize:\n\t\t\t\tsize === \"inherit\"\n\t\t\t\t\t? \"inherit\"\n\t\t\t\t\t: size != null\n\t\t\t\t\t\t? `${size}px`\n\t\t\t\t\t\t: `${opticalSize}px`,\n\t\t\tfontVariationSettings,\n\t\t\t...style,\n\t\t};\n\n\t\tif (animateFill) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tanimate={{ fontVariationSettings }}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION_FAST}\n\t\t\t\t\t\tstyle={computedStyle}\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: motion v12 HTMLMotionProps conflicts with React's event types\n\t\t\t\t\t\t{...(restProps as any)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</m.span>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={computedStyle}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t);\n\t},\n);\n\nIconComponent.displayName = \"Icon\";\n\n/**\n * Material Symbols (variable font) Icon component.\n *\n * Make sure to import the icon font CSS before usage:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols-cdn.css';\n * ```\n *\n * @remarks\n * - Use snake_case for icon names: `\"arrow_forward\"`, NOT `\"ArrowForward\"`.\n * - `aria-hidden=\"true\"` is attached automatically — provide screen reader labels on parent elements.\n *\n * @example\n * ```tsx\n * // Basic Icon\n * <Icon name=\"home\" />\n *\n * // Visual customization (filled, heavy weight)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animated transition on state change\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // Custom size override\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Combination with other components\n * <Button icon={<Icon name=\"add\" />}>Add to cart</Button>\n * ```\n *\n * @see https://fonts.google.com/icons\n * @see https://m3.material.io/styles/icons/overview\n */\nexport const Icon = React.memo(IconComponent);\n","/**\n * Calendar header with independent month and year selectors.\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { IconButton } from \"../../../buttons/icon-button\";\nimport { Icon } from \"../../../icon\";\nimport { formatMonthYear } from \"../../shared/calendar-model\";\nimport type { DisplayMode, ResolvedDateLocale } from \"../../shared/types\";\n\nexport type CalendarSelector = \"month\" | \"year\" | null;\n\ninterface CalendarHeaderProps {\n\tdisplayedMonthMs: number;\n\tactiveSelector: CalendarSelector;\n\tdisplayMode: DisplayMode;\n\tshowModeToggle: boolean;\n\ttitle: React.ReactNode;\n\theadline: React.ReactNode;\n\tlocale: ResolvedDateLocale;\n\tcanNavigatePrev: boolean;\n\tcanNavigateNext: boolean;\n\tcanNavigatePreviousYear: boolean;\n\tcanNavigateNextYear: boolean;\n\tonPrev(): void;\n\tonNext(): void;\n\tonPreviousYear(): void;\n\tonNextYear(): void;\n\tonToggleSelector(selector: Exclude<CalendarSelector, null>): void;\n\tonToggleMode(): void;\n}\n\nconst selectorClassName =\n\t\"flex items-center gap-1 rounded-m3-full px-2 py-1 text-[length:var(--md-typescale-title-small-size,14px)] font-[number:var(--md-typescale-title-small-weight,500)] text-m3-on-surface transition-m3-fast-effects hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\";\n\nexport const CalendarHeader: React.FC<CalendarHeaderProps> = ({\n\tdisplayedMonthMs,\n\tactiveSelector,\n\tdisplayMode,\n\tshowModeToggle,\n\ttitle,\n\theadline,\n\tlocale,\n\tcanNavigatePrev,\n\tcanNavigateNext,\n\tcanNavigatePreviousYear,\n\tcanNavigateNextYear,\n\tonPrev,\n\tonNext,\n\tonPreviousYear,\n\tonNextYear,\n\tonToggleSelector,\n\tonToggleMode,\n}) => {\n\tconst date = new Date(displayedMonthMs);\n\tconst monthLabel = new Intl.DateTimeFormat(locale.locale, {\n\t\tmonth: \"short\",\n\t\ttimeZone: \"UTC\",\n\t}).format(date);\n\tconst yearLabel = String(date.getUTCFullYear());\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1 px-6 pb-4 pt-5\">\n\t\t\t<div className=\"text-[length:var(--md-typescale-label-large-size,14px)] font-[number:var(--md-typescale-label-large-weight,500)] text-m3-on-surface-variant\">\n\t\t\t\t{title}\n\t\t\t</div>\n\t\t\t<div className=\"mb-2 leading-tight text-[length:var(--md-typescale-headline-large-size,32px)] font-[number:var(--md-typescale-headline-large-weight,400)] text-m3-on-surface-variant\">\n\t\t\t\t{headline}\n\t\t\t</div>\n\n\t\t\t{displayMode === \"picker\" && (\n\t\t\t\t<div className=\"-mx-2 flex min-h-10 items-center gap-0.5\">\n\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tonClick={onPrev}\n\t\t\t\t\t\t\taria-label=\"Previous month\"\n\t\t\t\t\t\t\tdisabled={!canNavigatePrev}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"chevron_left\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onToggleSelector(\"month\")}\n\t\t\t\t\t\taria-expanded={activeSelector === \"month\"}\n\t\t\t\t\t\taria-controls=\"date-picker-selection\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tselectorClassName,\n\t\t\t\t\t\t\tactiveSelector === \"month\" && \"bg-m3-on-surface/8\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{monthLabel}\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname=\"arrow_drop_down\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-[20px]\",\n\t\t\t\t\t\t\t\tactiveSelector === \"month\" && \"rotate-180\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tonClick={onNext}\n\t\t\t\t\t\t\taria-label=\"Next month\"\n\t\t\t\t\t\t\tdisabled={!canNavigateNext}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"chevron_right\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"ml-auto flex items-center gap-0.5\">\n\t\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onPreviousYear}\n\t\t\t\t\t\t\t\taria-label=\"Previous year\"\n\t\t\t\t\t\t\t\tdisabled={!canNavigatePreviousYear}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_left\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onToggleSelector(\"year\")}\n\t\t\t\t\t\t\taria-expanded={activeSelector === \"year\"}\n\t\t\t\t\t\t\taria-controls=\"date-picker-selection\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tselectorClassName,\n\t\t\t\t\t\t\t\tactiveSelector === \"year\" && \"bg-m3-on-surface/8\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{yearLabel}\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tname=\"arrow_drop_down\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-[20px]\",\n\t\t\t\t\t\t\t\t\tactiveSelector === \"year\" && \"rotate-180\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onNextYear}\n\t\t\t\t\t\t\t\taria-label=\"Next year\"\n\t\t\t\t\t\t\t\tdisabled={!canNavigateNextYear}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_right\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showModeToggle && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onToggleMode}\n\t\t\t\t\t\t\t\taria-label=\"Switch to text input\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"keyboard\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{displayMode === \"input\" && showModeToggle && (\n\t\t\t\t<IconButton\n\t\t\t\t\tonClick={onToggleMode}\n\t\t\t\t\taria-label=\"Switch to calendar\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tclassName=\"self-end\"\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"calendar_month\" />\n\t\t\t\t</IconButton>\n\t\t\t)}\n\t\t\t<span className=\"sr-only\">\n\t\t\t\t{formatMonthYear(displayedMonthMs, locale)}\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nCalendarHeader.displayName = \"CalendarHeader\";\n","/**\n * Scrollable month selector used by the calendar header.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { Icon } from \"../../../icon\";\nimport type { ResolvedDateLocale } from \"../../shared/types\";\n\ninterface MonthPickerListProps {\n\tselectedMonth: number;\n\tlocale: ResolvedDateLocale;\n\tonMonthSelect(month: number): void;\n}\n\nconst getMonthLabel = (month: number, locale: string): string =>\n\tnew Intl.DateTimeFormat(locale, {\n\t\tmonth: \"long\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(Date.UTC(2025, month, 1)));\n\nexport const MonthPickerList: React.FC<MonthPickerListProps> = ({\n\tselectedMonth,\n\tlocale,\n\tonMonthSelect,\n}) => {\n\tconst selectedRef = React.useRef<HTMLButtonElement>(null);\n\n\tReact.useEffect(() => {\n\t\tselectedRef.current?.scrollIntoView?.({\n\t\t\tblock: \"center\",\n\t\t\tbehavior: \"instant\",\n\t\t});\n\t}, []);\n\n\tconst months = React.useMemo(\n\t\t() => Array.from({ length: 12 }, (_, month) => month),\n\t\t[],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full min-h-[240px] overflow-y-auto py-2\"\n\t\t\trole=\"listbox\"\n\t\t\taria-label=\"Select month\"\n\t\t>\n\t\t\t{months.map((month) => {\n\t\t\t\tconst isSelected = month === selectedMonth;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={month}\n\t\t\t\t\t\tref={isSelected ? selectedRef : undefined}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\tonClick={() => onMonthSelect(month)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex min-h-12 w-full items-center gap-4 px-6 text-left\",\n\t\t\t\t\t\t\t\"text-[length:var(--md-typescale-body-large-size,16px)]\",\n\t\t\t\t\t\t\t\"text-m3-on-surface transition-m3-fast-effects\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\",\n\t\t\t\t\t\t\tisSelected &&\n\t\t\t\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"w-6\" aria-hidden>\n\t\t\t\t\t\t\t{isSelected && <Icon name=\"check\" className=\"text-[20px]\" />}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{getMonthLabel(month, locale.locale)}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nMonthPickerList.displayName = \"MonthPickerList\";\n","/**\n * Scrollable, responsive year selector used by the calendar header.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { Icon } from \"../../../icon\";\nimport { isYearSelectable } from \"../../shared/calendar-model\";\nimport type { SelectableDates } from \"../../shared/types\";\n\ninterface YearPickerListProps {\n\tselectedYear: number;\n\tyearRange: [number, number];\n\tselectableDates: SelectableDates;\n\tonYearSelect(year: number): void;\n}\n\nexport const YearPickerList: React.FC<YearPickerListProps> = ({\n\tselectedYear,\n\tyearRange,\n\tselectableDates,\n\tonYearSelect,\n}) => {\n\tconst selectedRef = React.useRef<HTMLButtonElement>(null);\n\tconst years = React.useMemo(() => {\n\t\tconst [min, max] = yearRange;\n\t\treturn Array.from({ length: max - min + 1 }, (_, index) => min + index);\n\t}, [yearRange]);\n\n\tReact.useEffect(() => {\n\t\tselectedRef.current?.scrollIntoView?.({\n\t\t\tblock: \"center\",\n\t\t\tbehavior: \"instant\",\n\t\t});\n\t}, []);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full min-h-[240px] overflow-y-auto py-2\"\n\t\t\trole=\"listbox\"\n\t\t\taria-label=\"Select year\"\n\t\t>\n\t\t\t{years.map((year) => {\n\t\t\t\tconst isSelected = year === selectedYear;\n\t\t\t\tconst isSelectable = isYearSelectable(year, selectableDates);\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={year}\n\t\t\t\t\t\tref={isSelected ? selectedRef : undefined}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\taria-disabled={!isSelectable || undefined}\n\t\t\t\t\t\tdisabled={!isSelectable}\n\t\t\t\t\t\tonClick={() => onYearSelect(year)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex min-h-12 w-full items-center gap-4 px-6 text-left\",\n\t\t\t\t\t\t\t\"text-[length:var(--md-typescale-body-large-size,16px)]\",\n\t\t\t\t\t\t\t\"text-m3-on-surface transition-m3-fast-effects\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\",\n\t\t\t\t\t\t\tisSelected &&\n\t\t\t\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\t\t\t\t!isSelectable && \"cursor-not-allowed opacity-[0.38]\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"w-6\" aria-hidden>\n\t\t\t\t\t\t\t{isSelected && <Icon name=\"check\" className=\"text-[20px]\" />}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{year}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nYearPickerList.displayName = \"YearPickerList\";\n","/**\n * @file date-picker/date-picker.tsx\n *\n * DatePicker — calendar UI component (excluding dialog wrapper).\n * Equivalent to `DatePicker` composable in Android Compose Material3.\n *\n * Layout:\n * CalendarHeader (title, headline, month nav)\n * ↓\n * CalendarGrid | YearPickerGrid (AnimatePresence toggle)\n * ↓\n * DatePickerInput (when displayMode === 'input')\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport { AnimatePresence } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n\tformatDate,\n\tgetNavigableMonth,\n\tisMonthNavigable,\n} from \"../shared/calendar-model\";\nimport type { DatePickerProps } from \"./date-picker.types\";\nimport { DatePickerInput } from \"./date-picker-input\";\nimport { CalendarGrid } from \"./subcomponents/calendar-grid\";\nimport {\n\tCalendarHeader,\n\ttype CalendarSelector,\n} from \"./subcomponents/calendar-header\";\nimport { MonthPickerList } from \"./subcomponents/month-picker-list\";\nimport { YearPickerList } from \"./subcomponents/year-picker-list\";\n\n/** Format UTC ms → \"MM/DD/YYYY\" for input sync */\nconst formatInputDate = (ms: number): string =>\n\tnew Intl.DateTimeFormat(\"en-US\", {\n\t\tmonth: \"2-digit\",\n\t\tday: \"2-digit\",\n\t\tyear: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(ms));\n\n/**\n * DatePicker calendar UI.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({ locale: { locale: 'en-US' } });\n *\n * <DatePicker\n * state={state}\n * showModeToggle\n * title=\"Select date\"\n * />\n * ```\n */\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n\tstate,\n\tshowModeToggle = true,\n\ttitle,\n\theadline,\n\tclassName,\n}) => {\n\tconst {\n\t\tselectedDateMs,\n\t\tdisplayedMonthMs,\n\t\tdisplayMode,\n\t\tyearRange,\n\t\tlocale,\n\t\tselectableDates,\n\t\tselectDate,\n\t\tnavigateMonth,\n\t\tnavigateToMonth,\n\t\tsetDisplayMode,\n\t} = state;\n\n\tconst [activeSelector, setActiveSelector] =\n\t\tReact.useState<CalendarSelector>(null);\n\n\t// ── Navigation direction tracking ────────────────────────────────────────────\n\tconst [slideDirection, setSlideDirection] = React.useState<\n\t\t\"prev\" | \"next\" | null\n\t>(null);\n\n\tconst handlePrev = React.useCallback(() => {\n\t\tsetSlideDirection(\"prev\");\n\t\tnavigateMonth(\"prev\");\n\t}, [navigateMonth]);\n\n\tconst handleNext = React.useCallback(() => {\n\t\tsetSlideDirection(\"next\");\n\t\tnavigateMonth(\"next\");\n\t}, [navigateMonth]);\n\n\tconst handleYearSelect = React.useCallback(\n\t\t(year: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(year, d.getUTCMonth());\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\tconst handleMonthSelect = React.useCallback(\n\t\t(month: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(d.getUTCFullYear(), month);\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\t// ── Input mode state ─────────────────────────────────────────────────────────\n\tconst [inputValue, setInputValue] = React.useState(() =>\n\t\tselectedDateMs !== null ? formatInputDate(selectedDateMs) : \"\",\n\t);\n\tconst [inputError, setInputError] = React.useState<string | undefined>();\n\n\tconst handleInputCommit = React.useCallback(\n\t\t(ms: number | null) => {\n\t\t\tif (ms === null && inputValue.length > 0) {\n\t\t\t\tsetInputError(\"Invalid date\");\n\t\t\t} else {\n\t\t\t\tsetInputError(undefined);\n\t\t\t\tselectDate(ms);\n\t\t\t}\n\t\t},\n\t\t[inputValue, selectDate],\n\t);\n\n\t// ── Default title / headline ─────────────────────────────────────────────────\n\tconst resolvedTitle = title ?? \"Select date\";\n\tconst resolvedHeadline =\n\t\theadline ??\n\t\t(selectedDateMs !== null\n\t\t\t? formatDate(selectedDateMs, locale, {\n\t\t\t\t\tweekday: \"short\",\n\t\t\t\t\tmonth: \"short\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\ttimeZone: \"UTC\",\n\t\t\t\t})\n\t\t\t: \"—\");\n\n\t// ── Current year ─────────────────────────────────────────────────────────────\n\tconst currentYear = new Date(displayedMonthMs).getUTCFullYear();\n\tconst currentMonth = new Date(displayedMonthMs).getUTCMonth();\n\tconst computedAriaLabel =\n\t\ttypeof resolvedTitle === \"string\" ? resolvedTitle : \"Date picker\";\n\tconst canNavigatePrev =\n\t\tgetNavigableMonth(displayedMonthMs, \"prev\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigateNext =\n\t\tgetNavigableMonth(displayedMonthMs, \"next\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigatePreviousYear = isMonthNavigable(\n\t\tcurrentYear - 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\tconst canNavigateNextYear = isMonthNavigable(\n\t\tcurrentYear + 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={cn(\"flex flex-col select-none\", className)}\n\t\t\tstyle={{ width: \"min(100%, 360px)\" }}\n\t\t\taria-label={computedAriaLabel}\n\t\t>\n\t\t\t<legend className=\"sr-only\">{computedAriaLabel}</legend>\n\t\t\t{/* Header */}\n\t\t\t<CalendarHeader\n\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\tactiveSelector={activeSelector}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t\tshowModeToggle={showModeToggle}\n\t\t\t\ttitle={resolvedTitle}\n\t\t\t\theadline={resolvedHeadline}\n\t\t\t\tlocale={locale}\n\t\t\t\tcanNavigatePrev={canNavigatePrev}\n\t\t\t\tcanNavigateNext={canNavigateNext}\n\t\t\t\tcanNavigatePreviousYear={canNavigatePreviousYear}\n\t\t\t\tcanNavigateNextYear={canNavigateNextYear}\n\t\t\t\tonPrev={handlePrev}\n\t\t\t\tonNext={handleNext}\n\t\t\t\tonPreviousYear={() => navigateToMonth(currentYear - 1, currentMonth)}\n\t\t\t\tonNextYear={() => navigateToMonth(currentYear + 1, currentMonth)}\n\t\t\t\tonToggleSelector={(selector) =>\n\t\t\t\t\tsetActiveSelector((active) => (active === selector ? null : selector))\n\t\t\t\t}\n\t\t\t\tonToggleMode={() => {\n\t\t\t\t\tsetDisplayMode(displayMode === \"picker\" ? \"input\" : \"picker\");\n\t\t\t\t\tsetActiveSelector(null);\n\t\t\t\t\tsetInputError(undefined);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{/* Body */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative flex-1 overflow-hidden\"\n\t\t\t\tstyle={{ minHeight: \"296px\" }}\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{displayMode === \"input\" ? (\n\t\t\t\t\t\t// Input mode\n\t\t\t\t\t\t<DatePickerInput\n\t\t\t\t\t\t\tkey=\"input-mode\"\n\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\tonChange={setInputValue}\n\t\t\t\t\t\t\tonCommit={handleInputCommit}\n\t\t\t\t\t\t\terror={inputError}\n\t\t\t\t\t\t\tlocale={locale.locale}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : activeSelector === \"month\" ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"month-list\"\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MonthPickerList\n\t\t\t\t\t\t\t\tselectedMonth={currentMonth}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t\tonMonthSelect={handleMonthSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : activeSelector === \"year\" ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"year-list\"\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<YearPickerList\n\t\t\t\t\t\t\t\tselectedYear={currentYear}\n\t\t\t\t\t\t\t\tyearRange={yearRange}\n\t\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\t\tonYearSelect={handleYearSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t// Calendar grid\n\t\t\t\t\t\t<CalendarGrid\n\t\t\t\t\t\t\tkey=\"calendar\"\n\t\t\t\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\t\t\t\tslideDirection={slideDirection}\n\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\tselectedMs={selectedDateMs}\n\t\t\t\t\t\t\tisRangePicker={false}\n\t\t\t\t\t\t\tonDaySelect={(ms) => {\n\t\t\t\t\t\t\t\tselectDate(ms);\n\t\t\t\t\t\t\t\tsetInputValue(formatInputDate(ms));\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</fieldset>\n\t);\n};\n\nDatePicker.displayName = \"DatePicker\";\n","/**\n * @file date-picker/date-picker.tokens.ts\n *\n * MD3 Design tokens for Date Picker component.\n * Maps from DatePickerModalTokens.kt → CSS variables in packages/tailwind/src/index.css.\n *\n * @see docs/m3/date-and-time-pickers/date-pickers/DatePickerModalTokens.kt\n * @see packages/tailwind/src/index.css\n */\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/** Color tokens — uses CSS custom properties from MD3 theme */\nexport const DP_COLORS = {\n\t/** Dialog container — SurfaceContainerHigh */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\t/** Selected day background — Primary */\n\tdaySelected: \"var(--md-sys-color-primary)\",\n\t/** Selected day text — OnPrimary */\n\tdaySelectedText: \"var(--md-sys-color-on-primary)\",\n\t/** Today outline — Primary */\n\ttodayOutline: \"var(--md-sys-color-primary)\",\n\t/** Today text — Primary */\n\ttodayText: \"var(--md-sys-color-primary)\",\n\t/** Unselected day text — OnSurface */\n\tdayText: \"var(--md-sys-color-on-surface)\",\n\t/** Weekday header text — OnSurface */\n\tweekdayText: \"var(--md-sys-color-on-surface)\",\n\t/** Header headline + supporting text — OnSurfaceVariant */\n\theaderText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Range highlight background — SecondaryContainer */\n\trangeHighlight: \"var(--md-sys-color-secondary-container)\",\n\t/** Range highlight text — OnSecondaryContainer */\n\trangeText: \"var(--md-sys-color-on-secondary-container)\",\n\t/** Unselected year text — OnSurfaceVariant */\n\tyearText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Selected year background — Primary */\n\tyearSelected: \"var(--md-sys-color-primary)\",\n\t/** Selected year text — OnPrimary */\n\tyearSelectedText: \"var(--md-sys-color-on-primary)\",\n\t/** Scrim overlay */\n\tscrim: \"var(--md-sys-color-scrim)\",\n} as const;\n\n// ─── Shape Tokens ─────────────────────────────────────────────────────────────\n\n/** Shape tokens — corner radii from MD3 shape scale */\nexport const DP_SHAPE = {\n\t/** Dialog container — CornerExtraLarge = 28px */\n\tcontainer: \"var(--md-sys-shape-corner-extra-large)\",\n\t/** Day cell — CornerFull = pill */\n\tday: \"var(--md-sys-shape-corner-full)\",\n\t/** Range start/end indicator — CornerFull */\n\trangeEndpoint: \"var(--md-sys-shape-corner-full)\",\n\t/** Year chip — CornerFull */\n\tyear: \"var(--md-sys-shape-corner-full)\",\n} as const;\n\n// ─── Dimension Tokens ─────────────────────────────────────────────────────────\n\n/** Fixed dimension tokens from DatePickerModalTokens.kt */\nexport const DP_SIZE = {\n\t/** Dialog container width */\n\tcontainerWidth: 360,\n\t/** Dialog container height */\n\tcontainerHeight: 568,\n\t/** Day cell width/height */\n\tdayCell: 40,\n\t/** Today border width */\n\ttodayOutlineWidth: 1,\n\t/** Header container height */\n\theaderHeight: 120,\n\t/** Range picker header height */\n\trangeHeaderHeight: 128,\n\t/** Year chip height */\n\tyearChipHeight: 36,\n\t/** Year chip width */\n\tyearChipWidth: 72,\n} as const;\n\n// ─── Tailwind Class Helpers ───────────────────────────────────────────────────\n\n/**\n * Tailwind utility class strings for Date Picker elements.\n * Used with `cn()` function.\n */\nexport const DP_CLASSES = {\n\t/** Dialog container */\n\tdialog: [\n\t\t\"bg-m3-surface-container-high\",\n\t\t\"rounded-m3-xl\",\n\t\t\"w-[360px]\",\n\t\t\"overflow-hidden\",\n\t\t\"elevation-3\",\n\t].join(\" \"),\n\n\t/** Day cell container */\n\tdayCell: [\n\t\t\"relative flex items-center justify-center\",\n\t\t\"w-10 h-10 rounded-m3-full\",\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)]\",\n\t\t\"font-[var(--md-typescale-body-large-weight,400)]\",\n\t\t\"cursor-pointer select-none\",\n\t\t\"transition-m3-fast-effects\",\n\t].join(\" \"),\n\n\t/** Day cell: selected state */\n\tdayCellSelected: [\"bg-m3-primary\", \"text-m3-on-primary\"].join(\" \"),\n\n\t/** Day cell: today state */\n\tdayCellToday: [\n\t\t\"outline outline-1 outline-m3-primary\",\n\t\t\"text-m3-primary\",\n\t].join(\" \"),\n\n\t/** Day cell: disabled state */\n\tdayCellDisabled: \"opacity-[0.38] pointer-events-none cursor-not-allowed\",\n\n\t/** Range highlight (between start and end) */\n\trangeHighlight: \"bg-m3-secondary-container\",\n\n\t/** Weekday header row */\n\tweekdayRow:\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)] text-m3-on-surface\",\n} as const;\n","\"use client\";\n\nimport * as RadixScrollArea from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n/** Radix accepts hover/scroll/always/auto. We add 'none' as a UI-only hide. */\nexport type ScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"none\";\ntype RadixScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"auto\";\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface ScrollAreaProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Root>,\n\t\t\"type\"\n\t> {\n\t/**\n\t * Controls when the scrollbars are visible.\n\t * - `hover`: Show on hover (default, recommended for desktop)\n\t * - `scroll`: Show only while scrolling (recommended for mobile)\n\t * - `always`: Always visible\n\t * - `none`: Never visible\n\t */\n\ttype?: ScrollAreaType;\n\t/**\n\t * The scrollbar orientation to render.\n\t * @default \"vertical\"\n\t */\n\torientation?: ScrollAreaOrientation;\n\t/** Delay in ms before scrollbars hide when `type` is `hover` or `scroll`. */\n\tscrollHideDelay?: number;\n\t/** Extra classes applied to the inner viewport element. */\n\tviewportClassName?: string;\n\t/** Ref to the scrolling viewport element. */\n\tviewportRef?: React.Ref<HTMLDivElement>;\n\t/** Extra props applied to the viewport element. */\n\tviewportProps?: React.ComponentPropsWithoutRef<\n\t\ttypeof RadixScrollArea.Viewport\n\t>;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\nconst ScrollArea = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Root>,\n\tScrollAreaProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tviewportClassName,\n\t\t\tchildren,\n\t\t\ttype = \"hover\",\n\t\t\torientation = \"vertical\",\n\t\t\tscrollHideDelay = 600,\n\t\t\tviewportRef,\n\t\t\tviewportProps,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [isTouchDevice, setIsTouchDevice] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tsetIsTouchDevice(\n\t\t\t\t\t\"ontouchstart\" in window || navigator.maxTouchPoints > 0,\n\t\t\t\t);\n\t\t\t}\n\t\t}, []);\n\n\t\tconst resolvedType = React.useMemo(() => {\n\t\t\tif (type === \"hover\" && isTouchDevice) {\n\t\t\t\treturn \"scroll\";\n\t\t\t}\n\t\t\treturn type;\n\t\t}, [type, isTouchDevice]);\n\n\t\tconst radixType: RadixScrollAreaType =\n\t\t\tresolvedType === \"none\" ? \"always\" : resolvedType;\n\n\t\treturn (\n\t\t\t<RadixScrollArea.Root\n\t\t\t\tref={ref}\n\t\t\t\ttype={radixType}\n\t\t\t\tscrollHideDelay={scrollHideDelay}\n\t\t\t\tclassName={cn(\"relative overflow-hidden flex flex-col\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<RadixScrollArea.Viewport\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\t{...viewportProps}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"h-full w-full flex-1 min-h-0 min-w-0 rounded-[inherit]\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-1\",\n\t\t\t\t\t\tviewportClassName,\n\t\t\t\t\t\tviewportProps?.className,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RadixScrollArea.Viewport>\n\n\t\t\t\t{(orientation === \"vertical\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{(orientation === \"horizontal\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"horizontal\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<RadixScrollArea.Corner className=\"bg-m3-surface-container\" />\n\t\t\t</RadixScrollArea.Root>\n\t\t);\n\t},\n);\nScrollArea.displayName = \"ScrollArea\";\n\n// ─── Scrollbar ────────────────────────────────────────────────────────────────\nconst ScrollAreaScrollbar = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Scrollbar>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Scrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n\t<RadixScrollArea.Scrollbar\n\t\tref={ref}\n\t\torientation={orientation}\n\t\tclassName={cn(\n\t\t\t\"flex touch-none select-none transition-all duration-300 ease-in-out\",\n\t\t\t\"absolute z-50\",\n\t\t\torientation === \"vertical\" &&\n\t\t\t\t\"right-0 top-0 bottom-0 w-2.5 border-l border-l-transparent p-px\",\n\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\"bottom-0 left-0 right-0 h-2.5 flex-col border-t border-t-transparent p-px\",\n\t\t\t\"data-[state=hidden]:opacity-0 data-[state=visible]:opacity-100\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<RadixScrollArea.Thumb\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex-1 rounded-full bg-m3-on-surface/25 transition-colors duration-200\",\n\t\t\t\t\"hover:bg-m3-on-surface/40 active:bg-m3-on-surface/55\",\n\t\t\t\t\"before:absolute before:left-1/2 before:top-1/2 before:min-h-11 before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2\",\n\t\t\t)}\n\t\t/>\n\t</RadixScrollArea.Scrollbar>\n));\nScrollAreaScrollbar.displayName = RadixScrollArea.Scrollbar.displayName;\n\n// ─── Corner ───────────────────────────────────────────────────────────────────\nconst ScrollAreaCorner = React.forwardRef<\n\tReact.ComponentRef<typeof RadixScrollArea.Corner>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Corner>\n>(({ className, ...props }, ref) => (\n\t<RadixScrollArea.Corner\n\t\tref={ref}\n\t\tclassName={cn(\"bg-m3-surface-container\", className)}\n\t\t{...props}\n\t/>\n));\nScrollAreaCorner.displayName = \"ScrollAreaCorner\";\n\nexport { ScrollArea, ScrollAreaScrollbar };\n","/**\n * @file dialog.tsx\n *\n * Dialog component system built on Material Design 3 Expressive guidelines.\n *\n * Extends Radix UI Dialog primitives with Framer Motion physics-based Spring animations\n * for entrance and exit transitions matching MD3 Expressive specifications.\n * Supports both Standard modal and Full-Screen dialog variants.\n *\n * @see https://m3.material.io/components/dialogs/overview\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { IconButton } from \"./buttons/icon-button\";\nimport { Icon } from \"./icon\";\nimport { ScrollArea } from \"./scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─── MD3 Spring Config (Expressive) ──────────────────────────────────────────\n// MD3 default.spatial: stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19\nconst MD3_SPRING = DEFAULT_SPATIAL_SPRING;\n\nconst MD3_OVERLAY_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: \"easeOut\" as const },\n\t},\n\texit: { opacity: 0, transition: { duration: 0.15, ease: \"easeIn\" as const } },\n};\n\nconst MD3_CONTENT_ANIM = {\n\tinitial: { opacity: 0, scale: 0.85, y: 24 },\n\tanimate: { opacity: 1, scale: 1, y: 0, transition: MD3_SPRING },\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 8,\n\t\ttransition: { duration: 0.15, ease: \"easeIn\" as const },\n\t},\n};\n\nconst MD3_FULLSCREEN_ANIM = {\n\tinitial: { y: \"100%\" },\n\tanimate: { y: 0, transition: MD3_SPRING },\n\texit: { y: \"100%\", transition: { duration: 0.2, ease: \"easeIn\" as const } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Root `Dialog` props. Wraps Radix `Dialog.Root` supporting controlled and uncontrolled open state.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Open Dialog</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Confirm Action</DialogTitle>\n * </DialogHeader>\n * <DialogBody>Are you sure you want to proceed?</DialogBody>\n * <DialogFooter>\n * <Button onClick={() => setOpen(false)} variant=\"text\">Cancel</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n */\nexport interface DialogProps {\n\t/** Whether the dialog is open (controlled). Omit for uncontrolled. */\n\topen?: boolean;\n\t/** Called when the open state should change. */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Dialog trigger + content. */\n\tchildren: React.ReactNode;\n}\n\n/**\n * Props passed to standard container `DialogContent`.\n *\n * @see {@link DialogContent}\n */\nexport interface DialogContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Hides the top-right close (X) button. @default false */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n/**\n * Props for `DialogFullScreenContent` dedicated to Full-Screen dialog mode.\n *\n * @remarks\n * Full-screen dialogs expand to cover the entire device screen and feature a Top App Bar\n * with a title label, close button, and action confirmation button.\n *\n * @see {@link DialogFullScreenContent}\n * @see https://m3.material.io/components/dialogs/guidelines#full-screen\n */\nexport interface DialogFullScreenContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Title label displayed in the Top App Bar. */\n\ttitle?: string;\n\t/** Label for the primary action button on the Top App Bar (e.g. \"Save\"). */\n\tactionLabel?: string;\n\t/** Handler invoked when pressing the primary action button. */\n\tonAction?: () => void;\n\t/** Renders a divider separating Top App Bar from scrollable body content. @default false */\n\tshowDivider?: boolean;\n\tclassName?: string;\n}\n\n// ─── Re-exports wrapper ───────────────────────────────────────────────────────\n\n/**\n * Dialog component Root — wraps Radix `Dialog.Root`.\n *\n * @remarks Supports controlled state via `open`/`onOpenChange`, or uncontrolled state using `DialogTrigger`.\n */\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => (\n\t<RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t{children}\n\t</RadixDialog.Root>\n);\nDialog.displayName = \"Dialog\";\n\n/** Trigger element that toggles the open state of the Dialog (supports `asChild`). */\nconst DialogTrigger = RadixDialog.Trigger;\nDialogTrigger.displayName = \"DialogTrigger\";\n\n// ─── Portal + Overlay + Content ───────────────────────────────────────────────\nconst DialogPortal = ({\n\topen,\n\tchildren,\n}: {\n\topen?: boolean;\n\tchildren: React.ReactNode;\n}) => (\n\t<RadixDialog.Portal forceMount>\n\t\t<AnimatePresence>\n\t\t\t{open ? React.Children.toArray(children) : null}\n\t\t</AnimatePresence>\n\t</RadixDialog.Portal>\n);\nDialogPortal.displayName = \"DialogPortal\";\n\nconst DialogOverlay = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Overlay>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Overlay ref={ref} asChild {...props}>\n\t\t<m.div\n\t\t\tclassName={cn(\"fixed inset-0 z-50 bg-black/32\", className)}\n\t\t\taria-hidden=\"true\"\n\t\t\t{...MD3_OVERLAY_ANIM}\n\t\t/>\n\t</RadixDialog.Overlay>\n));\nDialogOverlay.displayName = \"DialogOverlay\";\n\nconst DialogContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogContentProps\n>(({ className, children, hideCloseButton = false, ...props }, ref) => (\n\t<RadixDialog.Content\n\t\tref={ref}\n\t\tasChild\n\t\taria-describedby={undefined}\n\t\t{...props}\n\t>\n\t\t<m.div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\"w-[calc(100%-2rem)] max-w-140\",\n\t\t\t\t\"rounded-[28px] bg-m3-surface-container-high p-6\",\n\t\t\t\t\"shadow-lg outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\trole=\"dialog\"\n\t\t\t{...MD3_CONTENT_ANIM}\n\t\t>\n\t\t\t{children}\n\t\t\t{!hideCloseButton && (\n\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tcolorStyle=\"filled\"\n\t\t\t\t\t\tclassName=\"absolute right-4 top-4\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</RadixDialog.Close>\n\t\t\t)}\n\t\t</m.div>\n\t</RadixDialog.Content>\n));\nDialogContent.displayName = \"DialogContent\";\n\n// ─── Header & Related ────────────────────────────────────────────────────────\nconst DialogIcon = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n\t<div\n\t\tref={ref}\n\t\tclassName={cn(\"flex justify-center mb-4 text-m3-secondary\", className)}\n\t\taria-hidden=\"true\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</div>\n));\nDialogIcon.displayName = \"DialogIcon\";\n\nconst DialogHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-2 mb-4\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\n// RadixDialog.Title surfaces to the accessibility tree — required\nconst DialogTitle = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Title>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Title\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\n\t\t\t\"text-[24px] leading-8 font-normal text-m3-on-surface tracking-[0em]\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = \"DialogTitle\";\n\nconst DialogDescription = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Description>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Description\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\"text-sm text-m3-on-surface-variant leading-5\", className)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = \"DialogDescription\";\n\n// ─── Body & Footer ───────────────────────────────────────────────────────────\nconst DialogBody = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, dir, ...props }, ref) => (\n\t<ScrollArea\n\t\tref={ref}\n\t\ttype=\"hover\"\n\t\tdir={dir as \"ltr\" | \"rtl\" | undefined}\n\t\tclassName={cn(\"max-h-[calc(85dvh-200px)] -mx-6\", className)}\n\t\tviewportClassName=\"px-6\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</ScrollArea>\n));\nDialogBody.displayName = \"DialogBody\";\n\nconst DialogFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\"flex flex-row justify-end gap-2 mt-6\", className)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogClose = RadixDialog.Close;\n\n// ─── Full Screen Content Variant ──────────────────────────────────────────────\nconst DialogFullScreenContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogFullScreenContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\ttitle,\n\t\t\tactionLabel,\n\t\t\tonAction,\n\t\t\tshowDivider,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<RadixDialog.Content\n\t\t\tref={ref}\n\t\t\tasChild\n\t\t\taria-describedby={undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t<m.div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-50 w-full h-full bg-m3-surface flex flex-col\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\trole=\"dialog\"\n\t\t\t\t{...MD3_FULLSCREEN_ANIM}\n\t\t\t>\n\t\t\t\t<div className=\"flex shrink-0 items-center px-4 h-14 gap-2 bg-m3-surface\">\n\t\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t\t<IconButton size=\"sm\" colorStyle=\"filled\" aria-label=\"Close\">\n\t\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</RadixDialog.Close>\n\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<DialogTitle className=\"flex-1 text-[22px] leading-7 font-medium truncate pr-2\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</DialogTitle>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{actionLabel && onAction && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onAction}\n\t\t\t\t\t\t\tclassName=\"text-sm font-medium text-m3-primary px-3 py-2 rounded-full hover:bg-m3-primary/8 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary transition-colors whitespace-nowrap\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{showDivider && (\n\t\t\t\t\t<hr className=\"border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t)}\n\n\t\t\t\t<ScrollArea\n\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\tclassName=\"flex-1 w-full\"\n\t\t\t\t\tviewportClassName=\"p-6\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</ScrollArea>\n\t\t\t</m.div>\n\t\t</RadixDialog.Content>\n\t),\n);\nDialogFullScreenContent.displayName = \"DialogFullScreenContent\";\n\nexport {\n\tDialog,\n\tDialogBody,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogFullScreenContent,\n\tDialogHeader,\n\tDialogIcon,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","/**\n * @file date-picker/date-picker-dialog.tsx\n *\n * Modal container for Date Pickers — reuses Dialog + DialogPortal primitives.\n * Equivalent to `DatePickerDialog` composable in Android Compose Material3.\n *\n * Tokens from DatePickerModalTokens.kt:\n * - ContainerColor = SurfaceContainerHigh (#ece6f0)\n * - ContainerShape = CornerExtraLarge (28px)\n * - ContainerElevation = Level3\n * - ContainerWidth = 360px, ContainerHeight = 568px (single date)\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { m } from \"motion/react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Dialog, DialogPortal } from \"../../dialog\";\nimport {\n\tPICKER_CONTENT_ANIM,\n\tPICKER_OVERLAY_ANIM,\n} from \"../shared/animation-tokens\";\nimport type { DatePickerDialogProps } from \"./date-picker.types\";\n\n/**\n * Modal Date Picker dialog with MD3 Expressive spring animations.\n *\n * Reuses `<Dialog>` (Root) and `<DialogPortal>` (AnimatePresence + Portal lifecycle)\n * while managing Overlay and Content to preserve MD3 Date Picker layout specs.\n *\n * @example\n\n * ```tsx\n * const state = useDatePickerState();\n * const [open, setOpen] = React.useState(false);\n *\n * <DatePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * confirmButton={\n * <Button variant=\"text\" onClick={() => { handleConfirm(state.selectedDateMs); setOpen(false); }}>\n * OK\n * </Button>\n * }\n * dismissButton={\n * <Button variant=\"text\" onClick={() => setOpen(false)}>Cancel</Button>\n * }\n * >\n * <DatePicker state={state} />\n * </DatePickerDialog>\n * ```\n */\nexport const DatePickerDialog: React.FC<DatePickerDialogProps> = ({\n\topen,\n\tonDismiss,\n\tconfirmButton,\n\tdismissButton,\n\tchildren,\n\tclassName,\n\ttitle = \"Select date\",\n}) => {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={(v) => !v && onDismiss()}>\n\t\t\t<DialogPortal open={open}>\n\t\t\t\t{/* Scrim */}\n\t\t\t\t<RadixDialog.Overlay asChild forceMount>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"picker-overlay\"\n\t\t\t\t\t\tclassName=\"fixed inset-0 z-50 bg-m3-scrim/40\"\n\t\t\t\t\t\tinitial={PICKER_OVERLAY_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_OVERLAY_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_OVERLAY_ANIM.exit}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t/>\n\t\t\t\t</RadixDialog.Overlay>\n\n\t\t\t\t{/* Dialog panel */}\n\t\t\t\t<RadixDialog.Content\n\t\t\t\t\tasChild\n\t\t\t\t\tforceMount\n\t\t\t\t\tonEscapeKeyDown={onDismiss}\n\t\t\t\t\tonPointerDownOutside={(e) => e.preventDefault()} // scrim handles dismiss\n\t\t\t\t\taria-modal\n\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"picker-content\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"fixed z-50 left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t\"bg-m3-surface-container-high\",\n\t\t\t\t\t\t\t\"rounded-m3-xl\",\n\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t// Elevation Level 3\n\t\t\t\t\t\t\t\"elevation-3\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ width: \"min(calc(100vw - 32px), 360px)\" }}\n\t\t\t\t\t\tinitial={PICKER_CONTENT_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_CONTENT_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_CONTENT_ANIM.exit}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">{title}</RadixDialog.Title>\n\n\t\t\t\t\t\t{/* Content — DatePicker or DateRangePicker */}\n\t\t\t\t\t\t<div className=\"flex-1 overflow-hidden\">{children}</div>\n\n\t\t\t\t\t\t{/* Action buttons footer */}\n\t\t\t\t\t\t<div className=\"flex items-center justify-end gap-2 px-4 py-3\">\n\t\t\t\t\t\t\t{dismissButton}\n\t\t\t\t\t\t\t{confirmButton}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</RadixDialog.Content>\n\t\t\t</DialogPortal>\n\t\t</Dialog>\n\t);\n};\n\nDatePickerDialog.displayName = \"DatePickerDialog\";\n","/**\n * @file date-picker/date-range-picker.tsx\n *\n * DateRangePicker — calendar UI for date range selection.\n * Equivalent to `DateRangePicker` composable in Android Compose Material3.\n *\n * Differences from DatePicker:\n * - Highlights range between start and end (SecondaryContainer)\n * - Headline displays \"Start date → End date\"\n * - Default title: \"Select dates\" (plural)\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport { AnimatePresence } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n\tformatDate,\n\tgetNavigableMonth,\n\tisMonthNavigable,\n} from \"../shared/calendar-model\";\nimport type { DateRangePickerProps } from \"./date-picker.types\";\nimport { CalendarGrid } from \"./subcomponents/calendar-grid\";\nimport {\n\tCalendarHeader,\n\ttype CalendarSelector,\n} from \"./subcomponents/calendar-header\";\nimport { MonthPickerList } from \"./subcomponents/month-picker-list\";\nimport { YearPickerList } from \"./subcomponents/year-picker-list\";\n\n/**\n * DateRangePicker calendar UI.\n *\n * @example\n * ```tsx\n * const state = useDateRangePickerState();\n *\n * <DateRangePicker\n * state={state}\n * title=\"Select travel dates\"\n * />\n * ```\n */\nexport const DateRangePicker: React.FC<DateRangePickerProps> = ({\n\tstate,\n\tshowModeToggle = false,\n\ttitle,\n\tclassName,\n}) => {\n\tconst {\n\t\tselectedStartMs,\n\t\tselectedEndMs,\n\t\tdisplayedMonthMs,\n\t\tdisplayMode,\n\t\tyearRange,\n\t\tlocale,\n\t\tselectableDates,\n\t\tselectDate,\n\t\tnavigateMonth,\n\t\tnavigateToMonth,\n\t\tsetDisplayMode,\n\t} = state;\n\n\tconst [activeSelector, setActiveSelector] =\n\t\tReact.useState<CalendarSelector>(null);\n\tconst [slideDirection, setSlideDirection] = React.useState<\n\t\t\"prev\" | \"next\" | null\n\t>(null);\n\n\tconst handlePrev = React.useCallback(() => {\n\t\tsetSlideDirection(\"prev\");\n\t\tnavigateMonth(\"prev\");\n\t}, [navigateMonth]);\n\n\tconst handleNext = React.useCallback(() => {\n\t\tsetSlideDirection(\"next\");\n\t\tnavigateMonth(\"next\");\n\t}, [navigateMonth]);\n\n\tconst handleYearSelect = React.useCallback(\n\t\t(year: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(year, d.getUTCMonth());\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\tconst handleMonthSelect = React.useCallback(\n\t\t(month: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(d.getUTCFullYear(), month);\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\t// ── Headline: \"Start → End\" ──────────────────────────────────────────────────\n\tconst formatShort = React.useCallback(\n\t\t(ms: number | null): string => {\n\t\t\tif (ms === null) return \"—\";\n\t\t\treturn formatDate(ms, locale, {\n\t\t\t\tmonth: \"short\",\n\t\t\t\tday: \"numeric\",\n\t\t\t\ttimeZone: \"UTC\",\n\t\t\t});\n\t\t},\n\t\t[locale],\n\t);\n\n\tconst headline = `${formatShort(selectedStartMs)} – ${formatShort(selectedEndMs)}`;\n\n\tconst currentYear = new Date(displayedMonthMs).getUTCFullYear();\n\tconst currentMonth = new Date(displayedMonthMs).getUTCMonth();\n\n\tconst computedAriaLabel =\n\t\ttypeof title === \"string\" ? title : \"Date range picker\";\n\tconst canNavigatePrev =\n\t\tgetNavigableMonth(displayedMonthMs, \"prev\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigateNext =\n\t\tgetNavigableMonth(displayedMonthMs, \"next\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigatePreviousYear = isMonthNavigable(\n\t\tcurrentYear - 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\tconst canNavigateNextYear = isMonthNavigable(\n\t\tcurrentYear + 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={cn(\"flex flex-col select-none\", className)}\n\t\t\tstyle={{ width: \"min(100%, 360px)\" }}\n\t\t\taria-label={computedAriaLabel}\n\t\t>\n\t\t\t<legend className=\"sr-only\">{computedAriaLabel}</legend>\n\t\t\t{/* Header */}\n\t\t\t<CalendarHeader\n\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\tactiveSelector={activeSelector}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t\tshowModeToggle={showModeToggle}\n\t\t\t\ttitle={title ?? \"Select dates\"}\n\t\t\t\theadline={headline}\n\t\t\t\tlocale={locale}\n\t\t\t\tcanNavigatePrev={canNavigatePrev}\n\t\t\t\tcanNavigateNext={canNavigateNext}\n\t\t\t\tcanNavigatePreviousYear={canNavigatePreviousYear}\n\t\t\t\tcanNavigateNextYear={canNavigateNextYear}\n\t\t\t\tonPrev={handlePrev}\n\t\t\t\tonNext={handleNext}\n\t\t\t\tonPreviousYear={() => navigateToMonth(currentYear - 1, currentMonth)}\n\t\t\t\tonNextYear={() => navigateToMonth(currentYear + 1, currentMonth)}\n\t\t\t\tonToggleSelector={(selector) =>\n\t\t\t\t\tsetActiveSelector((active) => (active === selector ? null : selector))\n\t\t\t\t}\n\t\t\t\tonToggleMode={() => {\n\t\t\t\t\tsetDisplayMode(displayMode === \"picker\" ? \"input\" : \"picker\");\n\t\t\t\t\tsetActiveSelector(null);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{/* Body */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative flex-1 overflow-hidden\"\n\t\t\t\tstyle={{ minHeight: \"296px\" }}\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{activeSelector === \"month\" ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"month-list\"\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MonthPickerList\n\t\t\t\t\t\t\t\tselectedMonth={currentMonth}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t\tonMonthSelect={handleMonthSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : activeSelector === \"year\" ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"year-list\"\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<YearPickerList\n\t\t\t\t\t\t\t\tselectedYear={currentYear}\n\t\t\t\t\t\t\t\tyearRange={yearRange}\n\t\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\t\tonYearSelect={handleYearSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CalendarGrid\n\t\t\t\t\t\t\tkey=\"calendar\"\n\t\t\t\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\t\t\t\tslideDirection={slideDirection}\n\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\tselectedMs={null}\n\t\t\t\t\t\t\tselectedStartMs={selectedStartMs}\n\t\t\t\t\t\t\tselectedEndMs={selectedEndMs}\n\t\t\t\t\t\t\tisRangePicker\n\t\t\t\t\t\t\tonDaySelect={selectDate}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</fieldset>\n\t);\n};\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","/**\n * @file date-time-pickers/shared/types.ts\n *\n * Shared TypeScript base types for Date Pickers and Time Pickers system.\n * Designed for reuse across both picker systems.\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\n// ─── Display Mode ─────────────────────────────────────────────────────────────\n\n/**\n * Picker display mode.\n * - `picker` — calendar/dial UI (default)\n * - `input` — text input mode for manual entry\n *\n * Equivalent to `DisplayMode` enum in Android Compose Material3.\n */\nexport type DisplayMode = \"picker\" | \"input\";\n\n// ─── Week Configuration ───────────────────────────────────────────────────────\n\n/**\n * First day of the week.\n * - `0` = Sunday (US standard)\n * - `1` = Monday (ISO 8601, default for this library)\n */\nexport type WeekStartsOn = 0 | 1;\n\n// ─── Locale Configuration ─────────────────────────────────────────────────────\n\n/**\n * Locale configuration for Date Picker.\n * Uses native `Intl.DateTimeFormat` API — zero bundle overhead.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'en-US', weekStartsOn: 1 }\n * });\n * ```\n */\nexport interface DateLocale {\n\t/**\n\t * BCP 47 language tag.\n\t * @example 'en-US', 'fr-FR', 'ja-JP'\n\t * @default navigator.language (runtime)\n\t */\n\tlocale?: string;\n\n\t/**\n\t * First day of the week.\n\t * @default 1 (Monday)\n\t */\n\tweekStartsOn?: WeekStartsOn;\n}\n\n/** Required version — all fields resolved */\nexport type ResolvedDateLocale = Required<DateLocale>;\n\n// ─── Selectable Dates ─────────────────────────────────────────────────────────\n\n/**\n * Interface for filtering selectable dates and years.\n * Equivalent to `SelectableDates` interface in Android Compose Material3.\n\n *\n * @example\n * ```tsx\n * // Disable weekends\n * const selectableDates: SelectableDates = {\n * isSelectableDate(utcMs) {\n * const day = new Date(utcMs).getUTCDay();\n * return day !== 0 && day !== 6;\n * },\n * isSelectableYear(year) {\n * return year >= 2020;\n * }\n * };\n * ```\n */\nexport interface SelectableDates {\n\t/**\n\t * Checks if a date is selectable.\n\t * @param utcTimeMs - UTC milliseconds (normalized to UTC midnight)\n\t * @returns `true` if date is selectable\n\t */\n\tisSelectableDate(utcTimeMs: number): boolean;\n\n\t/**\n\t * Checks if a year is selectable.\n\t * Unselectable years are disabled in year grid view.\n\t * @param year - Full year (e.g., 2025)\n\t * @returns `true` if year is selectable\n\t */\n\tisSelectableYear(year: number): boolean;\n}\n\n/** Default SelectableDates — allows all dates and years */\nexport const ALL_DATES_SELECTABLE: SelectableDates = {\n\tisSelectableDate: () => true,\n\tisSelectableYear: () => true,\n};\n\n// ─── Date Range ───────────────────────────────────────────────────────────────\n\n/**\n * Date range with start and end.\n * Both can be null during selection flow.\n */\nexport interface DateRange {\n\t/** Start date UTC milliseconds (UTC midnight). Null if unselected. */\n\tstart: number | null;\n\t/** End date UTC milliseconds (UTC midnight). Null if unselected. */\n\tend: number | null;\n}\n\n// ─── Calendar Day / Week ──────────────────────────────────────────────────────\n\n/** Represents a day cell in calendar grid */\nexport interface CalendarDay {\n\t/** UTC milliseconds (UTC midnight) */\n\tutcMs: number;\n\t/** Day of month (1–31) */\n\tday: number;\n\t/** Month index (0–11) — 0 = January */\n\tmonth: number;\n\t/** Full year */\n\tyear: number;\n\t/** `true` if day belongs to currently displayed month */\n\tisCurrentMonth: boolean;\n\t/** `true` if day is today */\n\tisToday: boolean;\n}\n\n/** A single week — array of 7 days (or null for padding) */\nexport type CalendarWeek = Array<CalendarDay | null>;\n","/**\n * @file date-picker/use-date-picker-state.ts\n *\n * Core state hook for DatePicker — hoisted state pattern.\n * Equivalent to `rememberDatePickerState()` in Android Compose Material3.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'en-US', weekStartsOn: 1 },\n * selectableDates: {\n * isSelectableDate: (ms) => new Date(ms).getUTCDay() !== 0,\n * isSelectableYear: (year) => year >= 2020,\n * }\n * });\n *\n * <DatePicker state={state} />\n * <p>Selected: {state.selectedDateMs}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tgetNavigableMonth,\n\tisMonthNavigable,\n\tnormalizeToMonthStart,\n\tresolveLocale,\n\tstartOfDayUTC,\n\ttodayUTC,\n} from \"../shared/calendar-model\";\nimport type { DisplayMode } from \"../shared/types\";\nimport { ALL_DATES_SELECTABLE } from \"../shared/types\";\nimport type {\n\tDatePickerState,\n\tUseDatePickerStateOptions,\n} from \"./date-picker.types\";\n\n// ─── Defaults ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_YEAR_RANGE: [number, number] = [1900, 2100];\nconst DEFAULT_DISPLAY_MODE: DisplayMode = \"picker\";\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for managing state of DatePicker.\n *\n * @param options - Initial state configuration\n * @returns `DatePickerState` object with state and actions\n */\nexport const useDatePickerState = (\n\toptions?: UseDatePickerStateOptions,\n): DatePickerState => {\n\t// ── Initial values ──────────────────────────────────────────────────────────\n\tconst initialSelectedMs = options?.initialSelectedDateMs ?? null;\n\n\tconst initialMonthMs = normalizeToMonthStart(\n\t\toptions?.initialDisplayedMonthMs ??\n\t\t\t(initialSelectedMs !== null ? initialSelectedMs : todayUTC()),\n\t);\n\n\tconst yearRange = options?.yearRange ?? DEFAULT_YEAR_RANGE;\n\tconst selectableDates = options?.selectableDates ?? ALL_DATES_SELECTABLE;\n\tconst initialDisplayMode =\n\t\toptions?.initialDisplayMode ?? DEFAULT_DISPLAY_MODE;\n\tconst locale = resolveLocale(options?.locale);\n\n\t// ── State ───────────────────────────────────────────────────────────────────\n\tconst [selectedDateMs, setSelectedDateMs] = useState<number | null>(\n\t\tinitialSelectedMs !== null ? startOfDayUTC(initialSelectedMs) : null,\n\t);\n\tconst [displayedMonthMs, setDisplayedMonthMs] =\n\t\tuseState<number>(initialMonthMs);\n\tconst [displayMode, setDisplayModeState] =\n\t\tuseState<DisplayMode>(initialDisplayMode);\n\n\t// ── Actions ─────────────────────────────────────────────────────────────────\n\n\tconst selectDate = useCallback(\n\t\t(ms: number | null): void => {\n\t\t\tif (ms === null) {\n\t\t\t\tsetSelectedDateMs(null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst normalized = startOfDayUTC(ms);\n\t\t\t// Validate selectable\n\t\t\tif (!selectableDates.isSelectableDate(normalized)) return;\n\t\t\tsetSelectedDateMs(normalized);\n\t\t\t// Auto-navigate calendar to month of selected date\n\t\t\tsetDisplayedMonthMs(normalizeToMonthStart(normalized));\n\t\t},\n\t\t[selectableDates],\n\t);\n\n\tconst navigateMonthAction = useCallback(\n\t\t(direction: \"prev\" | \"next\"): void => {\n\t\t\tsetDisplayedMonthMs(\n\t\t\t\t(prev) =>\n\t\t\t\t\tgetNavigableMonth(prev, direction, yearRange, selectableDates) ??\n\t\t\t\t\tprev,\n\t\t\t);\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst navigateToMonth = useCallback(\n\t\t(year: number, month: number): void => {\n\t\t\tif (!isMonthNavigable(year, yearRange, selectableDates)) return;\n\t\t\tsetDisplayedMonthMs(Date.UTC(year, month, 1));\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst setDisplayMode = useCallback((mode: DisplayMode): void => {\n\t\tsetDisplayModeState(mode);\n\t}, []);\n\n\tconst reset = useCallback((): void => {\n\t\tsetSelectedDateMs(\n\t\t\tinitialSelectedMs !== null ? startOfDayUTC(initialSelectedMs) : null,\n\t\t);\n\t\tsetDisplayedMonthMs(initialMonthMs);\n\t\tsetDisplayModeState(initialDisplayMode);\n\t}, [initialSelectedMs, initialMonthMs, initialDisplayMode]);\n\n\t// ── Memoized state object ───────────────────────────────────────────────────\n\treturn useMemo<DatePickerState>(\n\t\t() => ({\n\t\t\tselectedDateMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tnavigateMonth: navigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\tselectedDateMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tnavigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t],\n\t);\n};\n","/**\n * @file date-picker/use-date-range-picker-state.ts\n *\n * Core state hook for DateRangePicker — hoisted state pattern.\n * Equivalent to `rememberDateRangePickerState()` in Android Compose Material3.\n *\n * Range selection logic:\n * - Click 1: set start date\n * - Click 2 (ms > start): set end date → range complete\n * - Click 2 (ms <= start): reset, set start = ms\n * - If both start and end exist: reset, set start = ms\n *\n * @example\n * ```tsx\n * const state = useDateRangePickerState();\n *\n * <DateRangePicker state={state} />\n * <p>Start: {state.selectedStartMs}, End: {state.selectedEndMs}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useReducer, useState } from \"react\";\nimport {\n\tgetNavigableMonth,\n\tisMonthNavigable,\n\tnormalizeToMonthStart,\n\tresolveLocale,\n\tstartOfDayUTC,\n\ttodayUTC,\n} from \"../shared/calendar-model\";\nimport type { DisplayMode } from \"../shared/types\";\nimport { ALL_DATES_SELECTABLE } from \"../shared/types\";\nimport type {\n\tDateRangePickerState,\n\tUseDateRangePickerStateOptions,\n} from \"./date-picker.types\";\n\n// ─── Defaults ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_YEAR_RANGE: [number, number] = [1900, 2100];\n\n// ─── Range Reducer ────────────────────────────────────────────────────────────\n\ninterface RangeState {\n\tstartMs: number | null;\n\tendMs: number | null;\n}\n\ntype RangeAction =\n\t| { type: \"SELECT\"; ms: number }\n\t| { type: \"CLEAR\" }\n\t| { type: \"RESET\"; startMs: number | null; endMs: number | null };\n\n/**\n * Pure reducer to update start/end atomically in a single dispatch —\n * avoids nested setState anti-pattern and stale closure issues.\n */\nfunction rangeReducer(state: RangeState, action: RangeAction): RangeState {\n\tswitch (action.type) {\n\t\tcase \"SELECT\": {\n\t\t\tconst { startMs, endMs } = state;\n\t\t\tconst ms = action.ms;\n\n\t\t\t// Case 1: No start date → set start\n\t\t\tif (startMs === null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 2: Both start and end exist → reset, set start = ms\n\t\t\tif (endMs !== null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 3: Has start, no end, ms > start → set end\n\t\t\tif (ms > startMs) return { startMs, endMs: ms };\n\n\t\t\t// Case 4: ms <= start → reset, set start = ms\n\t\t\treturn { startMs: ms, endMs: null };\n\t\t}\n\t\tcase \"CLEAR\":\n\t\t\treturn { startMs: null, endMs: null };\n\t\tcase \"RESET\":\n\t\t\treturn { startMs: action.startMs, endMs: action.endMs };\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for managing state of DateRangePicker.\n *\n * @param options - Initial configuration\n * @returns `DateRangePickerState` object with state and actions\n */\nexport const useDateRangePickerState = (\n\toptions?: UseDateRangePickerStateOptions,\n): DateRangePickerState => {\n\t// ── Initial values ──────────────────────────────────────────────────────────\n\tconst initialStartMs =\n\t\toptions?.initialStartMs != null\n\t\t\t? startOfDayUTC(options.initialStartMs)\n\t\t\t: null;\n\tconst initialEndMs =\n\t\toptions?.initialEndMs != null ? startOfDayUTC(options.initialEndMs) : null;\n\n\tconst initialMonthMs = normalizeToMonthStart(\n\t\toptions?.initialDisplayedMonthMs ??\n\t\t\t(initialStartMs !== null ? initialStartMs : todayUTC()),\n\t);\n\n\tconst yearRange = options?.yearRange ?? DEFAULT_YEAR_RANGE;\n\tconst selectableDates = options?.selectableDates ?? ALL_DATES_SELECTABLE;\n\tconst initialDisplayMode: DisplayMode =\n\t\toptions?.initialDisplayMode ?? \"picker\";\n\tconst locale = resolveLocale(options?.locale);\n\n\t// ── State ───────────────────────────────────────────────────────────────────\n\tconst [{ startMs: selectedStartMs, endMs: selectedEndMs }, dispatch] =\n\t\tuseReducer(rangeReducer, {\n\t\t\tstartMs: initialStartMs,\n\t\t\tendMs: initialEndMs,\n\t\t});\n\n\tconst [displayedMonthMs, setDisplayedMonthMs] =\n\t\tuseState<number>(initialMonthMs);\n\tconst [displayMode, setDisplayModeState] =\n\t\tuseState<DisplayMode>(initialDisplayMode);\n\n\t// ── Actions ─────────────────────────────────────────────────────────────────\n\n\t/**\n\t * Dispatch atomic SELECT action — start and end are updated simultaneously\n\t * in reducer, avoiding nested setState anti-pattern.\n\t */\n\tconst selectDate = useCallback(\n\t\t(ms: number): void => {\n\t\t\tconst normalized = startOfDayUTC(ms);\n\t\t\tif (!selectableDates.isSelectableDate(normalized)) return;\n\t\t\tdispatch({ type: \"SELECT\", ms: normalized });\n\t\t},\n\t\t[selectableDates],\n\t);\n\n\tconst clearRange = useCallback((): void => {\n\t\tdispatch({ type: \"CLEAR\" });\n\t}, []);\n\n\tconst navigateMonthAction = useCallback(\n\t\t(direction: \"prev\" | \"next\"): void => {\n\t\t\tsetDisplayedMonthMs(\n\t\t\t\t(prev) =>\n\t\t\t\t\tgetNavigableMonth(prev, direction, yearRange, selectableDates) ??\n\t\t\t\t\tprev,\n\t\t\t);\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst navigateToMonth = useCallback(\n\t\t(year: number, month: number): void => {\n\t\t\tif (!isMonthNavigable(year, yearRange, selectableDates)) return;\n\t\t\tsetDisplayedMonthMs(Date.UTC(year, month, 1));\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst setDisplayMode = useCallback((mode: DisplayMode): void => {\n\t\tsetDisplayModeState(mode);\n\t}, []);\n\n\tconst reset = useCallback((): void => {\n\t\tdispatch({ type: \"RESET\", startMs: initialStartMs, endMs: initialEndMs });\n\t\tsetDisplayedMonthMs(initialMonthMs);\n\t\tsetDisplayModeState(initialDisplayMode);\n\t}, [initialStartMs, initialEndMs, initialMonthMs, initialDisplayMode]);\n\n\t// ── Memoized state object ───────────────────────────────────────────────────\n\treturn useMemo<DateRangePickerState>(\n\t\t() => ({\n\t\t\tselectedStartMs,\n\t\t\tselectedEndMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tclearRange,\n\t\t\tnavigateMonth: navigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\tselectedStartMs,\n\t\t\tselectedEndMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tclearRange,\n\t\t\tnavigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t],\n\t);\n};\n","/**\n * @file time-picker/time-picker.tokens.ts\n *\n * MD3 Design tokens for Time Picker component system.\n * Verified mapping from:\n * - TimePickerTokens.kt → ClockDial, TimeSelector, PeriodSelector (Picker mode)\n * - TimeInputTokens.kt → TimeField, PeriodSelector (Input mode)\n *\n * CSS variables → packages/tokens/src/colors.css\n * Tailwind classes → packages/tailwind/src/index.css\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerTokens.kt\n * @see docs/m3/date-and-time-pickers/time-pickers/TimeInputTokens.kt\n */\n\n// ─── Color Tokens ──────────────────────────────────────────────────────────────\n\n/**\n * Color tokens for Time Picker — mapped from TimePickerTokens.kt + TimeInputTokens.kt.\n * Uses CSS custom properties from MD3 theme (packages/tokens/src/colors.css).\n */\nexport const TP_COLORS = {\n\t// ── Clock Dial (TimePickerTokens) ─────────────────────────────────────────\n\t/** Dial background — SurfaceContainerHighest */\n\tclockDial: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Selected number text — OnPrimary */\n\tclockDialSelected: \"var(--md-sys-color-on-primary)\",\n\t/** Unselected number text — OnSurface */\n\tclockDialUnselected: \"var(--md-sys-color-on-surface)\",\n\t/** Selector handle circle — Primary */\n\tselectorHandle: \"var(--md-sys-color-primary)\",\n\t/** Selector track line — Primary */\n\tselectorTrack: \"var(--md-sys-color-primary)\",\n\t/** Selector center dot — Primary */\n\tselectorCenter: \"var(--md-sys-color-primary)\",\n\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** Picker/Input container — SurfaceContainerHigh */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\n\t// ── Time Selector Buttons (hour/minute display) ───────────────────────────\n\t/** Selected selector (hour/min button) — PrimaryContainer */\n\ttimeSelectorSelected: \"var(--md-sys-color-primary-container)\",\n\t/** Unselected selector — SurfaceContainerHighest */\n\ttimeSelectorUnselected: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Selected selector text — OnPrimaryContainer */\n\ttimeSelectorSelectedText: \"var(--md-sys-color-on-primary-container)\",\n\t/** Unselected selector text — OnSurface */\n\ttimeSelectorUnselectedText: \"var(--md-sys-color-on-surface)\",\n\n\t// ── Period Selector AM/PM (updated flag = true → PrimaryContainer) ────────\n\t/** AM/PM selected background — TertiaryContainer */\n\tperiodSelected: \"var(--md-sys-color-tertiary-container)\",\n\t/** AM/PM unselected background — transparent */\n\tperiodUnselected: \"transparent\",\n\t/** AM/PM selected text — OnTertiaryContainer */\n\tperiodSelectedText: \"var(--md-sys-color-on-tertiary-container)\",\n\t/** AM/PM unselected text — OnSurfaceVariant */\n\tperiodUnselectedText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** AM/PM border — Outline */\n\tperiodOutline: \"var(--md-sys-color-outline)\",\n\n\t// ── Time Field (TimeInput mode, TimeInputTokens) ───────────────────────────\n\t/** Time field default background — SurfaceContainerHighest */\n\ttimeField: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Time field focused background — PrimaryContainer */\n\ttimeFieldFocus: \"var(--md-sys-color-primary-container)\",\n\t/** Time field focused text — OnPrimaryContainer */\n\ttimeFieldFocusText: \"var(--md-sys-color-on-primary-container)\",\n\t/** Time field focus outline — Primary */\n\ttimeFieldFocusOutline: \"var(--md-sys-color-primary)\",\n\t/** Time field default text — OnSurface */\n\ttimeFieldText: \"var(--md-sys-color-on-surface)\",\n\t/** \":\" separator — OnSurface */\n\tseparator: \"var(--md-sys-color-on-surface)\",\n\t/** Headline label (\"Select time\") — OnSurfaceVariant */\n\theadline: \"var(--md-sys-color-on-surface-variant)\",\n} as const;\n\n// ─── Tailwind Class Helpers ────────────────────────────────────────────────────\n\n/**\n * Tailwind utility class strings for Time Picker elements.\n * Used with `cn()` function.\n * Mapped from packages/tailwind/src/index.css (--color-m3-* tokens).\n */\nexport const TP_CLASSES = {\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** Main picker/input container */\n\tcontainer: \"bg-m3-surface-container-high rounded-m3-xl select-none\",\n\n\t// ── Time Selector Buttons ─────────────────────────────────────────────────\n\t/** Hour/minute selector button — selected */\n\ttimeSelectorSelected: \"bg-m3-primary-container text-m3-on-primary-container\",\n\t/** Hour/minute selector button — unselected */\n\ttimeSelectorUnselected: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\n\t// ── Period Selector ───────────────────────────────────────────────────────\n\t/** AM/PM button — selected */\n\tperiodSelected: \"bg-m3-primary-container text-m3-on-primary-container\",\n\t/** AM/PM button — unselected */\n\tperiodUnselected: \"bg-transparent text-m3-on-surface-variant\",\n\n\t// ── Time Field (input mode) ────────────────────────────────────────────────\n\t/** Time input field — default */\n\ttimeField: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\t/** Time input field — focused */\n\ttimeFieldFocused:\n\t\t\"bg-m3-primary-container text-m3-on-primary-container ring-2 ring-m3-primary\",\n\n\t// ── Clock Dial ─────────────────────────────────────────────────────────────\n\t/** Clock dial background circle */\n\tclockDial: \"fill-[var(--md-sys-color-surface-container-highest)]\",\n\t/** Selected number on dial */\n\tclockDialSelectedText: \"fill-[var(--md-sys-color-on-primary)]\",\n\t/** Unselected number on dial */\n\tclockDialUnselectedText: \"fill-[var(--md-sys-color-on-surface)]\",\n\t/** Selector handle, track, center dot */\n\tselectorPrimary: \"fill-m3-primary stroke-m3-primary\",\n} as const;\n\n// ─── Shape Tokens ──────────────────────────────────────────────────────────────\n\n/**\n * Shape tokens — corner radii from MD3 shape scale.\n * Mapped from ShapeKeyTokens in TimePickerTokens.kt + TimeInputTokens.kt.\n *\n * Uses Tailwind class names from packages/tailwind/src/index.css.\n */\nexport const TP_SHAPE = {\n\t/** Dialog container — CornerExtraLarge = 28px */\n\tcontainer: \"rounded-m3-xl\",\n\t/** Hour/minute selector button — CornerSmall = 8px */\n\ttimeSelector: \"rounded-m3-sm\",\n\t/** Period (AM/PM) container — CornerSmall = 8px */\n\tperiodSelector: \"rounded-m3-sm\",\n\t/** Clock dial circle — CornerFull */\n\tclockDial: \"rounded-m3-full\",\n\t/** Time field — CornerSmall = 8px */\n\ttimeField: \"rounded-m3-sm\",\n} as const;\n\n// ─── Dimension Tokens ──────────────────────────────────────────────────────────\n\n/**\n * Fixed dimension tokens from TimePickerTokens.kt + TimeInputTokens.kt.\n * Unit: px (converted from dp).\n */\nexport const TP_SIZE = {\n\t// ── Clock Dial (TimePickerTokens) ─────────────────────────────────────────\n\t/** ClockDialContainerSize = 256dp */\n\tclockDialSize: 256,\n\t/** ClockDialSelectorHandleContainerSize = 48dp */\n\tselectorHandleSize: 48,\n\t/** ClockDialSelectorCenterContainerSize = 8dp */\n\tselectorCenterSize: 8,\n\t/** ClockDialSelectorTrackContainerWidth = 2dp */\n\tselectorTrackWidth: 2,\n\n\t// ── Time Selector (TimeSelectorContainer) ─────────────────────────────────\n\t/** TimeSelectorContainerWidth = 96dp */\n\ttimeSelectorWidth: 96,\n\t/** TimeSelectorContainerHeight = 80dp */\n\ttimeSelectorHeight: 80,\n\t/** TimeSelector24HVerticalContainerWidth = 114dp (24h mode) */\n\ttimeSelector24hWidth: 114,\n\n\t// ── Period Selector (Picker mode) ─────────────────────────────────────────\n\t/** PeriodSelectorVerticalContainerWidth = 52dp */\n\tperiodSelectorVerticalWidth: 52,\n\t/** PeriodSelectorVerticalContainerHeight = 80dp */\n\tperiodSelectorVerticalHeight: 80,\n\t/** PeriodSelectorHorizontalContainerWidth = 216dp */\n\tperiodSelectorHorizWidth: 216,\n\t/** PeriodSelectorHorizontalContainerHeight = 38dp */\n\tperiodSelectorHorizHeight: 38,\n\n\t// ── Time Field (Input mode, TimeInputTokens) ───────────────────────────────\n\t/** TimeFieldContainerWidth = 96dp */\n\ttimeFieldWidth: 96,\n\t/** TimeFieldContainerHeight = 72dp */\n\ttimeFieldHeight: 72,\n\t/** PeriodSelectorContainerHeight (Input mode) = 72dp */\n\tperiodInputHeight: 72,\n\t/** PeriodSelectorContainerWidth (Input mode) = 52dp */\n\tperiodInputWidth: 52,\n} as const;\n","/**\n * @file time-picker/subcomponents/period-selector.tsx\n *\n * AM/PM toggle — equivalent to `VerticalPeriodToggle` / `PeriodToggleImpl` in TimePicker.kt.\n *\n * - Hidden when `is24hour = true`\n * - Vertical layout (AM top, PM bottom) — default layout for M3 vertical TimePicker\n * - Border: 1px Outline or gap between AM/PM\n * - Selected: bg-m3-primary-container + bold text\n * - Unselected: transparent + text-m3-on-surface-variant\n *\n * Ported from `VerticalPeriodToggle` + `PeriodToggleImpl` in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (PeriodToggleImpl)\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_SIZE } from \"../time-picker.tokens\";\nimport type { TimePickerState } from \"../time-picker.types\";\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface PeriodSelectorProps {\n\t/** Hoisted state — requires `isPm`, `isHourInputValid`, `setIsPm` */\n\tstate: TimePickerState;\n\t/**\n\t * Layout direction.\n\t * - \"vertical\": AM top, PM bottom (used in Vertical TimePicker)\n\t * - \"horizontal\": AM left, PM right (used in Horizontal TimePicker)\n\t * @default \"vertical\"\n\t */\n\tlayout?: \"vertical\" | \"horizontal\";\n\t/** Inline style override — used for custom dimensions */\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * AM/PM Period Selector.\n *\n * Automatically hidden when `state.is24hour = true`.\n *\n * Implementation following \"updated toggle\" pattern (isUpdatedTimepickerToggleEnabled = true):\n * - No outer container border\n * - Two distinct buttons with rounded-m3-full shape\n * - Selected: bg-m3-primary-container + bold text\n *\n * @example\n * ```tsx\n * <PeriodSelector state={state} layout=\"vertical\" />\n * ```\n */\nexport const PeriodSelector: React.FC<PeriodSelectorProps> = ({\n\tstate,\n\tlayout = \"vertical\",\n\tstyle,\n\tclassName,\n}) => {\n\t// Completely hidden in 24h format\n\tif (state.is24hour) return null;\n\n\tconst { isPm, isHourInputValid, setIsPm } = state;\n\n\tconst handleAmClick = (): void => {\n\t\t// Only update if hour input is valid — per Compose source:\n\t\t// onClick = { if (state.isPm && state.isHourInputValid) state.hour -= 12 }\n\t\tif (isPm && isHourInputValid) {\n\t\t\tsetIsPm(false);\n\t\t}\n\t};\n\n\tconst handlePmClick = (): void => {\n\t\t// onClick = { if (!state.isPm && state.isHourInputValid) state.hour += 12 }\n\t\tif (!isPm && isHourInputValid) {\n\t\t\tsetIsPm(true);\n\t\t}\n\t};\n\n\tconst isVertical = layout === \"vertical\";\n\n\treturn (\n\t\t<fieldset\n\t\t\taria-label=\"AM/PM\"\n\t\t\tstyle={{\n\t\t\t\twidth: isVertical\n\t\t\t\t\t? TP_SIZE.periodSelectorVerticalWidth\n\t\t\t\t\t: TP_SIZE.periodSelectorHorizWidth,\n\t\t\t\theight: isVertical\n\t\t\t\t\t? TP_SIZE.periodSelectorVerticalHeight\n\t\t\t\t\t: TP_SIZE.periodSelectorHorizHeight,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\tisVertical ? \"flex flex-col\" : \"flex flex-row\",\n\t\t\t\t\"gap-0 overflow-hidden\",\n\t\t\t\t// Container shape (CornerSmall = rounded-m3-sm)\n\t\t\t\t\"rounded-m3-sm\",\n\t\t\t\t// Border (period selector outline — updated toggle uses border on container)\n\t\t\t\t\"border border-m3-outline\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* AM Button */}\n\t\t\t<PeriodButton\n\t\t\t\tlabel=\"AM\"\n\t\t\t\tisSelected={!isPm}\n\t\t\t\tonClick={handleAmClick}\n\t\t\t\tisFirst\n\t\t\t\tisVertical={isVertical}\n\t\t\t/>\n\n\t\t\t{/* PM Button */}\n\t\t\t<PeriodButton\n\t\t\t\tlabel=\"PM\"\n\t\t\t\tisSelected={isPm}\n\t\t\t\tonClick={handlePmClick}\n\t\t\t\tisFirst={false}\n\t\t\t\tisVertical={isVertical}\n\t\t\t/>\n\t\t</fieldset>\n\t);\n};\n\nPeriodSelector.displayName = \"PeriodSelector\";\n\n// ─── Period Button ─────────────────────────────────────────────────────────────\n\ninterface PeriodButtonProps {\n\tlabel: \"AM\" | \"PM\";\n\tisSelected: boolean;\n\tonClick: () => void;\n\tisFirst: boolean;\n\tisVertical: boolean;\n}\n\nconst PeriodButton: React.FC<PeriodButtonProps> = ({\n\tlabel,\n\tisSelected,\n\tonClick,\n\tisFirst,\n\tisVertical,\n}) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-pressed={isSelected}\n\t\t\taria-label={label}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\t\"flex-1 flex items-center justify-center\",\n\t\t\t\t\"min-w-0 min-h-0\",\n\t\t\t\t// Typography — TitleMedium equivalent (16px, medium weight)\n\t\t\t\t\"text-[16px] leading-none\",\n\t\t\t\t// Selected state — from PeriodToggleImpl (useUpdatedToggle = true)\n\t\t\t\tisSelected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t\"bg-m3-tertiary-container text-m3-on-tertiary-container\",\n\t\t\t\t\t\t\t\"font-bold\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\"bg-transparent text-m3-on-surface-variant\", \"font-medium\"],\n\t\t\t\t// Divider between buttons via border\n\t\t\t\t!isFirst && isVertical && \"border-t border-m3-outline\",\n\t\t\t\t!isFirst && !isVertical && \"border-l border-m3-outline\",\n\t\t\t\t// Interaction\n\t\t\t\t\"cursor-pointer transition-colors transition-m3-fast-effects\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t)}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n};\n","/**\n * @file time-picker/subcomponents/time-field.tsx\n *\n * TimeField — display/input cell for hour or minute.\n *\n * Used in both modes:\n * - \"selector\" → <button> in TimePicker (dial), click to switch hour/minute selection\n * - \"input\" → <input> in TimeInput, manual number entry\n *\n * Ported from `TimeSelector` and `TimePickerTextField` composables in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (TimeSelector, TimePickerTextField)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_SIZE } from \"../time-picker.tokens\";\nimport type { TimePickerSelectionMode } from \"../time-picker.types\";\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface TimeFieldSelectorProps {\n\t/** Mode \"selector\" = button in dial picker */\n\tmode: \"selector\";\n\t/** Display value (number, zero-padded) */\n\n\tvalue: number;\n\t/** Field type: hour or minute */\n\tfield: TimePickerSelectionMode;\n\t/** Current picker selection mode */\n\tselection: TimePickerSelectionMode;\n\t/** Callback when user clicks to activate field */\n\tonActivate: () => void;\n\tclassName?: string;\n}\n\ninterface TimeFieldInputProps {\n\t/** Mode \"input\" = text input in TimeInput */\n\tmode: \"input\";\n\t/** Raw input value (bound to input element) */\n\tvalue: number;\n\t/** Field type: hour or minute */\n\tfield: TimePickerSelectionMode;\n\t/** Whether field is currently focused (controlled) */\n\tisFocused: boolean;\n\t/** Whether value is valid (for error state styling) */\n\tisValid: boolean;\n\t/** Callback when value changes */\n\tonChange: (value: number) => void;\n\t/** Callback fired when 2 digits are entered → advances focus to next field */\n\tonAutoAdvance?: () => void;\n\t/** Callback when field receives focus */\n\tonFocus?: () => void;\n\t/** Callback when field loses focus */\n\tonBlur?: () => void;\n\tclassName?: string;\n}\n\ntype TimeFieldProps = TimeFieldSelectorProps | TimeFieldInputProps;\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * TimeField component — renders hour/minute box according to mode.\n *\n * Selector mode: button with DisplayLarge typography, highlighted when selected.\n * Input mode: text input field with DisplayMedium typography, focus outline when focused.\n *\n * @example Selector mode (in TimePicker)\n\n * ```tsx\n * <TimeField\n * mode=\"selector\"\n * value={state.hourForDisplay}\n * field=\"hour\"\n * selection={state.selection}\n * onActivate={() => state.setSelection('hour')}\n * />\n * ```\n *\n * @example Input mode (trong TimeInput)\n * ```tsx\n * <TimeField\n * mode=\"input\"\n * value={state.hourInput}\n * field=\"hour\"\n * isFocused={focusedField === 'hour'}\n * isValid={state.isHourInputValid}\n * onChange={(v) => state.setHourInput(v)}\n * onAutoAdvance={() => setFocusedField('minute')}\n * />\n * ```\n */\nexport const TimeField: React.FC<TimeFieldProps> = (props) => {\n\tif (props.mode === \"selector\") {\n\t\treturn <SelectorField {...props} />;\n\t}\n\treturn <InputField {...props} />;\n};\n\nTimeField.displayName = \"TimeField\";\n\n// ─── Selector Field (Dial mode) ────────────────────────────────────────────────\n\nconst SelectorField: React.FC<TimeFieldSelectorProps> = ({\n\tvalue,\n\tfield,\n\tselection,\n\tonActivate,\n\tclassName,\n}) => {\n\tconst isSelected = selection === field;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={field === \"hour\" ? \"Hour\" : \"Minute\"}\n\t\t\taria-pressed={isSelected}\n\t\t\tonClick={onActivate}\n\t\t\tstyle={{\n\t\t\t\twidth: TP_SIZE.timeSelectorWidth,\n\t\t\t\theight: TP_SIZE.timeSelectorHeight,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\"rounded-m3-sm\",\n\t\t\t\t// Typography — DisplayLarge equivalent (57px)\n\t\t\t\t\"text-[57px] font-normal leading-none tabular-nums\",\n\t\t\t\t// State\n\t\t\t\tisSelected\n\t\t\t\t\t? \"bg-m3-primary-container text-m3-on-primary-container\"\n\t\t\t\t\t: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\t\t\t\t// Interaction\n\t\t\t\t\"cursor-pointer transition-colors transition-m3-fast-effects\",\n\t\t\t\t\"hover:opacity-90 active:opacity-80\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{String(value).padStart(2, \"0\")}\n\t\t</button>\n\t);\n};\n\n// ─── Input Field (Text input mode) ────────────────────────────────────────────\n\nconst InputField: React.FC<TimeFieldInputProps> = ({\n\tvalue,\n\tfield,\n\tisFocused,\n\tisValid,\n\tonChange,\n\tonAutoAdvance,\n\tonFocus,\n\tonBlur,\n\tclassName,\n}) => {\n\t// Track current input content for digit-by-digit handling\n\tconst [inputText, setInputText] = React.useState(\n\t\tString(value).padStart(2, \"0\"),\n\t);\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\t// Sync from state when value changes externally (e.g. on reset)\n\tReact.useEffect(() => {\n\t\tif (!isFocused) {\n\t\t\tsetInputText(String(value).padStart(2, \"0\"));\n\t\t}\n\t}, [value, isFocused]);\n\n\t// Focus/blur the input element when isFocused prop changes\n\tReact.useEffect(() => {\n\t\tif (isFocused) {\n\t\t\tinputRef.current?.focus();\n\t\t\tinputRef.current?.select();\n\t\t}\n\t}, [isFocused]);\n\n\tconst handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n\t\tconst raw = e.target.value.replace(/\\D/g, \"\"); // retain digits only\n\t\tconst limited = raw.slice(-2); // max 2 digits\n\n\t\tsetInputText(limited);\n\n\t\tconst numVal = parseInt(limited, 10);\n\t\tif (!Number.isNaN(numVal)) {\n\t\t\tonChange(numVal);\n\n\t\t\t// Auto-advance after entering 2 digits\n\t\t\tif (limited.length === 2) {\n\t\t\t\tonAutoAdvance?.();\n\t\t\t}\n\t\t} else if (limited === \"\") {\n\t\t\t// Empty input — reset to 0 while keeping display empty\n\t\t\tonChange(0);\n\t\t}\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n\t\t// Allow: digits, Backspace, Delete, Tab, Arrow keys\n\n\t\tconst allowed = [\n\t\t\t\"Backspace\",\n\t\t\t\"Delete\",\n\t\t\t\"Tab\",\n\t\t\t\"ArrowLeft\",\n\t\t\t\"ArrowRight\",\n\t\t\t\"Enter\",\n\t\t];\n\t\tconst isDigit = e.key >= \"0\" && e.key <= \"9\";\n\t\tif (!isDigit && !allowed.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst handleFocus = (e: React.FocusEvent<HTMLInputElement>): void => {\n\t\te.target.select(); // select all text khi focus\n\t\tonFocus?.();\n\t};\n\n\tconst displayText = isFocused ? inputText : String(value).padStart(2, \"0\");\n\n\tconst isError = isFocused && !isValid && inputText.length === 2;\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\twidth: TP_SIZE.timeFieldWidth,\n\t\t\t\theight: TP_SIZE.timeFieldHeight,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center rounded-m3-sm\",\n\t\t\t\t// Background state\n\t\t\t\tisFocused\n\t\t\t\t\t? \"bg-m3-primary-container\"\n\t\t\t\t\t: \"bg-m3-surface-container-highest\",\n\t\t\t\t// Error border\n\t\t\t\tisError && \"ring-2 ring-m3-error\",\n\t\t\t\t// Focus outline (non-error)\n\t\t\t\tisFocused && !isError && \"ring-2 ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"text\"\n\t\t\t\tinputMode=\"numeric\"\n\t\t\t\tvalue={displayText}\n\t\t\t\tmaxLength={2}\n\t\t\t\taria-label={field === \"hour\" ? \"Hour\" : \"Minute\"}\n\t\t\t\taria-invalid={isError}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonFocus={handleFocus}\n\t\t\t\tonBlur={onBlur}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Reset input styles\n\t\t\t\t\t\"w-full h-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\"text-center tabular-nums select-all\",\n\t\t\t\t\t// Typography — DisplayMedium equivalent (45px)\n\t\t\t\t\t\"text-[45px] font-normal leading-none\",\n\t\t\t\t\t// Color\n\t\t\t\t\tisFocused ? \"text-m3-on-primary-container\" : \"text-m3-on-surface\",\n\t\t\t\t\t// Caret\n\t\t\t\t\t\"caret-m3-primary\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","/**\n * @file time-picker/time-input.tsx\n *\n * TimeInput — text input mode for time entry.\n *\n * Layout:\n * ```\n * ┌────────────────────────────────┐\n * │ Enter time │ ← headline (labelMedium)\n * │ [07] : [00] [AM] │ ← input fields + PeriodSelector\n * │ [PM] │\n * │ Hour Minute │ ← helper labels (bodySmall)\n * └────────────────────────────────┘\n * ```\n *\n * Behavior:\n * - Two `<input>` fields for hour and minute\n * - Auto-advance: entering 2 valid digits automatically focuses next field\n * - Validation: error state when value is out of range\n * - AM/PM toggle on right (hidden when is24hour)\n *\n * Ported from `TimeInputImpl` in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (TimeInputImpl)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { PeriodSelector } from \"./subcomponents/period-selector\";\nimport { TimeField } from \"./subcomponents/time-field\";\nimport { TP_SIZE } from \"./time-picker.tokens\";\nimport type { TimeInputProps } from \"./time-picker.types\";\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * TimeInput — text input mode.\n *\n * Used with `useTimePickerState`:\n *\n * @example\n * ```tsx\n * const state = useTimePickerState({ initialHour: 9, initialMinute: 30 });\n *\n * // Standalone\n * <TimeInput state={state} />\n *\n * // In dialog (with toggle)\n * <TimePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * confirmButton={<Button variant=\"text\" onClick={() => setOpen(false)}>OK</Button>}\n * >\n * <TimeInput state={state} />\n * </TimePickerDialog>\n * ```\n */\nexport const TimeInput: React.FC<TimeInputProps> = ({ state, className }) => {\n\tconst { is24hour, setHourInput, setMinuteInput, setSelection } = state;\n\n\tconst [focusedField, setFocusedField] = React.useState<\n\t\t\"hour\" | \"minute\" | null\n\t>(null);\n\n\tconst handleHourAutoAdvance = (): void => {\n\t\tsetFocusedField(\"minute\");\n\t\tsetSelection(\"minute\");\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-m3-surface-container-high rounded-m3-xl\",\n\t\t\t\t\"flex flex-col\",\n\t\t\t\t\"p-6 gap-0 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* ── Headline ── */}\n\t\t\t<p\n\t\t\t\tclassName=\"w-full text-left text-m3-on-surface-variant mb-5\"\n\t\t\t\tstyle={{ fontSize: \"12px\", fontWeight: 500, letterSpacing: \"0.1em\" }}\n\t\t\t>\n\t\t\t\tEnter time\n\t\t\t</p>\n\n\t\t\t{/* ── Input Row: fields + separator + AM/PM ── */}\n\t\t\t<div className=\"flex flex-row items-start gap-2\">\n\t\t\t\t{/* Hour input */}\n\t\t\t\t<div className=\"flex flex-col items-center gap-1\">\n\t\t\t\t\t<TimeField\n\t\t\t\t\t\tmode=\"input\"\n\t\t\t\t\t\tvalue={state.hourInput}\n\t\t\t\t\t\tfield=\"hour\"\n\t\t\t\t\t\tisFocused={focusedField === \"hour\"}\n\t\t\t\t\t\tisValid={state.isHourInputValid}\n\t\t\t\t\t\tonChange={setHourInput}\n\t\t\t\t\t\tonAutoAdvance={handleHourAutoAdvance}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tsetFocusedField(\"hour\");\n\t\t\t\t\t\t\tsetSelection(\"hour\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonBlur={() => setFocusedField(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"text-[11px] text-m3-on-surface-variant font-normal leading-none mt-1\">\n\t\t\t\t\t\tHour\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Separator \":\" */}\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"text-m3-on-surface text-center self-start\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontSize: \"57px\",\n\t\t\t\t\t\tfontWeight: 400,\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\twidth: 24,\n\t\t\t\t\t\t// Aligned with height of input field\n\t\t\t\t\t\tmarginTop: `${(TP_SIZE.timeFieldHeight - 57) / 2}px`,\n\t\t\t\t\t}}\n\t\t\t\t\taria-hidden\n\t\t\t\t>\n\t\t\t\t\t:\n\t\t\t\t</span>\n\n\t\t\t\t{/* Minute input */}\n\t\t\t\t<div className=\"flex flex-col items-center gap-1\">\n\t\t\t\t\t<TimeField\n\t\t\t\t\t\tmode=\"input\"\n\t\t\t\t\t\tvalue={state.minuteInput}\n\t\t\t\t\t\tfield=\"minute\"\n\t\t\t\t\t\tisFocused={focusedField === \"minute\"}\n\t\t\t\t\t\tisValid={state.isMinuteInputValid}\n\t\t\t\t\t\tonChange={setMinuteInput}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tsetFocusedField(\"minute\");\n\t\t\t\t\t\t\tsetSelection(\"minute\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonBlur={() => setFocusedField(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t{/* Helper label */}\n\t\t\t\t\t<span className=\"text-[11px] text-m3-on-surface-variant font-normal leading-none mt-1\">\n\t\t\t\t\t\tMinute\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* AM/PM (hidden when is24hour) */}\n\t\t\t\t{!is24hour && (\n\t\t\t\t\t<PeriodSelector\n\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\tlayout=\"vertical\"\n\t\t\t\t\t\tclassName=\"ml-2 self-start\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: TP_SIZE.periodInputHeight,\n\t\t\t\t\t\t\twidth: TP_SIZE.periodInputWidth,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTimeInput.displayName = \"TimeInput\";\n","/**\n * @file time-picker/subcomponents/clock-dial.tsx\n *\n * Clock dial SVG — clock face with pointer interaction.\n *\n * Renders SVG circle with:\n * - Background circle (SurfaceContainerHighest)\n * - 12 (or 24) numbers positioned evenly on circle\n * - Selector: center dot + track line + handle circle (all Primary)\n * - Pointer events: click + drag to pick hour/minute\n * - autoSwitchToMinute: automatically switches to minute after hour selection\n *\n * Math ported from `AnalogTimePickerState` in TimePicker.kt:\n * - RadiansPerHour, RadiansPerMinute, InnerCircleToSizeRatio, OuterCircleToSizeRatio\n * - `rotateTo`, `onTap` logic\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (ClockFace, AnalogTimePickerState)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_COLORS, TP_SIZE } from \"../time-picker.tokens\";\nimport type {\n\tTimePickerSelectionMode,\n\tTimePickerState,\n} from \"../time-picker.types\";\n\n// ─── Constants (from TimePicker.kt) ──────────────────────────────────────────────\n\nconst FULL_CIRCLE = Math.PI * 2;\nconst QUARTER_CIRCLE = Math.PI / 2;\nconst RADIANS_PER_HOUR = FULL_CIRCLE / 12;\nconst RADIANS_PER_MINUTE = FULL_CIRCLE / 60;\n\n/**\n * OuterCircleToSizeRatio — 101dp on 256dp dial.\n */\nconst OUTER_CIRCLE_RATIO = 101 / TP_SIZE.clockDialSize;\n\n/**\n * InnerCircleToSizeRatio — 69dp on 256dp dial.\n */\nconst INNER_CIRCLE_RATIO = 69 / TP_SIZE.clockDialSize;\n\n/** SVG Center = diameter / 2 */\nconst CENTER = TP_SIZE.clockDialSize / 2; // 128\n\n/** Outer ring radius (hours 1-12, minutes) */\nconst OUTER_RADIUS = TP_SIZE.clockDialSize * OUTER_CIRCLE_RATIO; // ~106.8\n\n/** Inner ring radius (hours 13-23 in 24h mode) */\nconst INNER_RADIUS = TP_SIZE.clockDialSize * INNER_CIRCLE_RATIO; // ~74.9\n\n/** Handle circle radius = selectorHandleSize / 2 */\nconst HANDLE_RADIUS = TP_SIZE.selectorHandleSize / 2; // 24\n\n/**\n * SELECTOR_GAP — minimum gap from handle edge to container edge.\n * MD3 spec: 4dp gap between selector handle and background circle.\n */\nconst SELECTOR_GAP = 4;\n\n// ─── Number data ────────────────────────────────────────────────────────────────\n\ninterface ClockNumber {\n\tvalue: number;\n\tx: number;\n\ty: number;\n\tradius: number; // for 24h inner ring detection\n}\n\n/**\n * Calculates number position on dial circle.\n * Starting from 12 o'clock (top) = -PI/2\n */\nconst getPositionOnDial = (\n\tindex: number,\n\ttotal: number,\n\tradius: number,\n): { x: number; y: number } => {\n\tconst angle = (index / total) * FULL_CIRCLE - QUARTER_CIRCLE;\n\treturn {\n\t\tx: CENTER + radius * Math.cos(angle),\n\t\ty: CENTER + radius * Math.sin(angle),\n\t};\n};\n\n/** Generates number list for 12h hour mode (1-12) */\nconst buildHour12Numbers = (): ClockNumber[] =>\n\tArray.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i === 0 ? 12 : i;\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: OUTER_RADIUS };\n\t});\n\n/** Generates number list for 24h mode (0-23, outer 0-11, inner 12-23) */\nconst buildHour24Numbers = (): ClockNumber[] => {\n\tconst outer: ClockNumber[] = Array.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i; // 0-11\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: OUTER_RADIUS };\n\t});\n\tconst inner: ClockNumber[] = Array.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i + 12; // 12-23\n\t\tconst pos = getPositionOnDial(i, 12, INNER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: INNER_RADIUS };\n\t});\n\treturn [...outer, ...inner];\n};\n\n/** Generates number list for minute mode (0, 5, 10, ..., 55) */\nconst buildMinuteNumbers = (): ClockNumber[] =>\n\tArray.from({ length: 12 }, (_, i) => {\n\t\tconst minute = i * 5; // 0, 5, 10, ..., 55\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: minute, ...pos, radius: OUTER_RADIUS };\n\t});\n\n// ─── Math ──────────────────────────────────────────────────────────────────────\n\n/**\n * Calculates angle from pointer position (x, y) relative to center.\n * Similar to `atan2` in Compose — returns angle in [-PI, PI].\n * Offset by -QUARTER_CIRCLE so 12 o'clock = 0 rad.\n */\nconst getAngleFromPointer = (x: number, y: number): number => {\n\treturn Math.atan2(y - CENTER, x - CENTER);\n};\n\n/**\n * Normalizes angle to range [0, 2PI).\n */\nconst normalizeAngle = (angle: number): number => {\n\tlet a = angle % FULL_CIRCLE;\n\tif (a < 0) a += FULL_CIRCLE;\n\treturn a;\n};\n\n/**\n * Converts angle → hour (12h mode, 1-12).\n * Ported from `Float.toHour()` in AnalogTimePickerState.\n */\nconst angleToHour12 = (angle: number): number => {\n\tconst hourOffset = RADIANS_PER_HOUR / 2;\n\tconst totalOffset = hourOffset + QUARTER_CIRCLE;\n\tconst hour = Math.round((angle + totalOffset) / RADIANS_PER_HOUR) % 12;\n\treturn hour === 0 ? 12 : hour;\n};\n\n/**\n * Converts angle → minute (0-55, step 5 on click, step 1 on drag).\n * Ported from `Float.toMinute()` in AnalogTimePickerState.\n */\nconst angleToMinute = (angle: number, snap = true): number => {\n\tif (snap) {\n\t\tconst minuteOffset = RADIANS_PER_MINUTE / 2;\n\t\tconst totalOffset = minuteOffset + QUARTER_CIRCLE;\n\t\tconst raw = Math.round((angle + totalOffset) / RADIANS_PER_MINUTE) % 60;\n\t\treturn raw < 0 ? raw + 60 : raw;\n\t}\n\t// Drag mode — step 1\n\tconst normalized = normalizeAngle(angle + QUARTER_CIRCLE);\n\tconst raw = Math.round((normalized / FULL_CIRCLE) * 60) % 60;\n\treturn raw < 0 ? raw + 60 : raw;\n};\n\n/**\n * Calculates selector handle position from angle and is24h/isPm.\n * Ported from `AnalogTimePickerState.selectorPos`.\n */\nconst getSelectorPosition = (\n\tangle: number,\n\tselection: TimePickerSelectionMode,\n\tis24hour: boolean,\n\tisPm: boolean,\n): { x: number; y: number } => {\n\t// Inner circle for 24h PM hours (13-23)\n\tconst useInner = is24hour && isPm && selection === \"hour\";\n\tconst baseRadius = useInner ? INNER_RADIUS : OUTER_RADIUS;\n\n\t// MD3: clamps handle center so handle edge maintains SELECTOR_GAP to container edge.\n\t// maxLength = CENTER - HANDLE_RADIUS - GAP = 128 - 24 - 4 = 100px\n\tconst length = Math.min(baseRadius, CENTER - HANDLE_RADIUS - SELECTOR_GAP);\n\n\treturn {\n\t\tx: CENTER + length * Math.cos(angle),\n\t\ty: CENTER + length * Math.sin(angle),\n\t};\n};\n\n/**\n * Calculates display angle from hour/minute value.\n * Ported from `hourAngle = RadiansPerHour * (state.hour % 12) - FullCircle / 4`\n */\nconst valueToAngle = (\n\tvalue: number,\n\tselection: TimePickerSelectionMode,\n): number => {\n\tif (selection === \"hour\") {\n\t\treturn RADIANS_PER_HOUR * (value % 12) - QUARTER_CIRCLE;\n\t}\n\treturn RADIANS_PER_MINUTE * value - QUARTER_CIRCLE;\n};\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface ClockDialProps {\n\t/** Hoisted state */\n\tstate: TimePickerState;\n\t/**\n\t * Automatically switches selection to \"minute\" after picking hour.\n\t * @default true\n\t */\n\tautoSwitchToMinute?: boolean;\n\t/** Inline style override */\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * ClockDial — SVG clock face with pointer interaction.\n *\n * Renders numbers around dial circle and selector handle, supporting:\n * - Click to select specific hour/minute\n * - Drag for continuous rotation\n * - autoSwitchToMinute\n * - 24h mode (dual ring: outer 0-11, inner 12-23)\n *\n * @example\n * ```tsx\n * <ClockDial state={state} autoSwitchToMinute />\n * ```\n */\nexport const ClockDial: React.FC<ClockDialProps> = ({\n\tstate,\n\tautoSwitchToMinute = true,\n\tstyle,\n\tclassName,\n}) => {\n\tconst {\n\t\tselection,\n\t\tis24hour,\n\t\tisPm,\n\t\thour,\n\t\tminute,\n\t\tsetHour,\n\t\tsetMinute,\n\t\tsetSelection,\n\t} = state;\n\n\t// Calculate display angle from current value\n\tconst displayAngle = React.useMemo(() => {\n\t\tif (selection === \"hour\") {\n\t\t\treturn valueToAngle(hour, \"hour\");\n\t\t}\n\t\treturn valueToAngle(minute, \"minute\");\n\t}, [selection, hour, minute]);\n\n\tconst selectorPos = React.useMemo(\n\t\t() => getSelectorPosition(displayAngle, selection, is24hour, isPm),\n\t\t[displayAngle, selection, is24hour, isPm],\n\t);\n\n\tconst trackEnd = React.useMemo(() => {\n\t\tconst dx = selectorPos.x - CENTER;\n\t\tconst dy = selectorPos.y - CENTER;\n\t\tconst length = Math.hypot(dx, dy);\n\t\tif (length === 0) return selectorPos;\n\t\treturn {\n\t\t\tx: selectorPos.x - (dx / length) * HANDLE_RADIUS,\n\t\t\ty: selectorPos.y - (dy / length) * HANDLE_RADIUS,\n\t\t};\n\t}, [selectorPos]);\n\n\tconst numbers = React.useMemo((): ClockNumber[] => {\n\t\tif (selection === \"minute\") return buildMinuteNumbers();\n\t\tif (is24hour) return buildHour24Numbers();\n\t\treturn buildHour12Numbers();\n\t}, [selection, is24hour]);\n\n\tconst isDragging = React.useRef(false);\n\tconst svgRef = React.useRef<SVGSVGElement>(null);\n\n\t/** Convert pointer event → SVG coordinate */\n\tconst getSVGPoint = (\n\t\te: PointerEvent | React.PointerEvent,\n\t): { x: number; y: number } => {\n\t\tconst svg = svgRef.current;\n\t\tif (!svg) return { x: e.clientX, y: e.clientY };\n\t\tconst rect = svg.getBoundingClientRect();\n\t\tconst scaleX = TP_SIZE.clockDialSize / rect.width;\n\t\tconst scaleY = TP_SIZE.clockDialSize / rect.height;\n\t\treturn {\n\t\t\tx: (e.clientX - rect.left) * scaleX,\n\t\t\ty: (e.clientY - rect.top) * scaleY,\n\t\t};\n\t};\n\n\t/** Handles new value from pointer position */\n\tconst handlePosition = (x: number, y: number, isPointerUp = false): void => {\n\t\tconst angle = getAngleFromPointer(x, y);\n\n\t\tif (selection === \"hour\") {\n\t\t\tlet newHour: number;\n\n\t\t\tif (is24hour) {\n\t\t\t\t// 24h: check distance from center to differentiate inner (PM) / outer (AM)\n\t\t\t\tconst dist = Math.sqrt((x - CENTER) ** 2 + (y - CENTER) ** 2);\n\t\t\t\tconst isPmHour = dist < (OUTER_RADIUS + INNER_RADIUS) / 2;\n\t\t\t\tconst hour12 = angleToHour12(angle);\n\t\t\t\tnewHour = isPmHour ? hour12 + 12 : hour12 === 12 ? 0 : hour12;\n\t\t\t} else {\n\t\t\t\tconst hour12 = angleToHour12(angle);\n\t\t\t\t// Convert 12h display → 24h internal\n\t\t\t\tnewHour = hour12 === 12 ? (isPm ? 12 : 0) : isPm ? hour12 + 12 : hour12;\n\t\t\t}\n\n\t\t\tsetHour(newHour);\n\n\t\t\t// Auto-switch: switch to minute after pointer up\n\t\t\tif (isPointerUp && autoSwitchToMinute) {\n\t\t\t\tsetTimeout(() => setSelection(\"minute\"), 100);\n\t\t\t}\n\t\t} else {\n\t\t\tconst newMinute = angleToMinute(angle, !isDragging.current);\n\t\t\tsetMinute(newMinute);\n\t\t}\n\t};\n\n\tconst handlePointerDown = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\te.currentTarget.setPointerCapture(e.pointerId);\n\t\tisDragging.current = false;\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y);\n\t};\n\n\tconst handlePointerMove = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\tif (e.buttons === 0) return; // mouse not pressed\n\t\tisDragging.current = true;\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y);\n\t};\n\n\tconst handlePointerUp = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\te.currentTarget.releasePointerCapture(e.pointerId);\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y, true);\n\t\tisDragging.current = false;\n\t};\n\n\tconst getDisplayHour = (): number => {\n\t\tif (is24hour) return hour;\n\t\treturn hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n\t};\n\n\t/**\n\t * MD3 spec: when the handle circle overlaps a number, the number switches to OnPrimary.\n\t * For minutes, we use geometric distance to avoid nearest-5 rounding causing abrupt jumps.\n\t */\n\tconst isNumberHighlighted = (num: ClockNumber): boolean => {\n\t\tif (selection === \"hour\") return num.value === getDisplayHour();\n\t\tconst dx = selectorPos.x - num.x;\n\t\tconst dy = selectorPos.y - num.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy) < HANDLE_RADIUS;\n\t};\n\n\t/**\n\t * Hour numbers move to sit inside the handle circle.\n\t * Minute numbers always stay at their fixed positions — the handle naturally overlaps them.\n\t */\n\tconst isNumberAtHandle = (num: ClockNumber): boolean => {\n\t\tif (selection === \"hour\") return num.value === getDisplayHour();\n\t\treturn false;\n\t};\n\n\t// ── Render ────────────────────────────────────────────────────────────────\n\n\treturn (\n\t\t<svg\n\t\t\tref={svgRef}\n\t\t\twidth={TP_SIZE.clockDialSize}\n\t\t\theight={TP_SIZE.clockDialSize}\n\t\t\tviewBox={`0 0 ${TP_SIZE.clockDialSize} ${TP_SIZE.clockDialSize}`}\n\t\t\trole=\"img\"\n\t\t\taria-label={`Clock face, ${selection === \"hour\" ? \"select hour\" : \"select minute\"}`}\n\t\t\tstyle={style}\n\t\t\toverflow=\"visible\"\n\t\t\tclassName={cn(\"touch-none select-none cursor-pointer\", className)}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={handlePointerUp}\n\t\t>\n\t\t\t{/* ── Background circle ── */}\n\t\t\t<circle cx={CENTER} cy={CENTER} r={CENTER} fill={TP_COLORS.clockDial} />\n\n\t\t\t{/* ── Selector track (line from center → handle) ── */}\n\t\t\t<line\n\t\t\t\tx1={CENTER}\n\t\t\t\ty1={CENTER}\n\t\t\t\tx2={trackEnd.x}\n\t\t\t\ty2={trackEnd.y}\n\t\t\t\tstroke={TP_COLORS.selectorTrack}\n\t\t\t\tstrokeWidth={TP_SIZE.selectorTrackWidth}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\n\t\t\t{/* ── Handle circle ── */}\n\t\t\t<circle\n\t\t\t\tcx={selectorPos.x}\n\t\t\t\tcy={selectorPos.y}\n\t\t\t\tr={HANDLE_RADIUS}\n\t\t\t\tfill={TP_COLORS.selectorHandle}\n\t\t\t/>\n\n\t\t\t{/* ── Center dot — rendered after handle to stay on top ── */}\n\t\t\t<circle\n\t\t\t\tcx={CENTER}\n\t\t\t\tcy={CENTER}\n\t\t\t\tr={TP_SIZE.selectorCenterSize / 2}\n\t\t\t\tfill={TP_COLORS.selectorCenter}\n\t\t\t/>\n\n\t\t\t{/* ── Number labels — rendered last on top of handle ── */}\n\t\t\t{numbers.map((num) => {\n\t\t\t\tconst highlighted = isNumberHighlighted(num);\n\t\t\t\tconst atHandle = isNumberAtHandle(num);\n\t\t\t\t// Only move into handle when exactly matching selected tick\n\n\t\t\t\treturn (\n\t\t\t\t\t<text\n\t\t\t\t\t\tkey={`${num.value}-${num.radius}`}\n\t\t\t\t\t\tx={atHandle ? selectorPos.x : num.x}\n\t\t\t\t\t\ty={atHandle ? selectorPos.y : num.y}\n\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\tdominantBaseline=\"central\"\n\t\t\t\t\t\tfontSize={is24hour && num.radius === INNER_RADIUS ? 12 : 14}\n\t\t\t\t\t\tfontWeight={highlighted ? \"600\" : \"400\"}\n\t\t\t\t\t\tfill={\n\t\t\t\t\t\t\thighlighted\n\t\t\t\t\t\t\t\t? TP_COLORS.clockDialSelected\n\t\t\t\t\t\t\t\t: TP_COLORS.clockDialUnselected\n\t\t\t\t\t\t}\n\t\t\t\t\t\taria-label={String(num.value)}\n\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{selection === \"hour\" && is24hour\n\t\t\t\t\t\t\t? String(num.value).padStart(2, \"0\")\n\t\t\t\t\t\t\t: num.value}\n\t\t\t\t\t</text>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n};\n\nClockDial.displayName = \"ClockDial\";\n","/**\n * @file time-picker/time-picker.tsx\n *\n * Android MD3 clock picker. The picker uses a compact vertical arrangement in\n * portrait and moves the clock beside the display on larger landscape screens.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { ClockDial } from \"./subcomponents/clock-dial\";\nimport { PeriodSelector } from \"./subcomponents/period-selector\";\nimport { TimeField } from \"./subcomponents/time-field\";\nimport { TP_SIZE } from \"./time-picker.tokens\";\nimport type {\n\tTimePickerLayout,\n\tTimePickerProps,\n\tTimePickerState,\n} from \"./time-picker.types\";\n\nconst getHourForDisplay = (state: TimePickerState): number => {\n\tconst { hour, is24hour, isPm } = state;\n\tif (is24hour) return hour;\n\tif (hour % 12 === 0) return 12;\n\treturn isPm ? hour - 12 : hour;\n};\n\nconst getAutoLayout = (): Exclude<TimePickerLayout, \"auto\"> => {\n\tif (typeof window === \"undefined\") return \"vertical\";\n\tconst { innerHeight, innerWidth } = window;\n\treturn innerWidth >= 600 && innerHeight >= 300 && innerWidth >= innerHeight\n\t\t? \"horizontal\"\n\t\t: \"vertical\";\n};\n\nconst useResolvedLayout = (\n\tlayout: TimePickerLayout,\n): Exclude<TimePickerLayout, \"auto\"> => {\n\t// Start vertical so SSR and the first client render agree; measure after mount.\n\tconst [autoLayout, setAutoLayout] =\n\t\tReact.useState<Exclude<TimePickerLayout, \"auto\">>(\"vertical\");\n\n\tReact.useEffect(() => {\n\t\tif (layout !== \"auto\") return;\n\t\tconst updateLayout = () => setAutoLayout(getAutoLayout());\n\t\tupdateLayout();\n\t\twindow.addEventListener(\"resize\", updateLayout);\n\t\treturn () => window.removeEventListener(\"resize\", updateLayout);\n\t}, [layout]);\n\n\treturn layout === \"auto\" ? autoLayout : layout;\n};\n\ninterface ClockDisplayProps {\n\tstate: TimePickerState;\n\tlayout: Exclude<TimePickerLayout, \"auto\">;\n}\n\nconst ClockDisplay: React.FC<ClockDisplayProps> = ({ state, layout }) => {\n\tconst { selection, setSelection, is24hour } = state;\n\tconst periodLayout = layout === \"horizontal\" ? \"horizontal\" : \"vertical\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex\",\n\t\t\t\tlayout === \"horizontal\"\n\t\t\t\t\t? \"flex-col items-start justify-center\"\n\t\t\t\t\t: \"flex-row items-center justify-center\",\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-center\">\n\t\t\t\t<TimeField\n\t\t\t\t\tmode=\"selector\"\n\t\t\t\t\tvalue={getHourForDisplay(state)}\n\t\t\t\t\tfield=\"hour\"\n\t\t\t\t\tselection={selection}\n\t\t\t\t\tonActivate={() => setSelection(\"hour\")}\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName=\"w-6 text-center text-[57px] leading-none font-normal text-m3-on-surface\"\n\t\t\t\t>\n\t\t\t\t\t:\n\t\t\t\t</span>\n\t\t\t\t<TimeField\n\t\t\t\t\tmode=\"selector\"\n\t\t\t\t\tvalue={state.minute}\n\t\t\t\t\tfield=\"minute\"\n\t\t\t\t\tselection={selection}\n\t\t\t\t\tonActivate={() => setSelection(\"minute\")}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{!is24hour ? (\n\t\t\t\t<PeriodSelector\n\t\t\t\t\tstate={state}\n\t\t\t\t\tlayout={periodLayout}\n\t\t\t\t\tclassName={layout === \"horizontal\" ? \"mt-3\" : \"ml-3\"}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n};\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n\tstate,\n\tlayout = \"auto\",\n\tclassName,\n}) => {\n\tconst resolvedLayout = useResolvedLayout(layout);\n\n\treturn (\n\t\t<div\n\t\t\tdata-time-picker-layout={resolvedLayout}\n\t\t\tclassName={cn(\n\t\t\t\t\"time-picker rounded-m3-xl bg-m3-surface-container-high p-6 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<p className=\"mb-5 text-left text-[12px] font-medium tracking-[0.1em] text-m3-on-surface-variant\">\n\t\t\t\tSelect time\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex\",\n\t\t\t\t\tresolvedLayout === \"horizontal\"\n\t\t\t\t\t\t? \"flex-row items-center gap-[52px]\"\n\t\t\t\t\t\t: \"flex-col items-center gap-9\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ClockDisplay state={state} layout={resolvedLayout} />\n\t\t\t\t<ClockDial\n\t\t\t\t\tstate={state}\n\t\t\t\t\tautoSwitchToMinute\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: TP_SIZE.clockDialSize,\n\t\t\t\t\t\theight: TP_SIZE.clockDialSize,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTimePicker.displayName = \"TimePicker\";\n","/**\n * @file time-picker/time-picker-dialog.tsx\n *\n * TimePickerDialog — modal container for TimePicker and TimeInput.\n * Reuses Dialog + DialogPortal primitives matching DatePickerDialog pattern.\n *\n * Layout:\n * ```\n * ┌─────────────────────┐\n * │ [Content] │ ← TimePicker or TimeInput\n * │─────────────────────│\n * │ 🎹 [Cancel] [OK] │ ← footer: modeToggle + spacer + dismiss + confirm\n * └─────────────────────┘\n * ```\n *\n * Tokens from TimePickerDialog.kt (shared with DatePickerDialog):\n * - ContainerColor = SurfaceContainerHigh\n * - ContainerShape = CornerExtraLarge (28px)\n * - ContainerElevation = Level3\n *\n * Ported from `TimePickerDialog.kt` and `DatePickerDialog` pattern.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerDialog.kt\n * @see packages/react/src/ui/date-time-pickers/date-picker/date-picker-dialog.tsx\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { m } from \"motion/react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Dialog, DialogPortal } from \"../../dialog\";\nimport {\n\tPICKER_CONTENT_ANIM,\n\tPICKER_OVERLAY_ANIM,\n} from \"../shared/animation-tokens\";\nimport type { TimePickerDialogProps } from \"./time-picker.types\";\n\n/**\n * TimePickerDialog — modal dialog container for TimePicker / TimeInput.\n *\n * Reuses `<Dialog>` (Root) and `<DialogPortal>` (AnimatePresence + Portal)\n * while managing Overlay and Content to preserve MD3 Time Picker specs.\n *\n * @example Basic usage\n\n * ```tsx\n * const state = useTimePickerState({ initialHour: 7 });\n * const [open, setOpen] = React.useState(false);\n * const [mode, setMode] = React.useState<'dial' | 'input'>('dial');\n *\n * <TimePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * modeToggleButton={\n * <button onClick={() => setMode(m => m === 'dial' ? 'input' : 'dial')}>\n * <span className=\"md-icon\">{mode === 'dial' ? 'keyboard' : 'schedule'}</span>\n * </button>\n * }\n * confirmButton={\n * <Button variant=\"text\" onClick={() => { handleConfirm(state); setOpen(false); }}>\n * OK\n * </Button>\n * }\n * dismissButton={\n * <Button variant=\"text\" onClick={() => setOpen(false)}>Cancel</Button>\n * }\n * >\n * {mode === 'dial' ? <TimePicker state={state} /> : <TimeInput state={state} />}\n * </TimePickerDialog>\n * ```\n */\nexport const TimePickerDialog: React.FC<TimePickerDialogProps> = ({\n\topen,\n\tonDismiss,\n\tconfirmButton,\n\tdismissButton,\n\tmodeToggleButton,\n\ttitle = \"Select time\",\n\tchildren,\n\tclassName,\n}) => {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={(v) => !v && onDismiss()}>\n\t\t\t<DialogPortal open={open}>\n\t\t\t\t{/* Scrim */}\n\t\t\t\t<RadixDialog.Overlay asChild forceMount>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"time-picker-overlay\"\n\t\t\t\t\t\tclassName=\"fixed inset-0 z-50 bg-m3-scrim/40\"\n\t\t\t\t\t\tinitial={PICKER_OVERLAY_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_OVERLAY_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_OVERLAY_ANIM.exit}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t/>\n\t\t\t\t</RadixDialog.Overlay>\n\n\t\t\t\t{/* Dialog panel */}\n\t\t\t\t<RadixDialog.Content\n\t\t\t\t\tasChild\n\t\t\t\t\tforceMount\n\t\t\t\t\tonEscapeKeyDown={onDismiss}\n\t\t\t\t\tonPointerDownOutside={(e) => e.preventDefault()} // scrim handles dismiss\n\t\t\t\t\taria-modal\n\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"time-picker-content\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t// Positioning\n\t\t\t\t\t\t\t\"fixed z-50 left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\t\t\t// Layout\n\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t// MD3 Time Picker container tokens\n\t\t\t\t\t\t\t\"bg-m3-surface-container-high\",\n\t\t\t\t\t\t\t\"rounded-m3-xl\",\n\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t\"max-w-[calc(100vw-32px)] max-h-[calc(100dvh-32px)]\",\n\t\t\t\t\t\t\t// Elevation Level 3\n\t\t\t\t\t\t\t\"elevation-3\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tinitial={PICKER_CONTENT_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_CONTENT_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_CONTENT_ANIM.exit}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Accessible title (screen reader only) */}\n\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">{title}</RadixDialog.Title>\n\n\t\t\t\t\t\t{/* Content — TimePicker or TimeInput */}\n\t\t\t\t\t\t<div className=\"flex-1\">{children}</div>\n\n\t\t\t\t\t\t{/* Footer: modeToggle | spacer | dismiss | confirm */}\n\t\t\t\t\t\t<div className=\"flex min-h-16 items-center gap-2 px-6 py-2\">\n\t\t\t\t\t\t\t{/* Mode toggle (keyboard ↔ clock icon) — optional */}\n\t\t\t\t\t\t\t{modeToggleButton && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center\">{modeToggleButton}</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{/* Spacer */}\n\t\t\t\t\t\t\t<div className=\"flex-1\" />\n\t\t\t\t\t\t\t{/* Action buttons */}\n\t\t\t\t\t\t\t{dismissButton}\n\t\t\t\t\t\t\t{confirmButton}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</RadixDialog.Content>\n\t\t\t</DialogPortal>\n\t\t</Dialog>\n\t);\n};\n\nTimePickerDialog.displayName = \"TimePickerDialog\";\n","/**\n * @file time-picker/use-time-picker-state.ts\n *\n * Core state hook for TimePicker — hoisted state pattern.\n * Ported from `rememberTimePickerState()` in Android Compose Material3.\n *\n * Separates `hour`/`minute` (always valid) and `hourInput`/`minuteInput`\n * (raw input, can be invalid mid-typing) — preserving Kotlin semantics.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerState.md\n *\n * @example\n * ```tsx\n * const state = useTimePickerState({\n * initialHour: 7,\n * initialMinute: 0,\n * is24hour: false,\n * });\n *\n * <TimePicker state={state} />\n * <p>{state.hour}:{String(state.minute).padStart(2, '0')} {state.isPm ? 'PM' : 'AM'}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport type {\n\tTimePickerSelectionMode,\n\tTimePickerState,\n\tUseTimePickerStateOptions,\n} from \"./time-picker.types\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Clamps a number within [min, max] range. */\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.max(min, Math.min(max, value));\n\n/**\n * Validates hour input according to time format.\n * 24h: 0-23. 12h: 1-12 (user-facing 12h clock).\n */\nconst isValidHourInput = (h: number, is24hour: boolean): boolean =>\n\tis24hour ? h >= 0 && h <= 23 : h >= 1 && h <= 12;\n\n/** Validates minute input: 0-59 */\nconst isValidMinuteInput = (m: number): boolean => m >= 0 && m <= 59;\n\n/**\n * Converts 12h input + isPm → 24h internal value.\n * Standard mapping:\n * 12 AM = 0, 1 AM = 1, ..., 11 AM = 11\n * 12 PM = 12, 1 PM = 13, ..., 11 PM = 23\n */\nconst to24Hour = (hour12: number, isPm: boolean): number => {\n\tif (isPm) {\n\t\treturn hour12 === 12 ? 12 : hour12 + 12;\n\t}\n\treturn hour12 === 12 ? 0 : hour12;\n};\n\n/**\n * Convert 24h internal → 12h display value.\n * 0 → 12 AM, 13 → 1 PM, 12 → 12 PM\n */\nconst to12Hour = (hour24: number): number => {\n\tif (hour24 === 0) return 12;\n\tif (hour24 > 12) return hour24 - 12;\n\treturn hour24;\n};\n\n// ─── Hook ──────────────────────────────────────────────────────────────────────\n\n/**\n * State management hook for TimePicker and TimeInput.\n * Equivalent to `rememberTimePickerState()` in Android Compose.\n *\n * @param options - Initial configuration options\n * @returns `TimePickerState` object with state and actions\n */\nexport const useTimePickerState = (\n\toptions?: UseTimePickerStateOptions,\n): TimePickerState => {\n\t// ── Initial values ────────────────────────────────────────────────────────\n\tconst initialHour = clamp(options?.initialHour ?? 0, 0, 23);\n\tconst initialMinute = clamp(options?.initialMinute ?? 0, 0, 59);\n\tconst is24hour = options?.is24hour ?? false;\n\n\t// ── State ─────────────────────────────────────────────────────────────────\n\tconst [hour, setHourState] = useState<number>(initialHour);\n\tconst [minute, setMinuteState] = useState<number>(initialMinute);\n\t// hourInput: raw display value (12h when !is24hour)\n\tconst [hourInput, setHourInputState] = useState<number>(\n\t\tis24hour ? initialHour : to12Hour(initialHour),\n\t);\n\tconst [minuteInput, setMinuteInputState] = useState<number>(initialMinute);\n\tconst [selection, setSelectionState] =\n\t\tuseState<TimePickerSelectionMode>(\"hour\");\n\n\t// ── Computed ──────────────────────────────────────────────────────────────\n\tconst isPm = hour >= 12;\n\tconst isHourInputValid = isValidHourInput(hourInput, is24hour);\n\tconst isMinuteInputValid = isValidMinuteInput(minuteInput);\n\tconst isInputValid = isHourInputValid && isMinuteInputValid;\n\n\t// ── Actions ───────────────────────────────────────────────────────────────\n\n\t/**\n\t * Sets valid hour (0-23) — used for clock dial.\n\t * Automatically updates both hour and hourInput.\n\t */\n\tconst setHour = useCallback(\n\t\t(h: number): void => {\n\t\t\tconst clamped = clamp(h, 0, 23);\n\t\t\tsetHourState(clamped);\n\t\t\t// hourInput always displays 12h format when !is24hour\n\t\t\tsetHourInputState(is24hour ? clamped : to12Hour(clamped));\n\t\t},\n\t\t[is24hour],\n\t);\n\n\t/**\n\t * Sets valid minute (0-59) — used for clock dial.\n\t * Automatically updates both minute and minuteInput.\n\t */\n\tconst setMinute = useCallback((m: number): void => {\n\t\tconst clamped = clamp(m, 0, 59);\n\t\tsetMinuteState(clamped);\n\t\tsetMinuteInputState(clamped);\n\t}, []);\n\n\t/**\n\t * Sets raw hour input — used for TimeInput text field.\n\t * Only updates internal `hour` (24h) when value is valid.\n\t * `hourInput` is always updated for immediate UI reflection.\n\t */\n\tconst setHourInput = useCallback(\n\t\t(h: number): void => {\n\t\t\tsetHourInputState(h);\n\t\t\tif (isValidHourInput(h, is24hour)) {\n\t\t\t\t// Convert to 24h internal\n\t\t\t\tconst h24 = is24hour ? h : to24Hour(h, isPm);\n\t\t\t\tsetHourState(clamp(h24, 0, 23));\n\t\t\t}\n\t\t},\n\t\t[is24hour, isPm],\n\t);\n\n\t/**\n\t * Sets raw minute input — used for TimeInput text field.\n\t * Only updates `minute` when value is valid.\n\t */\n\tconst setMinuteInput = useCallback((m: number): void => {\n\t\tsetMinuteInputState(m);\n\t\tif (isValidMinuteInput(m)) {\n\t\t\tsetMinuteState(m);\n\t\t}\n\t}, []);\n\n\t/** Switches selection mode between 'hour' and 'minute'. */\n\tconst setSelection = useCallback((mode: TimePickerSelectionMode): void => {\n\t\tsetSelectionState(mode);\n\t}, []);\n\n\t/**\n\t * Toggles AM/PM.\n\t * Automatically converts internal hour (24h) and updates hourInput (12h display).\n\t */\n\tconst setIsPm = useCallback((pm: boolean): void => {\n\t\tsetHourState((prev) => {\n\t\t\tconst wasAlreadyPm = prev >= 12;\n\t\t\tif (pm === wasAlreadyPm) return prev;\n\t\t\tconst newHour = pm ? prev + 12 : prev - 12;\n\t\t\tconst clamped = clamp(newHour, 0, 23);\n\t\t\t// Sync hourInput (12h display remains unchanged, only internal hour changes)\n\t\t\tsetHourInputState(to12Hour(clamped));\n\t\t\treturn clamped;\n\t\t});\n\t}, []);\n\n\t/**\n\t * Resets to initial state.\n\t */\n\tconst reset = useCallback((): void => {\n\t\tsetHourState(initialHour);\n\t\tsetMinuteState(initialMinute);\n\t\tsetHourInputState(is24hour ? initialHour : to12Hour(initialHour));\n\t\tsetMinuteInputState(initialMinute);\n\t\tsetSelectionState(\"hour\");\n\t}, [initialHour, initialMinute, is24hour]);\n\n\t// ── Memoized state object ──────────────────────────────────────────────────\n\treturn useMemo<TimePickerState>(\n\t\t() => ({\n\t\t\thour,\n\t\t\tminute,\n\t\t\thourInput,\n\t\t\tminuteInput,\n\t\t\tis24hour,\n\t\t\tselection,\n\t\t\tisInputValid,\n\t\t\tisHourInputValid,\n\t\t\tisMinuteInputValid,\n\t\t\tisPm,\n\t\t\tsetHour,\n\t\t\tsetMinute,\n\t\t\tsetHourInput,\n\t\t\tsetMinuteInput,\n\t\t\tsetSelection,\n\t\t\tsetIsPm,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\thour,\n\t\t\tminute,\n\t\t\thourInput,\n\t\t\tminuteInput,\n\t\t\tis24hour,\n\t\t\tselection,\n\t\t\tisInputValid,\n\t\t\tisHourInputValid,\n\t\t\tisMinuteInputValid,\n\t\t\tisPm,\n\t\t\tsetHour,\n\t\t\tsetMinute,\n\t\t\tsetHourInput,\n\t\t\tsetMinuteInput,\n\t\t\tsetSelection,\n\t\t\tsetIsPm,\n\t\t\treset,\n\t\t],\n\t);\n};\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/ui/shared/motion-tokens.ts","../src/ui/date-time-pickers/shared/animation-tokens.ts","../src/ui/date-time-pickers/shared/calendar-model.ts","../src/ui/date-time-pickers/date-picker/date-picker-input.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/day-cell.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/weekday-row.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/calendar-grid.tsx","../src/ui/loading-indicator.tsx","../src/ui/progress-indicator/utils.ts","../src/ui/progress-indicator/circular.tsx","../src/ui/progress-indicator/hooks.ts","../src/ui/progress-indicator/linear-flat.tsx","../src/ui/progress-indicator/linear-wavy.tsx","../src/ui/progress-indicator/linear.tsx","../src/ui/progress-indicator/index.tsx","../src/ui/ripple.tsx","../src/ui/shared/constants.ts","../src/ui/shared/touch-target.tsx","../src/ui/buttons/icon-button/icon-button.tsx","../src/ui/icon.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/calendar-header.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/month-picker-list.tsx","../src/ui/date-time-pickers/date-picker/subcomponents/year-picker-list.tsx","../src/ui/date-time-pickers/date-picker/date-picker.tsx","../src/ui/date-time-pickers/date-picker/date-picker.tokens.ts","../src/ui/scroll-area.tsx","../src/ui/dialog.tsx","../src/ui/date-time-pickers/date-picker/date-picker-dialog.tsx","../src/ui/date-time-pickers/date-picker/date-range-picker.tsx","../src/ui/date-time-pickers/shared/types.ts","../src/ui/date-time-pickers/date-picker/use-date-picker-state.ts","../src/ui/date-time-pickers/date-picker/use-date-range-picker-state.ts","../src/ui/date-time-pickers/time-picker/time-picker.tokens.ts","../src/ui/date-time-pickers/time-picker/subcomponents/period-selector.tsx","../src/ui/date-time-pickers/time-picker/subcomponents/time-field.tsx","../src/ui/date-time-pickers/time-picker/time-input.tsx","../src/ui/date-time-pickers/time-picker/subcomponents/clock-dial.tsx","../src/ui/date-time-pickers/time-picker/time-picker.tsx","../src/ui/date-time-pickers/time-picker/time-picker-dialog.tsx","../src/ui/date-time-pickers/time-picker/use-time-picker-state.ts"],"names":["twMerge","clsx","React","jsx","jsxs","React2","m","React3","React4","AnimatePresence","React5","IndeterminateSvg","Fragment","DeterminateSvg","React6","LazyMotion","domMax","React7","React8","FlatLinearTrack","React9","WavyLinearTrack","useMotionValue","animate","useAnimationFrame","React10","React11","React12","RippleItem","useReducedMotion","React13","_a","_b","Slot","React14","React15","React16","navigateMonth","React17","React18","RadixScrollArea","RadixDialog","React19","RadixDialog2","React20","useState","useCallback","useMemo","DEFAULT_YEAR_RANGE","useReducer","React21","React22","raw","React23","React24","RadixDialog3"],"mappings":"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","file":"pickers.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","/**\n * @file ui/shared/motion-tokens.ts\n *\n * Framer Motion spring presets derived from the official MD3 Expressive\n * motion physics system (May 2025).\n *\n * Usage hierarchy:\n * 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.\n * 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.\n * 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n * @see https://m3.material.io/styles/motion/overview/specs\n */\n\nimport type { Transition } from \"motion/react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Spring Token Structure\n//\n// MD3 defines springs as dampingRatio (0–1) + stiffness.\n// Framer Motion uses absolute `damping` coefficient.\n//\n// Conversion (with Framer's default mass = 1):\n// damping = 2 × dampingRatio × √stiffness\n//\n// Computed values (rounded to 2 decimal places):\n//\n// fast spatial: 2 × 0.6 × √800 = 2 × 0.6 × 28.28 ≈ 33.94\n// fast effects: 2 × 1.0 × √3800 = 2 × 61.64 ≈ 123.29\n// default spatial: 2 × 0.8 × √380 = 2 × 0.8 × 19.49 ≈ 31.19\n// default effects: 2 × 1.0 × √1600 = 2 × 40 = 80\n// slow spatial: 2 × 0.8 × √200 = 2 × 0.8 × 14.14 ≈ 22.63\n// slow effects: 2 × 1.0 × √800 = 2 × 28.28 ≈ 56.57\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Spatial springs — use for position, size, border-radius, rotation, scale ─\n\n/**\n * MD3 Expressive — Fast Spatial Spring\n * `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)\n *\n * Use for: small components (buttons, switches, chips).\n * Has notable bounce/overshoot — feels snappy and expressive.\n */\nexport const FAST_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 33.94,\n} as const;\n\n/**\n * MD3 Expressive — Default Spatial Spring\n * `md.sys.motion.spring.default.spatial` (dampingRatio: 0.8, stiffness: 380)\n *\n * Use for: medium elements (bottom sheets, menus, navigation rail).\n * Gentle overshoot — the go-to spring for most UI animations.\n */\nexport const DEFAULT_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 380,\n\tdamping: 31.19,\n} as const;\n\n/**\n * MD3 Expressive — Slow Spatial Spring\n * `md.sys.motion.spring.slow.spatial` (dampingRatio: 0.8, stiffness: 200)\n *\n * Use for: full-screen transitions and large layout shifts.\n * Subtle, slow overshoot.\n */\nexport const SLOW_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 22.63,\n} as const;\n\n// ── Effects springs — use for color, opacity (critically damped, no bounce) ──\n\n/**\n * MD3 Expressive — Fast Effects Spring\n * `md.sys.motion.spring.fast.effects` (dampingRatio: 1.0, stiffness: 3800)\n *\n * Use for: color changes on switches, icon swaps, badge counts.\n * Critically damped — very fast, no overshoot.\n */\nexport const FAST_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 3800,\n\tdamping: 123.29,\n} as const;\n\n/**\n * MD3 Expressive — Default Effects Spring\n * `md.sys.motion.spring.default.effects` (dampingRatio: 1.0, stiffness: 1600)\n *\n * Use for: opacity fades, color transitions for medium-sized elements.\n * Critically damped — smooth with no overshoot.\n */\nexport const DEFAULT_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 1600,\n\tdamping: 80,\n} as const;\n\n/**\n * MD3 Expressive — Slow Effects Spring\n * `md.sys.motion.spring.slow.effects` (dampingRatio: 1.0, stiffness: 800)\n *\n * Use for: full-screen opacity/color transitions.\n * Critically damped — slow and smooth.\n */\nexport const SLOW_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 56.57,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dynamic helper\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SpringSpeed = \"fast\" | \"default\" | \"slow\";\nexport type SpringAnimationType = \"spatial\" | \"effects\";\n\nconst springMap = {\n\tfast: { spatial: FAST_SPATIAL_SPRING, effects: FAST_EFFECTS_SPRING },\n\tdefault: { spatial: DEFAULT_SPATIAL_SPRING, effects: DEFAULT_EFFECTS_SPRING },\n\tslow: { spatial: SLOW_SPATIAL_SPRING, effects: SLOW_EFFECTS_SPRING },\n} as const;\n\n/**\n * Pick a Framer Motion spring by speed and type.\n *\n * @example\n * ```tsx\n * transition={getMotionSpring(\"fast\", \"spatial\")}\n * ```\n */\nexport function getMotionSpring(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n): Transition {\n\treturn springMap[speed][type];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS transition strings\n// For contexts where Framer Motion is not used (plain CSS / Tailwind).\n// Uses official Web spring → CSS cubic-bezier conversion table.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst CSS_CURVES = {\n\texpressive: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.42, 1.67, 0.21, 0.90)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.38, 1.21, 0.22, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.39, 1.29, 0.35, 0.98)\",\n\t\t\t\tdurationMs: 650,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n\tstandard: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 750,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n} as const;\n\nexport type MotionScheme = \"expressive\" | \"standard\";\n\n/**\n * Returns a CSS `transition` value string using the official MD3 web curve\n * conversion, e.g. `\"500ms cubic-bezier(0.38, 1.21, 0.22, 1.00)\"`.\n *\n * @example\n * ```ts\n * element.style.transition = `border-radius ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n * ```\n */\nexport function getMotionTransitionCSS(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n\tscheme: MotionScheme = \"expressive\",\n): string {\n\tconst { curve, durationMs } = CSS_CURVES[scheme][speed][type];\n\treturn `${durationMs}ms ${curve}`;\n}\n","/**\n * @file date-time-pickers/shared/animation-tokens.ts\n *\n * MD3 Expressive animation constants for picker overlays.\n * Reuses shared motion-tokens from ui/shared and adds picker-specific animations.\n *\n * CSS variables sourced from packages/tailwind/src/index.css.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n */\n\nimport type { TargetAndTransition, Transition, Variants } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n} from \"../../shared/motion-tokens\";\n\n// ─── Dialog / Overlay Animations ─────────────────────────────────────────────\n\n/** Scrim fade animation — 200ms standard-decelerate */\nexport const PICKER_OVERLAY_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: [0, 0, 0, 1] as const },\n\t},\n\texit: {\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n/**\n * Content panel enter animation — MD3 default.spatial spring (380/0.8).\n * Scales from 0.85 to 1 + fade in.\n */\nexport const PICKER_CONTENT_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0, scale: 0.85, y: 16 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ty: 0,\n\t\ttransition: DEFAULT_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 8,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n// ─── Calendar Grid Navigation ─────────────────────────────────────────────────\n\n/**\n * Slide animation when navigating to next month (→).\n * FAST_SPATIAL_SPRING — 350ms, cubic-bezier(0.42, 1.67, 0.21, 0.9).\n */\nexport const CALENDAR_SLIDE_VARIANTS: Variants = {\n\tenterFromRight: {\n\t\tx: \"100%\",\n\t\topacity: 0,\n\t},\n\tenterFromLeft: {\n\t\tx: \"-100%\",\n\t\topacity: 0,\n\t},\n\tcenter: {\n\t\tx: 0,\n\t\topacity: 1,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texitToLeft: {\n\t\tx: \"-100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n\texitToRight: {\n\t\tx: \"100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.15, ease: [0.3, 0, 1, 1] as const },\n\t},\n};\n\n// ─── Year / Month Selector Grid ───────────────────────────────────────────────\n\n/**\n * Month and Year selector panel transition — DEFAULT_SPATIAL_SPRING (380/0.8).\n * Scales from 0.95 to 1 + subtle vertical spring shift.\n */\nexport const PICKER_SELECTOR_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0, scale: 0.95, y: -6 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ty: 0,\n\t\ttransition: DEFAULT_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 6,\n\t\ttransition: { duration: 0.1, ease: \"easeIn\" as const },\n\t},\n};\n\n/** Year grid fade in/out — DEFAULT_EFFECTS_SPRING (1600/1.0) */\nexport const YEAR_GRID_ANIM: {\n\tinitial: TargetAndTransition;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { opacity: 0, scale: 0.95 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ttransition: DEFAULT_EFFECTS_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ttransition: { duration: 0.1, ease: \"easeIn\" as const },\n\t},\n};\n\n// ─── Day Cell ─────────────────────────────────────────────────────────────────\n\n/** State layer transition cho day cell — FAST_EFFECTS_SPRING (3800/1.0) */\nexport const DAY_CELL_STATE_TRANSITION: Transition = FAST_EFFECTS_SPRING;\n\n// ─── Re-exports for convenience ───────────────────────────────────────────────\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n};\n","/**\n * @file date-time-pickers/shared/calendar-model.ts\n *\n * Pure calendar math functions — no React dependencies.\n * 100% testable, reusable for Date Pickers and Time Pickers.\n *\n * All timestamps are in UTC milliseconds to prevent timezone shift issues.\n */\n\nimport type {\n\tCalendarWeek,\n\tDateLocale,\n\tResolvedDateLocale,\n\tSelectableDates,\n} from \"./types\";\n\n// ─── UTC Date Helpers ─────────────────────────────────────────────────────────\n\n/**\n * Normalizes a timestamp to UTC midnight (00:00:00.000 UTC).\n * Essential for consistent day comparison across timezones.\n */\nexport const startOfDayUTC = (ms: number): number => {\n\tconst d = new Date(ms);\n\treturn Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());\n};\n\n/** Gets UTC midnight of today */\nexport const todayUTC = (): number => startOfDayUTC(Date.now());\n\n/** Gets UTC midnight of 1st day of month */\nexport const startOfMonthUTC = (year: number, month: number): number =>\n\tDate.UTC(year, month, 1);\n\n/** Gets total days in month */\nexport const getDaysInMonth = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n\n/** Gets day-of-week (0=Sun, 6=Sat) for 1st day of month */\nexport const getFirstDayOfWeek = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month, 1)).getUTCDay();\n\n// ─── Calendar Grid ────────────────────────────────────────────────────────────\n\n/**\n * Generates calendar grid for a specific month.\n * Returns array of weeks, each week containing 7 cells (null = padding).\n *\n * @param year - Full year\n * @param month - Month (0–11)\n * @param weekStartsOn - 0 = Sunday, 1 = Monday\n */\nexport const getWeeksInMonth = (\n\tyear: number,\n\tmonth: number,\n\tweekStartsOn: 0 | 1,\n): CalendarWeek[] => {\n\tconst todayMs = todayUTC();\n\tconst daysInMonth = getDaysInMonth(year, month);\n\tconst firstDow = getFirstDayOfWeek(year, month); // 0 = Sun\n\n\t// Compute start padding cells according to weekStartsOn\n\tconst startPadding = (firstDow - weekStartsOn + 7) % 7;\n\n\t// Total cells = padding + actual days\n\tconst totalCells = startPadding + daysInMonth;\n\tconst totalWeeks = Math.ceil(totalCells / 7);\n\n\tconst weeks: CalendarWeek[] = [];\n\n\tfor (let w = 0; w < totalWeeks; w++) {\n\t\tconst week: CalendarWeek = [];\n\t\tfor (let d = 0; d < 7; d++) {\n\t\t\tconst cellIndex = w * 7 + d;\n\t\t\tconst dayNumber = cellIndex - startPadding + 1;\n\n\t\t\tif (dayNumber < 1 || dayNumber > daysInMonth) {\n\t\t\t\tweek.push(null);\n\t\t\t} else {\n\t\t\t\tconst utcMs = Date.UTC(year, month, dayNumber);\n\t\t\t\tweek.push({\n\t\t\t\t\tutcMs,\n\t\t\t\t\tday: dayNumber,\n\t\t\t\t\tmonth,\n\t\t\t\t\tyear,\n\t\t\t\t\tisCurrentMonth: true,\n\t\t\t\t\tisToday: utcMs === todayMs,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tweeks.push(week);\n\t}\n\n\treturn weeks;\n};\n\n// ─── Date Comparison ──────────────────────────────────────────────────────────\n\n/** Compares if two timestamps share the same UTC date */\nexport const isSameDay = (a: number, b: number): boolean =>\n\tstartOfDayUTC(a) === startOfDayUTC(b);\n\n/** Checks if ms falls within [startMs, endMs] (inclusive) */\nexport const isDateInRange = (\n\tms: number,\n\tstartMs: number | null,\n\tendMs: number | null,\n): boolean => {\n\tif (startMs === null || endMs === null) return false;\n\tconst day = startOfDayUTC(ms);\n\tconst start = startOfDayUTC(startMs);\n\tconst end = startOfDayUTC(endMs);\n\treturn day >= start && day <= end;\n};\n\n/** Checks if ms is the start date of range */\nexport const isRangeStart = (ms: number, startMs: number | null): boolean =>\n\tstartMs !== null && isSameDay(ms, startMs);\n\n/** Checks if ms is the end date of range */\nexport const isRangeEnd = (ms: number, endMs: number | null): boolean =>\n\tendMs !== null && isSameDay(ms, endMs);\n\n/** Checks if year is selectable according to `SelectableDates` config */\nexport const isYearSelectable = (\n\tyear: number,\n\tselectableDates: SelectableDates,\n): boolean => selectableDates.isSelectableYear(year);\n\n// ─── Locale / Month Normalization ─────────────────────────────────────────────\n\n/** Resolves partial DateLocale config with fallback values */\nexport const resolveLocale = (locale?: DateLocale): ResolvedDateLocale => ({\n\tlocale:\n\t\tlocale?.locale ??\n\t\t(typeof navigator !== \"undefined\" ? navigator.language : \"en-US\"),\n\tweekStartsOn: locale?.weekStartsOn ?? 1,\n});\n\n/** Normalizes any timestamp to UTC midnight on the 1st of that month */\nexport const normalizeToMonthStart = (ms: number): number => {\n\tconst d = new Date(ms);\n\treturn Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);\n};\n\n// ─── Month Navigation ─────────────────────────────────────────────────────────\n\n/**\n * Navigates to next/previous month.\n * @returns UTC ms of the 1st day of target month\n */\nexport const navigateMonth = (\n\tcurrentMs: number,\n\tdirection: \"prev\" | \"next\",\n): number => {\n\tconst d = new Date(currentMs);\n\tconst year = d.getUTCFullYear();\n\tconst month = d.getUTCMonth();\n\tif (direction === \"next\") {\n\t\treturn month === 11\n\t\t\t? Date.UTC(year + 1, 0, 1)\n\t\t\t: Date.UTC(year, month + 1, 1);\n\t}\n\treturn month === 0 ? Date.UTC(year - 1, 11, 1) : Date.UTC(year, month - 1, 1);\n};\n\n/** Whether a month can be displayed under the picker year constraints. */\nexport const isMonthNavigable = (\n\tyear: number,\n\tyearRange: [number, number],\n\tselectableDates: SelectableDates,\n): boolean =>\n\tyear >= yearRange[0] &&\n\tyear <= yearRange[1] &&\n\tselectableDates.isSelectableYear(year);\n\n/**\n * Return the adjacent month only when its year is allowed. This keeps imperative\n * hook actions and the header controls subject to exactly the same constraints.\n */\nexport const getNavigableMonth = (\n\tcurrentMs: number,\n\tdirection: \"prev\" | \"next\",\n\tyearRange: [number, number],\n\tselectableDates: SelectableDates,\n): number | null => {\n\tconst targetMs = navigateMonth(currentMs, direction);\n\tconst targetYear = new Date(targetMs).getUTCFullYear();\n\treturn isMonthNavigable(targetYear, yearRange, selectableDates)\n\t\t? targetMs\n\t\t: null;\n};\n\n// ─── Date Formatting ──────────────────────────────────────────────────────────\n\n/**\n * Formats a UTC timestamp into a locale-aware date string.\n *\n * @example\n\n * ```ts\n * formatDate(Date.UTC(2025, 5, 26), { locale: 'en-US', weekStartsOn: 1 })\n * // → \"June 26, 2025\"\n * ```\n */\nexport const formatDate = (\n\tutcMs: number,\n\tlocale: ResolvedDateLocale,\n\toptions?: Intl.DateTimeFormatOptions,\n): string => {\n\tconst defaultOptions: Intl.DateTimeFormatOptions = {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t};\n\treturn new Intl.DateTimeFormat(locale.locale, {\n\t\t...defaultOptions,\n\t\t...options,\n\t}).format(new Date(utcMs));\n};\n\n/**\n * Formats month + year for calendar header (e.g., \"June 2025\").\n */\nexport const formatMonthYear = (\n\tutcMs: number,\n\tlocale: ResolvedDateLocale,\n): string =>\n\tnew Intl.DateTimeFormat(locale.locale, {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(utcMs));\n\n/**\n * Returns weekday names (narrow) according to locale and weekStartsOn.\n * @returns Array of 7 names, starting from weekStartsOn day.\n *\n * @example\n * ```ts\n * getWeekdayNames({ locale: 'en-US', weekStartsOn: 1 })\n * // → ['M', 'T', 'W', 'T', 'F', 'S', 'S']\n * ```\n */\nexport const getWeekdayNames = (locale: ResolvedDateLocale): string[] => {\n\t// Fixed reference week (2025-01-05 is Sunday) to extract day names\n\tconst SUNDAY_MS = Date.UTC(2025, 0, 5);\n\tconst formatter = new Intl.DateTimeFormat(locale.locale, {\n\t\tweekday: \"narrow\",\n\t\ttimeZone: \"UTC\",\n\t});\n\n\tconst allDays = Array.from({ length: 7 }, (_, i) =>\n\t\tformatter.format(new Date(SUNDAY_MS + i * 86_400_000)),\n\t);\n\n\t// Rotate according to weekStartsOn: 0=Sun (no rotate), 1=Mon (rotate 1)\n\treturn [\n\t\t...allDays.slice(locale.weekStartsOn),\n\t\t...allDays.slice(0, locale.weekStartsOn),\n\t];\n};\n\n// ─── Parse helpers ────────────────────────────────────────────────────────────\n\n/**\n * Parses date string in \"MM/DD/YYYY\" format into UTC ms.\n * @returns UTC ms if valid, null if invalid\n */\nexport const parseDateInput = (input: string): number | null => {\n\tconst match = input.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n\tif (!match) return null;\n\n\tconst [, mm, dd, yyyy] = match;\n\tconst month = parseInt(mm, 10) - 1;\n\n\tconst day = parseInt(dd, 10);\n\tconst year = parseInt(yyyy, 10);\n\n\tif (month < 0 || month > 11 || day < 1 || day > 31 || year < 1) return null;\n\n\tconst maxDay = getDaysInMonth(year, month);\n\tif (day > maxDay) return null;\n\n\treturn Date.UTC(year, month, day);\n};\n","/**\n * @file date-picker/date-picker-input.tsx\n *\n * Text input mode for Date Picker — manual entry in MM/DD/YYYY format.\n * Uses library TextField component.\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport * as React from \"react\";\nimport { parseDateInput } from \"../shared/calendar-model\";\nimport type { DatePickerInputProps } from \"./date-picker.types\";\n\n/**\n * Text input for Date Picker with MM/DD/YYYY format.\n * Validates realtime, commits on blur or Enter.\n */\nexport const DatePickerInput: React.FC<DatePickerInputProps> = ({\n\tvalue,\n\tonChange,\n\tonCommit,\n\tlabel = \"Enter date\",\n\terror,\n\tlocale,\n\tclassName,\n}) => {\n\tconst inputId = React.useId();\n\tconst errorId = `${inputId}-error`;\n\t// Format hint according to locale\n\tconst placeholder = React.useMemo(() => {\n\t\tif (locale?.startsWith(\"vi\")) return \"DD/MM/YYYY\";\n\t\treturn \"MM/DD/YYYY\";\n\t}, [locale]);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\tconst parsed = parseDateInput(value);\n\t\t\t\tonCommit(parsed);\n\t\t\t}\n\t\t},\n\t\t[value, onCommit],\n\t);\n\n\tconst handleBlur = React.useCallback(() => {\n\t\tconst parsed = parseDateInput(value);\n\t\tonCommit(parsed);\n\t}, [value, onCommit]);\n\n\t// Auto-format: inserts \"/\" after month and day digits\n\tconst handleChange = React.useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tlet raw = e.target.value.replace(/\\D/g, \"\"); // retain numbers only\n\n\t\t\tif (raw.length > 8) raw = raw.slice(0, 8);\n\n\t\t\tlet formatted = raw;\n\t\t\tif (raw.length > 2) {\n\t\t\t\tformatted = `${raw.slice(0, 2)}/${raw.slice(2)}`;\n\t\t\t}\n\t\t\tif (raw.length > 4) {\n\t\t\t\tformatted = `${raw.slice(0, 2)}/${raw.slice(2, 4)}/${raw.slice(4)}`;\n\t\t\t}\n\n\t\t\tonChange(formatted);\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t<div className=\"px-6 py-4\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\tclassName=\"block text-[length:var(--md-typescale-label-large-size,14px)]\n\t\t\t\t\t\t\tfont-[number:var(--md-typescale-label-large-weight,500)]\n\t\t\t\t\t\t\ttext-m3-on-surface-variant\n\t\t\t\t\t\t\tmb-1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\t\taria-describedby={error ? errorId : undefined}\n\t\t\t\t\t\tmaxLength={10}\n\t\t\t\t\t\tclassName=\"w-full h-14 px-4 rounded-m3-xs\n\t\t\t\t\t\t\tbg-m3-surface-container-highest\n\t\t\t\t\t\t\ttext-[length:var(--md-typescale-body-large-size,16px)]\n\t\t\t\t\t\t\thover:bg-m3-on-surface/8\n\t\t\t\t\t\t\ttext-m3-on-surface\n\t\t\t\t\t\t\tcaret-m3-primary\n\t\t\t\t\t\t\tplaceholder:text-m3-on-surface-variant\n\t\t\t\t\t\t\toutline-none border-0\n\t\t\t\t\t\t\tfocus:ring-2 focus:ring-m3-primary\n\t\t\t\t\t\t\ttransition-m3-fast-effects\"\n\t\t\t\t\t/>\n\t\t\t\t\t{/* Supporting text / error */}\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<p id={errorId} className=\"mt-1 text-xs text-m3-error px-1\">\n\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nDatePickerInput.displayName = \"DatePickerInput\";\n","/**\n * @file date-picker/subcomponents/day-cell.tsx\n *\n * Day cell in calendar grid with complete MD3 states.\n * Tokens from DatePickerModalTokens.kt:\n * - DateContainerShape = CornerFull (pill)\n * - DateContainerHeight/Width = 40px\n * - DateSelectedContainerColor = Primary\n * - DateTodayContainerOutlineColor = Primary\n * - RangeSelectionActiveIndicatorContainerColor = SecondaryContainer\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { DAY_CELL_STATE_TRANSITION } from \"../../shared/animation-tokens\";\nimport {\n\tisDateInRange,\n\tisRangeEnd,\n\tisRangeStart,\n\tisSameDay,\n} from \"../../shared/calendar-model\";\nimport type { CalendarDay } from \"../../shared/types\";\n\ninterface DayCellProps {\n\tday: CalendarDay;\n\tselectedMs: number | null;\n\tselectedStartMs?: number | null;\n\tselectedEndMs?: number | null;\n\tisRangePicker?: boolean;\n\tisSelectable: boolean;\n\tonSelect(ms: number): void;\n\tlocale?: string;\n}\n\n/**\n * Day cell with 6 visual MD3 states:\n * - default, today, selected, in-range, range-start/end, disabled\n */\n\nexport const DayCell: React.FC<DayCellProps> = ({\n\tday,\n\tselectedMs,\n\tselectedStartMs = null,\n\tselectedEndMs = null,\n\tisRangePicker = false,\n\tisSelectable,\n\tonSelect,\n\tlocale,\n}) => {\n\tconst { utcMs, day: dayNum, isToday } = day;\n\n\t// ── State computation ───────────────────────────────────────────────────────\n\tconst isSelected =\n\t\t!isRangePicker && selectedMs !== null && isSameDay(utcMs, selectedMs);\n\tconst isStart = isRangePicker && isRangeStart(utcMs, selectedStartMs);\n\tconst isEnd = isRangePicker && isRangeEnd(utcMs, selectedEndMs);\n\tconst isInRange =\n\t\tisRangePicker &&\n\t\t!isStart &&\n\t\t!isEnd &&\n\t\tisDateInRange(utcMs, selectedStartMs, selectedEndMs);\n\tconst isDisabled = !isSelectable;\n\n\t// ── Accessible label ────────────────────────────────────────────────────────\n\tconst ariaLabel = new Intl.DateTimeFormat(locale, {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(utcMs));\n\n\t// ── Range half-fill classes ─────────────────────────────────────────────────\n\t// Range start → fill right half; Range end → fill left half; In range → full fill\n\tconst rangeHighlightClass = cn(\n\t\t\"absolute inset-y-0 bg-m3-secondary-container\",\n\t\tisStart && selectedEndMs !== null && \"left-1/2 right-0\",\n\t\tisEnd && selectedStartMs !== null && \"left-0 right-1/2\",\n\t\tisInRange && \"inset-x-0\",\n\t);\n\n\t// ── Day circle classes ──────────────────────────────────────────────────────\n\tconst circleClass = cn(\n\t\t\"relative z-10 flex items-center justify-center w-10 h-10 rounded-m3-full\",\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)]\",\n\t\t\"font-[number:var(--md-typescale-body-large-weight,400)]\",\n\t\t\"transition-m3-fast-effects\",\n\t\t// Selected (single) or range endpoints\n\t\t(isSelected || isStart || isEnd) && [\"bg-m3-primary\", \"text-m3-on-primary\"],\n\t\t// In-range text\n\t\tisInRange && \"text-m3-on-secondary-container\",\n\t\t// Today outline (only when not selected)\n\t\tisToday &&\n\t\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd && [\"outline outline-1 outline-m3-primary\", \"text-m3-primary\"],\n\t\t// Default text\n\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd &&\n\t\t\t!isInRange &&\n\t\t\t!isToday &&\n\t\t\t\"text-m3-on-surface\",\n\t\t// Hover states (only when selectable and not selected/range endpoints)\n\t\t!isDisabled &&\n\t\t\t!isSelected &&\n\t\t\t!isStart &&\n\t\t\t!isEnd && [\n\t\t\t\tisInRange\n\t\t\t\t\t? \"hover:bg-m3-on-secondary-container/8\"\n\t\t\t\t\t: \"hover:bg-m3-on-surface/8\",\n\t\t\t],\n\t\t// Disabled\n\t\tisDisabled && \"opacity-[0.38]\",\n\t);\n\n\tconst handleClick = React.useCallback(() => {\n\t\tif (isDisabled) return;\n\t\tonSelect(utcMs);\n\t}, [isDisabled, utcMs, onSelect]);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleClick();\n\t\t\t}\n\t\t},\n\t\t[handleClick],\n\t);\n\n\treturn (\n\t\t<td className=\"relative flex items-center justify-center\">\n\t\t\t{/* Range highlight background (full row width) */}\n\t\t\t{isRangePicker && (isInRange || isStart || isEnd) && (\n\t\t\t\t<div className={rangeHighlightClass} />\n\t\t\t)}\n\n\t\t\t{/* Day circle */}\n\t\t\t<m.button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tcircleClass,\n\t\t\t\t\tisDisabled && \"pointer-events-none cursor-not-allowed\",\n\t\t\t\t)}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-selected={isSelected || isStart || isEnd || undefined}\n\t\t\t\taria-disabled={isDisabled || undefined}\n\t\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\t\twhileTap={\n\t\t\t\t\t!isDisabled\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tscale: 0.94,\n\t\t\t\t\t\t\t\ttransition: DAY_CELL_STATE_TRANSITION,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{dayNum}\n\t\t\t</m.button>\n\t\t</td>\n\t);\n};\n\nDayCell.displayName = \"DayCell\";\n","/**\n * @file date-picker/subcomponents/weekday-row.tsx\n *\n * Header row displaying weekday names.\n * Locale-aware via Intl.DateTimeFormat.\n * Supports weekStartsOn = 0 (Sun) or 1 (Mon).\n */\n\nimport * as React from \"react\";\nimport { getWeekdayNames } from \"../../shared/calendar-model\";\nimport type { ResolvedDateLocale } from \"../../shared/types\";\n\ninterface WeekdayRowProps {\n\tlocale: ResolvedDateLocale;\n}\n\n/**\n * Weekday header row (Mon Tue Wed Thu Fri Sat Sun).\n * Locale-aware, following weekStartsOn configuration.\n */\n\nexport const WeekdayRow: React.FC<WeekdayRowProps> = ({ locale }) => {\n\tconst names = React.useMemo(() => getWeekdayNames(locale), [locale]);\n\n\treturn (\n\t\t<tr className=\"grid grid-cols-7 mb-1\">\n\t\t\t{names.map((name, i) => (\n\t\t\t\t<th\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable weekday order\n\t\t\t\t\tkey={i}\n\t\t\t\t\tscope=\"col\"\n\t\t\t\t\taria-label={name}\n\t\t\t\t\tclassName=\"flex items-center justify-center h-10 w-10 mx-auto\n\t\t\t\t\t\ttext-[length:var(--md-typescale-label-large-size,14px)]\n\t\t\t\t\t\tfont-[number:var(--md-typescale-label-large-weight,500)]\n\t\t\t\t\t\ttext-m3-on-surface\n\t\t\t\t\t\tselect-none\n\t\t\t\t\t\tfont-normal\"\n\t\t\t\t>\n\t\t\t\t\t{name}\n\t\t\t\t</th>\n\t\t\t))}\n\t\t</tr>\n\t);\n};\n\nWeekdayRow.displayName = \"WeekdayRow\";\n","/**\n * @file date-picker/subcomponents/calendar-grid.tsx\n *\n * 7-column calendar grid with slide animation during month navigation.\n * Uses AnimatePresence + direction-aware variants for smooth transitions.\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { CALENDAR_SLIDE_VARIANTS } from \"../../shared/animation-tokens\";\nimport { getWeeksInMonth } from \"../../shared/calendar-model\";\nimport type { ResolvedDateLocale, SelectableDates } from \"../../shared/types\";\nimport { DayCell } from \"./day-cell\";\nimport { WeekdayRow } from \"./weekday-row\";\n\ninterface CalendarGridProps {\n\t/** UTC ms of 1st day of month being displayed */\n\tdisplayedMonthMs: number;\n\t/** Navigation direction determining slide animation axis */\n\tslideDirection: \"prev\" | \"next\" | null;\n\tlocale: ResolvedDateLocale;\n\tselectableDates: SelectableDates;\n\tselectedMs: number | null;\n\tselectedStartMs?: number | null;\n\tselectedEndMs?: number | null;\n\tisRangePicker?: boolean;\n\tonDaySelect(ms: number): void;\n}\n\n/**\n * Calendar grid 6×7 with direction-aware slide animation.\n * Renders WeekdayRow + 6 day rows.\n */\n\nexport const CalendarGrid: React.FC<CalendarGridProps> = ({\n\tdisplayedMonthMs,\n\tslideDirection,\n\tlocale,\n\tselectableDates,\n\tselectedMs,\n\tselectedStartMs = null,\n\tselectedEndMs = null,\n\tisRangePicker = false,\n\tonDaySelect,\n}) => {\n\tconst d = new Date(displayedMonthMs);\n\tconst year = d.getUTCFullYear();\n\tconst month = d.getUTCMonth();\n\n\tconst weeks = React.useMemo(\n\t\t() => getWeeksInMonth(year, month, locale.weekStartsOn),\n\t\t[year, month, locale.weekStartsOn],\n\t);\n\n\tconst enterVariant =\n\t\tslideDirection === \"next\" ? \"enterFromRight\" : \"enterFromLeft\";\n\tconst exitVariant = slideDirection === \"next\" ? \"exitToLeft\" : \"exitToRight\";\n\n\treturn (\n\t\t<table className=\"w-full px-3 border-collapse block\">\n\t\t\t<thead className=\"block\">\n\t\t\t\t<WeekdayRow locale={locale} />\n\t\t\t</thead>\n\t\t\t<AnimatePresence initial={false} mode=\"popLayout\">\n\t\t\t\t<m.tbody\n\t\t\t\t\tkey={displayedMonthMs}\n\t\t\t\t\tvariants={CALENDAR_SLIDE_VARIANTS}\n\t\t\t\t\tinitial={slideDirection !== null ? enterVariant : false}\n\t\t\t\t\tanimate=\"center\"\n\t\t\t\t\texit={slideDirection !== null ? exitVariant : undefined}\n\t\t\t\t\tclassName=\"overflow-hidden block\"\n\t\t\t\t\taria-label={new Intl.DateTimeFormat(locale.locale, {\n\t\t\t\t\t\tyear: \"numeric\",\n\t\t\t\t\t\tmonth: \"long\",\n\t\t\t\t\t\ttimeZone: \"UTC\",\n\t\t\t\t\t}).format(new Date(displayedMonthMs))}\n\t\t\t\t>\n\t\t\t\t\t{weeks.map((week, weekIdx) => (\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable week index per month\n\t\t\t\t\t\t\tkey={weekIdx}\n\t\t\t\t\t\t\tclassName=\"grid grid-cols-7\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{week.map((day, dayIdx) =>\n\t\t\t\t\t\t\t\tday === null ? (\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: empty cells have no stable domain identifier\n\t\t\t\t\t\t\t\t\t\tkey={`empty-${weekIdx}-${dayIdx}`}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-10 h-10 mx-auto block\"\n\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<DayCell\n\t\t\t\t\t\t\t\t\t\tkey={day.utcMs}\n\t\t\t\t\t\t\t\t\t\tday={day}\n\t\t\t\t\t\t\t\t\t\tselectedMs={selectedMs}\n\t\t\t\t\t\t\t\t\t\tselectedStartMs={selectedStartMs}\n\t\t\t\t\t\t\t\t\t\tselectedEndMs={selectedEndMs}\n\t\t\t\t\t\t\t\t\t\tisRangePicker={isRangePicker}\n\t\t\t\t\t\t\t\t\t\tisSelectable={selectableDates.isSelectableDate(day.utcMs)}\n\t\t\t\t\t\t\t\t\t\tonSelect={onDaySelect}\n\t\t\t\t\t\t\t\t\t\tlocale={locale.locale}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t))}\n\t\t\t\t</m.tbody>\n\t\t\t</AnimatePresence>\n\t\t</table>\n\t);\n};\n\nCalendarGrid.displayName = \"CalendarGrid\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// Delays <animate> tag insertion by 1 frame via requestAnimationFrame\n\t// to bypass Chromium SMIL freezing bugs when parent container executes CSS transforms/animations.\n\n\tconst [ready, setReady] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tconst raf = requestAnimationFrame(() => setReady(true));\n\t\treturn () => cancelAnimationFrame(raf);\n\t}, []);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t>\n\t\t\t<path d={SHAPE_VALUES.split(\";\")[0]}>\n\t\t\t\t{ready && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={SHAPE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={SHAPE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={SHAPE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<animateTransform\n\t\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\t\tattributeType=\"XML\"\n\t\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={ROTATE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={ROTATE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={ROTATE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</path>\n\t\t</svg>\n\t);\n});\n\n// ─── Determinate SVG (React-controlled morph + counterclockwise rotation) ────\n// Uses CSS transition for smooth d attribute changes where supported (Chromium),\n// with a style-based transform fallback for rotation.\nconst DeterminateSvg = React.memo(function DeterminateSvg({\n\tsize,\n\tprogress,\n}: {\n\tsize: number;\n\tprogress: number;\n}) {\n\t// Clamp and interpolate progress between 0 (circle) and 1 (soft burst)\n\tconst p = Math.min(1, Math.max(0, progress));\n\n\t// Counterclockwise rotation: 0° at 0% → -180° at 100% (per Android spec)\n\tconst rotation = -180 * p;\n\n\t// The path morphs from circle (p=0) to soft-burst (p=1).\n\t// We use a SMIL animate with begin=\"indefinite\" that we snap to progress.\n\t// For maximum compatibility, render the correct endpoint shape based on progress,\n\t// relying on the CSS `d` property transition for smooth animation.\n\tconst pathD = p < 0.5 ? DETERMINATE_CIRCLE : DETERMINATE_SOFT_BURST;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tstyle={{\n\t\t\t\ttransform: `rotate(${rotation}deg)`,\n\t\t\t\ttransition: \"transform 0.3s ease\",\n\t\t\t}}\n\t\t>\n\t\t\t<path d={pathD} style={{ transition: \"d 0.3s ease\" }} />\n\t\t</svg>\n\t);\n});\n\n// ─── Main Component ───────────────────────────────────────────────────────────\nexport const LoadingIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tLoadingIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"uncontained\",\n\t\t\tsize = 48,\n\t\t\tprogress,\n\t\t\tcolor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isContained = variant === \"contained\";\n\t\tconst isDeterminate = progress !== undefined;\n\n\t\t// MD3 spec: strict size range [24dp, 240dp]\n\t\tconst clampedSize = Math.min(240, Math.max(24, size));\n\n\t\t// Proportional scaling based on the default 48dp spec size\n\t\tconst scaleFactor = clampedSize / 48;\n\n\t\t// MD3 spec: contained → 38dp container, 24dp active indicator\n\t\t// Ratio: 38/24 = 1.583 — preserved at all sizes\n\t\tconst containerSize = isContained ? 38 * scaleFactor : undefined;\n\t\tconst indicatorSize = isContained ? 24 * scaleFactor : clampedSize;\n\n\t\t// MD3 color tokens (with per-variant defaults)\n\t\tconst activeColor = isContained\n\t\t\t? (color ?? \"var(--md-sys-color-indicator-contained-active)\")\n\t\t\t: (color ?? \"var(--md-sys-color-indicator-active)\");\n\n\t\t// aria-valuenow is only set in determinate mode (per ARIA spec)\n\t\tconst ariaNow = isDeterminate\n\t\t\t? Math.round(Math.min(1, Math.max(0, progress)) * 100)\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuenow={ariaNow}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: clampedSize,\n\t\t\t\t\theight: clampedSize,\n\t\t\t\t\tcolor: activeColor,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{isContained ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-center rounded-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: containerSize,\n\t\t\t\t\t\t\theight: containerSize,\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\"var(--md-sys-color-indicator-contained-container)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : isDeterminate ? (\n\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t) : (\n\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n","export function easeInOutCubic(x: number): number {\n\treturn x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function generateWavyCircularPath(\n\tcenter: number,\n\tradius: number,\n\tamplitude: number,\n\twavelength: number,\n): string {\n\tconst circumference = 2 * Math.PI * radius;\n\tconst numWaves = Math.max(\n\t\t3,\n\t\tMath.round(circumference / Math.max(1, wavelength)),\n\t);\n\tconst steps = numWaves * 4;\n\tconst dt = (2 * Math.PI) / steps;\n\n\tconst rAt = (t: number) => radius + amplitude * Math.sin(numWaves * t);\n\tconst drAt = (t: number) => amplitude * numWaves * Math.cos(numWaves * t);\n\tconst xAt = (t: number) => center + rAt(t) * Math.cos(t);\n\tconst yAt = (t: number) => center + rAt(t) * Math.sin(t);\n\tconst dxAt = (t: number) => drAt(t) * Math.cos(t) - rAt(t) * Math.sin(t);\n\tconst dyAt = (t: number) => drAt(t) * Math.sin(t) + rAt(t) * Math.cos(t);\n\n\tlet d = \"\";\n\tconst tStart = 0;\n\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst t0 = tStart + i * dt;\n\t\tconst t1 = tStart + (i + 1) * dt;\n\n\t\tconst scale = dt / 3;\n\t\tconst cp1x = xAt(t0) + scale * dxAt(t0);\n\t\tconst cp1y = yAt(t0) + scale * dyAt(t0);\n\t\tconst cp2x = xAt(t1) - scale * dxAt(t1);\n\t\tconst cp2y = yAt(t1) - scale * dyAt(t1);\n\n\t\tif (i === 0) d += `M ${xAt(t0).toFixed(2)} ${yAt(t0).toFixed(2)}`;\n\t\td += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${xAt(t1).toFixed(2)} ${yAt(t1).toFixed(2)}`;\n\t}\n\td += \" Z\";\n\treturn d;\n}\n\nexport function getSinePath(\n\tstartX: number,\n\tendX: number,\n\tphase: number,\n\twl: number,\n\tamp: number,\n) {\n\tif (startX >= endX) return \"\";\n\tlet d = \"\";\n\tconst step = amp === 0 ? Math.max(10, endX - startX) : 1;\n\n\tconst yStart = Math.sin(((startX + phase) / wl) * 2 * Math.PI) * amp;\n\td += `M ${startX.toFixed(2)} ${yStart.toFixed(2)}`;\n\n\tlet nextX = Math.ceil(startX / step) * step;\n\tif (nextX === startX) nextX += step;\n\n\twhile (nextX < endX) {\n\t\tconst y = Math.sin(((nextX + phase) / wl) * 2 * Math.PI) * amp;\n\t\td += ` L ${nextX.toFixed(2)} ${y.toFixed(2)}`;\n\t\tnextX += step;\n\t}\n\n\tconst yEnd = Math.sin(((endX + phase) / wl) * 2 * Math.PI) * amp;\n\td += ` L ${endX.toFixed(2)} ${yEnd.toFixed(2)}`;\n\n\treturn d;\n}\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CircularProgressProps } from \"./types\";\nimport { generateWavyCircularPath } from \"./utils\";\n\nexport const CircularProgress = React.forwardRef<\n\tHTMLDivElement,\n\tCircularProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tsize = 48,\n\t\t\ttrackHeight = 4,\n\t\t\tshape = \"flat\",\n\t\t\tamplitude,\n\t\t\twavelength,\n\t\t\tgapSize = 4,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst radius = (size - trackHeight) / 2;\n\t\tconst center = size / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\tconst isWavy = shape === \"wavy\";\n\n\t\tconst BASELINE_SIZE = 48;\n\t\tconst scaleFactor = size / BASELINE_SIZE;\n\t\tconst effectiveAmplitude = React.useMemo(\n\t\t\t() => amplitude ?? 1.6 * scaleFactor,\n\t\t\t[amplitude, scaleFactor],\n\t\t);\n\t\tconst effectiveWavelength = React.useMemo(\n\t\t\t() => wavelength ?? 15 * scaleFactor,\n\t\t\t[wavelength, scaleFactor],\n\t\t);\n\n\t\tconst wavyActivePath = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisWavy\n\t\t\t\t\t? generateWavyCircularPath(\n\t\t\t\t\t\t\tcenter,\n\t\t\t\t\t\t\tradius,\n\t\t\t\t\t\t\teffectiveAmplitude,\n\t\t\t\t\t\t\teffectiveWavelength,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t[isWavy, center, radius, effectiveAmplitude, effectiveWavelength],\n\t\t);\n\n\t\tconst circumference = React.useMemo(() => 2 * Math.PI * radius, [radius]);\n\t\tconst gapForTrack = React.useMemo(\n\t\t\t() => (gapSize + trackHeight) / circumference,\n\t\t\t[gapSize, trackHeight, circumference],\n\t\t);\n\t\tconst activeAngularFraction = isDeterminate ? clampedValue / 100 : 0;\n\n\t\tconst trackOffset = isDeterminate ? activeAngularFraction + gapForTrack : 0;\n\t\tconst trackLength = isDeterminate\n\t\t\t? Math.max(0.001, 1 - activeAngularFraction - 2 * gapForTrack)\n\t\t\t: 1;\n\n\t\tconst ActiveCircleElem = m.circle;\n\t\tconst ActivePathElem = m.path;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{ transform: \"rotate(-90deg)\", overflow: \"visible\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tinitial={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\tanimate={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{isDeterminate &&\n\t\t\t\t\t\t\t(isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{!isDeterminate && (\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\t\trotate: \"-90deg\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{ rotate: [\"-90deg\", \"270deg\"] }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\trotate: {\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tpathLength: [\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.75 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\trotate: [\n\t\t\t\t\t\t\t\t\t\t`${(0.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.0 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.svg>\n\t\t\t\t\t)}\n\t\t\t\t</LazyMotion>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCircularProgress.displayName = \"CircularProgress\";\n","import * as React from \"react\";\n\nexport function useContainerWidth() {\n\tconst [width, setWidth] = React.useState(0);\n\tconst observerRef = React.useRef<ResizeObserver | null>(null);\n\n\tconst ref = React.useCallback((node: HTMLDivElement | null) => {\n\t\tif (observerRef.current) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\n\t\tif (node) {\n\t\t\tconst obs = new ResizeObserver((entries) => {\n\t\t\t\tconst contentRect = entries[0].contentRect;\n\t\t\t\tsetWidth(contentRect.width);\n\t\t\t});\n\t\t\tobs.observe(node);\n\t\t\tobserverRef.current = obs;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (observerRef.current) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn [ref, width] as const;\n}\n\nexport function useMergedRef<T>(\n\t...refs: (React.Ref<T> | undefined | null)[]\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\tfor (const ref of refs) {\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t\t(ref as React.MutableRefObject<T | null>).current = node;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[refs],\n\t);\n}\n","import { m } from \"motion/react\";\nimport * as React from \"react\";\n\nexport const FlatLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\tcrawlerSpeed: number;\n}>(function FlatLinearTrack({\n\ttrackHeight,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\tcrawlerSpeed,\n}) {\n\tconst isDeterminate = value !== undefined;\n\tconst radius = trackHeight / 2;\n\tconst minActiveWidth = trackHeight;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: trackHeight, borderRadius: radius }}\n\t\t>\n\t\t\t{isDeterminate ? (\n\t\t\t\t<>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: trackColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, 0%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, ${value}%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: activeColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\tminWidth: minActiveWidth,\n\t\t\t\t\t\t\t...(isRtl ? { right: 0 } : { left: 0 }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{ width: `${minActiveWidth}px` }}\n\t\t\t\t\t\tanimate={{ width: `${value}%` }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: trackColor, borderRadius: radius }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: activeColor, borderRadius: radius }}\n\t\t\t\t\t\tinitial={{ left: \"-40%\", width: \"40%\" }}\n\t\t\t\t\t\tanimate={{ left: [\"-40%\", \"100%\"], width: [\"40%\", \"20%\", \"40%\"] }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { animate, useAnimationFrame, useMotionValue } from \"motion/react\";\nimport * as React from \"react\";\nimport { useContainerWidth } from \"./hooks\";\nimport { easeInOutCubic, getSinePath } from \"./utils\";\n\nexport const WavyLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tsvgHeight: number;\n\tamplitude: number;\n\twavelength: number;\n\tindeterminateWavelength: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\twaveSpeed: number;\n\tcrawlerSpeed: number;\n\tdeterminateAnimation: \"md3\" | \"continuous\";\n\tindeterminateAnimation: \"md3\" | \"continuous\";\n\ttrackShape: \"flat\" | \"wavy\";\n}>(function WavyLinearTrack({\n\ttrackHeight,\n\tsvgHeight,\n\tamplitude,\n\twavelength,\n\tindeterminateWavelength,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\twaveSpeed,\n\tcrawlerSpeed,\n\tdeterminateAnimation,\n\tindeterminateAnimation,\n\ttrackShape,\n}) {\n\tconst isDeterminate = typeof value === \"number\";\n\tconst clampedValue = isDeterminate ? Math.max(0, Math.min(100, value)) : 100;\n\tconst titleId = React.useId();\n\n\tconst [containerRef, width] = useContainerWidth();\n\n\tconst activePathRef = React.useRef<SVGPathElement>(null);\n\tconst trackPathRef = React.useRef<SVGPathElement>(null);\n\n\tconst amplitudeMV = useMotionValue(amplitude);\n\tconst fractionMV = useMotionValue(isDeterminate ? clampedValue / 100 : 1);\n\n\tReact.useEffect(() => {\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = clampedValue / 100;\n\n\t\t\t// Handle Flattening Logic based on determinateAnimation prop\n\t\t\tlet targetAmp = amplitude;\n\t\t\tif (determinateAnimation === \"md3\") {\n\t\t\t\ttargetAmp = fraction <= 0.1 || fraction >= 0.95 ? 0 : amplitude;\n\t\t\t}\n\n\t\t\tanimate(amplitudeMV, targetAmp, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tbounce: 0,\n\t\t\t\tduration: 0.5,\n\t\t\t});\n\t\t\tanimate(fractionMV, fraction, { duration: 0.4, ease: [0.2, 0, 0, 1] });\n\t\t}\n\t}, [\n\t\tclampedValue,\n\t\tisDeterminate,\n\t\tamplitude,\n\t\tamplitudeMV,\n\t\tfractionMV,\n\t\tdeterminateAnimation,\n\t]);\n\n\tconst activeWavelength = Math.max(\n\t\t1,\n\t\tisDeterminate ? wavelength : indeterminateWavelength,\n\t);\n\tconst trackAmp = trackShape === \"wavy\" ? amplitude : 0;\n\n\tuseAnimationFrame((time) => {\n\t\tif (width === 0) return;\n\n\t\tconst currentAmp = amplitudeMV.get();\n\t\tconst phase = (time / 1000) * waveSpeed * activeWavelength;\n\t\tconst capWidth = trackHeight / 2;\n\n\t\tlet activePathD = \"\";\n\t\tlet trackD = \"\";\n\t\tconst totalGap = gapSize + trackHeight;\n\n\t\t// 1. DETERMINATE MODE\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = fractionMV.get();\n\t\t\tconst barHead = fraction * width;\n\n\t\t\tconst adjHead = Math.max(capWidth, Math.min(width - capWidth, barHead));\n\t\t\tconst adjTail = capWidth;\n\n\t\t\tif (fraction > 0 && adjHead - adjTail > 0.1) {\n\t\t\t\tactivePathD = getSinePath(\n\t\t\t\t\tadjTail,\n\t\t\t\t\tadjHead,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\tcurrentAmp,\n\t\t\t\t);\n\t\t\t} else if (fraction === 0) {\n\t\t\t\tactivePathD = `M ${capWidth} 0 L ${capWidth + 0.01} 0`;\n\t\t\t}\n\n\t\t\tconst trackStart = adjHead + totalGap;\n\t\t\tif (trackStart < width - capWidth) {\n\t\t\t\ttrackD = getSinePath(\n\t\t\t\t\ttrackStart,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// 2. INDETERMINATE MODE\n\t\telse {\n\t\t\tconst safeCrawlerSpeed = Math.max(0.1, crawlerSpeed);\n\t\t\tconst activeLines: { tail: number; head: number }[] = [];\n\n\t\t\tif (indeterminateAnimation === \"continuous\") {\n\t\t\t\tconst cycle = 2000 / safeCrawlerSpeed;\n\t\t\t\tconst fraction = (time % cycle) / cycle;\n\t\t\t\tactiveLines.push({\n\t\t\t\t\ttail: easeInOutCubic(Math.max(0, fraction * 1.5 - 0.5)),\n\t\t\t\t\thead: easeInOutCubic(Math.min(1, fraction * 1.5)),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cycle = 1750 / safeCrawlerSpeed;\n\t\t\t\tconst t = (time % cycle) * safeCrawlerSpeed;\n\n\t\t\t\tconst l1H = easeInOutCubic(Math.max(0, Math.min(1, t / 1000)));\n\t\t\t\tconst l1T = easeInOutCubic(Math.max(0, Math.min(1, (t - 250) / 1000)));\n\t\t\t\tconst l2H = easeInOutCubic(Math.max(0, Math.min(1, (t - 650) / 850)));\n\t\t\t\tconst l2T = easeInOutCubic(Math.max(0, Math.min(1, (t - 900) / 850)));\n\n\t\t\t\tactiveLines.push({ tail: l1T, head: l1H });\n\t\t\t\tactiveLines.push({ tail: l2T, head: l2H });\n\t\t\t}\n\n\t\t\tconst segments = activeLines\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst barTail = line.tail * width;\n\t\t\t\t\tconst barHead = line.head * width;\n\t\t\t\t\tconst adjTail = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barTail),\n\t\t\t\t\t);\n\t\t\t\t\tconst adjHead = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barHead),\n\t\t\t\t\t);\n\t\t\t\t\treturn { adjTail, adjHead };\n\t\t\t\t})\n\t\t\t\t.filter((seg) => seg.adjHead - seg.adjTail > 0.1);\n\n\t\t\tactivePathD = segments\n\t\t\t\t.map((seg) =>\n\t\t\t\t\tgetSinePath(\n\t\t\t\t\t\tseg.adjTail,\n\t\t\t\t\t\tseg.adjHead,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tactiveWavelength,\n\t\t\t\t\t\tcurrentAmp,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.join(\" \");\n\n\t\t\tlet currentTrackX = capWidth;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst trackEnd = seg.adjTail - totalGap;\n\t\t\t\tif (trackEnd > currentTrackX) {\n\t\t\t\t\ttrackD += `${getSinePath(currentTrackX, trackEnd, phase, activeWavelength, trackAmp)} `;\n\t\t\t\t}\n\t\t\t\tcurrentTrackX = Math.max(currentTrackX, seg.adjHead + totalGap);\n\t\t\t}\n\t\t\tif (currentTrackX < width - capWidth) {\n\t\t\t\ttrackD += getSinePath(\n\t\t\t\t\tcurrentTrackX,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (activePathRef.current)\n\t\t\tactivePathRef.current.setAttribute(\"d\", activePathD);\n\t\tif (trackPathRef.current)\n\t\t\ttrackPathRef.current.setAttribute(\"d\", trackD.trim());\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: svgHeight }}\n\t\t>\n\t\t\t{width > 0 && (\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"absolute inset-0 w-full h-full\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\ttransform: isRtl ? \"scaleX(-1)\" : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t>\n\t\t\t\t\t<title id={titleId}>\n\t\t\t\t\t\t{isDeterminate\n\t\t\t\t\t\t\t? `Progress: ${clampedValue}%`\n\t\t\t\t\t\t\t: \"Indeterminate loading progress\"}\n\t\t\t\t\t</title>\n\t\t\t\t\t<g transform={`translate(0, ${svgHeight / 2})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={trackPathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={trackColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={activePathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMergedRef } from \"./hooks\";\nimport { FlatLinearTrack } from \"./linear-flat\";\nimport { WavyLinearTrack } from \"./linear-wavy\";\nimport type { LinearProgressProps } from \"./types\";\n\nexport const LinearProgress = React.forwardRef<\n\tHTMLDivElement,\n\tLinearProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tshape = \"flat\",\n\t\t\ttrackShape,\n\t\t\ttrackHeight = 4,\n\t\t\tamplitude,\n\t\t\twavelength = 40,\n\t\t\tindeterminateWavelength = 20,\n\t\t\twaveSpeed = 1,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tdeterminateAnimation = \"md3\",\n\t\t\tindeterminateAnimation = \"continuous\",\n\t\t\tgapSize = 4,\n\t\t\tshowStopIndicator = \"auto\",\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, containerRef);\n\t\tconst [isRtl, setIsRtl] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (containerRef.current) {\n\t\t\t\tconst dir = getComputedStyle(containerRef.current).direction;\n\t\t\t\tsetIsRtl(dir === \"rtl\");\n\t\t\t}\n\t\t}, []);\n\n\t\tconst isWavy = shape === \"wavy\";\n\t\tconst resolvedTrackShape = trackShape ?? shape;\n\n\t\tconst effectiveAmplitude = React.useMemo(() => amplitude ?? 3, [amplitude]);\n\t\tconst svgHeight = React.useMemo(\n\t\t\t() => (isWavy ? trackHeight + effectiveAmplitude * 2 : trackHeight),\n\t\t\t[isWavy, trackHeight, effectiveAmplitude],\n\t\t);\n\n\t\tconst shouldShowStop = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisDeterminate &&\n\t\t\t\tresolvedTrackShape === \"flat\" &&\n\t\t\t\t(showStopIndicator === true ||\n\t\t\t\t\t(showStopIndicator === \"auto\" && isDeterminate)),\n\t\t\t[isDeterminate, resolvedTrackShape, showStopIndicator],\n\t\t);\n\n\t\tconst stopSize = React.useMemo(\n\t\t\t() => Math.max(2, trackHeight > 4 ? 4 : trackHeight / 2),\n\t\t\t[trackHeight],\n\t\t);\n\n\t\tconst stopOffset = (trackHeight - stopSize) / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex w-full flex-col justify-center\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: svgHeight }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t<WavyLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tsvgHeight={svgHeight}\n\t\t\t\t\t\t\tamplitude={effectiveAmplitude}\n\t\t\t\t\t\t\twavelength={wavelength}\n\t\t\t\t\t\t\tindeterminateWavelength={indeterminateWavelength}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\twaveSpeed={waveSpeed}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t\tdeterminateAnimation={determinateAnimation}\n\t\t\t\t\t\t\tindeterminateAnimation={indeterminateAnimation}\n\t\t\t\t\t\t\ttrackShape={resolvedTrackShape}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlatLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowStop && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute rounded-full\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: stopSize,\n\t\t\t\t\t\t\t\theight: stopSize,\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-indicator-stop)\",\n\t\t\t\t\t\t\t\ttop: svgHeight / 2 - stopSize / 2,\n\t\t\t\t\t\t\t\t...(isRtl ? { left: stopOffset } : { right: stopOffset }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nLinearProgress.displayName = \"LinearProgress\";\n","import * as React from \"react\";\nimport { CircularProgress } from \"./circular\";\nimport { LinearProgress } from \"./linear\";\nimport type { ProgressIndicatorProps } from \"./types\";\n\n/**\n * Progress Indicator component based on Material Design 3 Expressive guidelines.\n * Flexible support for 2 presentation variants: Linear and Circular,\n * with smooth dynamic Wavy shape profiles.\n *\n * @example\n * ```tsx\n * // Determinate Flat Linear\n * <ProgressIndicator variant=\"linear\" value={60} aria-label=\"Loading profile...\" />\n *\n * // Indeterminate Wavy Linear\n * <ProgressIndicator variant=\"linear\" shape=\"wavy\" aria-label=\"Connecting to server...\" />\n *\n * // Determinate Flat Circular\n * <ProgressIndicator variant=\"circular\" value={45} size={48} aria-label=\"Syncing...\" />\n * ```\n */\n\nexport const ProgressIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tProgressIndicatorProps\n>((props, ref) => {\n\tif (props.variant === \"circular\") {\n\t\treturn <CircularProgress ref={ref} {...props} />;\n\t}\n\treturn <LinearProgress ref={ref} {...props} />;\n});\n\nProgressIndicator.displayName = \"ProgressIndicator\";\n\nexport type {\n\tCircularProgressProps,\n\tLinearProgressProps,\n\tProgressIndicatorProps,\n} from \"./types\";\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.max(\n\t\t\t\tMath.hypot(rect.width, rect.height) * 2.5,\n\t\t\t\t320,\n\t\t\t);\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","/**\n * @file shared/constants.ts\n *\n * Shared animation constants for MD3 Expressive UI components.\n * Centralises spring transition configs and motion variant objects to avoid\n * duplication across button, icon-button, FAB, and other interactive components.\n *\n * @see https://m3.material.io/foundations/animation/overview\n */\n\nimport type { Target, TargetAndTransition, Transition } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n} from \"./motion-tokens\";\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tgetMotionSpring,\n\tgetMotionTransitionCSS,\n\tSLOW_EFFECTS_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"./motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast spring — used for border-radius morphing, icon swaps.\n * Maps to MD3 `fast.effects` (critically damped, stiffness 3800).\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Standard spring — used for icon/content scale animations.\n * Maps to MD3 `default.effects` (critically damped, stiffness 1600).\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = DEFAULT_EFFECTS_SPRING;\n\n/**\n * MD3 Expressive spring — active indicator expand/collapse.\n * Maps to MD3 `default.spatial` (dampingRatio: 0.8, stiffness: 380).\n * Gentle bounce for the \"pop\" effect per MD3 Expressive spec.\n */\nexport const SPRING_TRANSITION_EXPRESSIVE: Transition = DEFAULT_SPATIAL_SPRING;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon Span Motion Variants\n// Used for icon/loading indicator swap animation inside FAB and IconButton.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Framer Motion variants for animating icon spans in/out.\n *\n * Scale from near-zero → 1 on enter; back to near-zero on exit.\n * The near-zero value (0.01) avoids the SMIL freeze bug on Chromium\n * that occurs when an element starts at exactly `scale(0)`.\n *\n * @example\n * ```tsx\n * <AnimatePresence mode=\"wait\">\n * {loading ? (\n * <m.span key=\"loading\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * <LoadingIndicator />\n * </m.span>\n * ) : (\n * <m.span key=\"icon\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * {icon}\n * </m.span>\n * )}\n * </AnimatePresence>\n * ```\n */\nexport const ICON_SPAN_VARIANTS: {\n\tinitial: Target;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { scale: 0.01 },\n\tanimate: { scale: 1 },\n\texit: { scale: 0.01 },\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 TextField Animation Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Standard easing curve — used for label float, active indicator expand.\n * cubic-bezier(0.2, 0, 0, 1)\n *\n * @see https://m3.material.io/foundations/animation/easing-and-duration\n */\nexport const MD3_STANDARD_EASING: [number, number, number, number] = [\n\t0.2, 0, 0, 1,\n];\n\n/**\n * Duration for floating label transition: 150ms.\n * Used when label moves between inline position ↔ floated position.\n */\nexport const MD3_LABEL_FLOAT_DURATION = 0.15;\n\n/**\n * Duration for active indicator expand/collapse: 200ms.\n * Used for the bottom border (filled) and outline (outlined) on focus.\n */\nexport const MD3_INDICATOR_DURATION = 0.2;\n\n/**\n * Duration for supporting text / error text appear/disappear: 120ms.\n */\nexport const MD3_SUPPORTING_DURATION = 0.12;\n\n/**\n * Duration for trailing icon appear/disappear (clear button, password toggle): 100ms.\n */\nexport const MD3_ICON_SWAP_DURATION = 0.1;\n","/**\n * @file shared/touch-target.tsx\n *\n * Invisible 48×48dp touch-target expander for small interactive elements.\n *\n * WCAG 2.5.5 (Level AA) requires interactive targets to be at least 44×44 CSS pixels.\n * MD3 specifies a minimum 48dp touch target for all interactive components.\n * For button sizes XS (32dp) and SM (40dp) that are smaller than this minimum,\n * an invisible absolutely-positioned `<span>` is overlaid to extend the\n * effective tap area without affecting visual layout.\n *\n * @see https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n * @see https://m3.material.io/foundations/accessible-design/accessibility-basics\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TouchTarget Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invisible 48×48dp touch area expander — satisfies WCAG 2.5.5 + MD3 spec.\n *\n * Place as a direct child of any interactive element whose visual size is\n * smaller than 48dp (e.g. `xs`/`sm` buttons and icon buttons).\n * The parent element **must** have `position: relative`.\n *\n * @remarks\n * - Hidden from assistive technologies via `aria-hidden=\"true\"`.\n * - `pointer-events: none` ensures it does not intercept click events.\n * - Centred with `left: 50% / top: 50%` + negative translate for symmetry.\n *\n * @example\n * ```tsx\n * // Used inside a 32dp XS button:\n * <button className=\"relative h-8 w-auto ...\">\n * <TouchTarget />\n * Label\n * </button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/specs (Touch target section)\n */\nexport function TouchTarget() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 min-w-12 min-h-12 cursor-pointer pointer-events-none\"\n\t\t/>\n\t);\n}\n","/**\n * @file icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SIZE_HEIGHT_STYLES: Record<string, string> = {\n\txs: \"h-8\",\n\tsm: \"h-10\",\n\tmd: \"h-14\",\n\tlg: \"h-24\",\n\txl: \"h-[8.5rem]\",\n};\n\n/**\n * Per-size container width variants (Tailwind utility classes).\n * MD3 Expressive width variants: default (1:1), narrow, wide.\n * @internal\n */\nconst WIDTH_SIZE_STYLES: Record<string, Record<string, string>> = {\n\txs: {\n\t\tdefault: \"w-8\",\n\t\tnarrow: \"w-8\",\n\t\twide: \"w-12\",\n\t},\n\tsm: {\n\t\tdefault: \"w-10\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[3.25rem]\",\n\t},\n\tmd: {\n\t\tdefault: \"w-14\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[4.5rem]\",\n\t},\n\tlg: {\n\t\tdefault: \"w-24\",\n\t\tnarrow: \"w-16\",\n\t\twide: \"w-32\",\n\t},\n\txl: {\n\t\tdefault: \"w-[8.5rem]\",\n\t\tnarrow: \"w-[6.5rem]\",\n\t\twide: \"w-[11.5rem]\",\n\t},\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container width variant following MD3 Expressive specification.\n\t * - `default`: 1:1 aspect ratio square/round container.\n\t * - `narrow`: compressed width.\n\t * - `wide`: extended width.\n\t * @default \"default\"\n\t */\n\twidthVariant?: \"default\" | \"narrow\" | \"wide\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * An optional icon to display when the icon button is in a selected toggle state (`variant=\"toggle\"` and `selected={true}`).\n\t * If omitted, falls back to `children`.\n\t */\n\tselectedIcon?: React.ReactNode;\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n\t/**\n\t * Change the component to the underlying child element and merge props/behavior.\n\t * Useful when wrapping in Next.js `<Link>` or custom anchor tags.\n\t * @default false\n\t */\n\tasChild?: boolean;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\twidthVariant = \"default\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tselectedIcon,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\tconst heightClass = SIZE_HEIGHT_STYLES[size] ?? SIZE_HEIGHT_STYLES.sm;\n\t\tconst widthClass =\n\t\t\t(WIDTH_SIZE_STYLES[size] ?? WIDTH_SIZE_STYLES.sm)[widthVariant] ??\n\t\t\tWIDTH_SIZE_STYLES.sm.default;\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey={isSelected && selectedIcon ? \"selected-content\" : \"content\"}\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelected && selectedIcon\n\t\t\t\t\t\t\t\t? selectedIcon\n\t\t\t\t\t\t\t\t: asChild\n\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\tReact.Children.only(children) as React.ReactElement<{\n\t\t\t\t\t\t\t\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t).props.children\n\t\t\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst containerClassName = cn(\n\t\t\tbaseIconButtonClasses,\n\t\t\tresolvedColorClass,\n\t\t\toutlineWidthClass,\n\t\t\tdisabledBgClass,\n\t\t\t\"overflow-hidden\",\n\t\t\theightClass,\n\t\t\twidthClass,\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(style as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t{...(restProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SPRING_TRANSITION_FAST } from \"./shared/constants\";\n\n// @internal — font must be loaded via '@bug-on/m3-expressive/material-symbols.css'\nconst VARIANT_FONT: Record<NonNullable<IconProps[\"variant\"]>, string> = {\n\toutlined: \"'Material Symbols Outlined'\",\n\trounded: \"'Material Symbols Rounded'\",\n\tsharp: \"'Material Symbols Sharp'\",\n};\n\n/**\n * Props cho component {@link Icon}.\n *\n * All variable font axes are mapped directly to `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Name of the Material Symbol in snake_case format.\n\t * @example \"home\", \"arrow_forward\", \"settings\"\n\t * @see https://fonts.google.com/icons\n\t */\n\tname: string;\n\n\t/**\n\t * Geometric style variant — maps to font family.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * `FILL` axis. `0` = outlined, `1` = filled.\n\t * Features spring animation when `animateFill` is true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * `wght` axis — stroke weight. Should match surrounding text weight.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * `GRAD` axis — fine-tunes visual weight without affecting layout dimensions.\n\t * Use `-25` on dark backgrounds to offset light halation effects.\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * `opsz` axis — optical size in dp. Used to set `font-size` if `size` is not specified.\n\t * Match rendered pixel size for best quality.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Direct `font-size` override in px. `opsz` axis still respects `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * Enables smooth spring animation when toggling FILL axis (uses `SPRING_TRANSITION_FAST`).\n\t * Requires `motion` dependency.\n\t * @default false\n\t * @example <Icon name=\"favorite\" fill={isLiked ? 1 : 0} animateFill />\n\t */\n\tanimateFill?: boolean;\n}\n\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvariant = \"outlined\",\n\t\t\tfill = 0,\n\t\t\tweight = 400,\n\t\t\tgrade = 0,\n\t\t\topticalSize = 24,\n\t\t\tsize,\n\t\t\tanimateFill = false,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst fontVariationSettings = `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' ${opticalSize}`;\n\n\t\tconst computedStyle: React.CSSProperties = {\n\t\t\tfontFamily: VARIANT_FONT[variant],\n\t\t\tfontSize:\n\t\t\t\tsize === \"inherit\"\n\t\t\t\t\t? \"inherit\"\n\t\t\t\t\t: size != null\n\t\t\t\t\t\t? `${size}px`\n\t\t\t\t\t\t: `${opticalSize}px`,\n\t\t\tfontVariationSettings,\n\t\t\t...style,\n\t\t};\n\n\t\tif (animateFill) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tanimate={{ fontVariationSettings }}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION_FAST}\n\t\t\t\t\t\tstyle={computedStyle}\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: motion v12 HTMLMotionProps conflicts with React's event types\n\t\t\t\t\t\t{...(restProps as any)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</m.span>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={computedStyle}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t);\n\t},\n);\n\nIconComponent.displayName = \"Icon\";\n\n/**\n * Material Symbols (variable font) Icon component.\n *\n * Make sure to import the icon font CSS before usage:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols-cdn.css';\n * ```\n *\n * @remarks\n * - Use snake_case for icon names: `\"arrow_forward\"`, NOT `\"ArrowForward\"`.\n * - `aria-hidden=\"true\"` is attached automatically — provide screen reader labels on parent elements.\n *\n * @example\n * ```tsx\n * // Basic Icon\n * <Icon name=\"home\" />\n *\n * // Visual customization (filled, heavy weight)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animated transition on state change\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // Custom size override\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Combination with other components\n * <Button icon={<Icon name=\"add\" />}>Add to cart</Button>\n * ```\n *\n * @see https://fonts.google.com/icons\n * @see https://m3.material.io/styles/icons/overview\n */\nexport const Icon = React.memo(IconComponent);\n","/**\n * Calendar header with independent month and year selectors.\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { IconButton } from \"../../../buttons/icon-button\";\nimport { Icon } from \"../../../icon\";\nimport { formatMonthYear } from \"../../shared/calendar-model\";\nimport type { DisplayMode, ResolvedDateLocale } from \"../../shared/types\";\n\nexport type CalendarSelector = \"month\" | \"year\" | null;\n\ninterface CalendarHeaderProps {\n\tdisplayedMonthMs: number;\n\tactiveSelector: CalendarSelector;\n\tdisplayMode: DisplayMode;\n\tshowModeToggle: boolean;\n\ttitle: React.ReactNode;\n\theadline: React.ReactNode;\n\tlocale: ResolvedDateLocale;\n\tcanNavigatePrev: boolean;\n\tcanNavigateNext: boolean;\n\tcanNavigatePreviousYear: boolean;\n\tcanNavigateNextYear: boolean;\n\tonPrev(): void;\n\tonNext(): void;\n\tonPreviousYear(): void;\n\tonNextYear(): void;\n\tonToggleSelector(selector: Exclude<CalendarSelector, null>): void;\n\tonToggleMode(): void;\n}\n\nconst selectorClassName =\n\t\"flex items-center gap-1 rounded-m3-full px-2 py-1 text-[length:var(--md-typescale-title-small-size,14px)] font-[number:var(--md-typescale-title-small-weight,500)] text-m3-on-surface transition-m3-fast-effects hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\";\n\nexport const CalendarHeader: React.FC<CalendarHeaderProps> = ({\n\tdisplayedMonthMs,\n\tactiveSelector,\n\tdisplayMode,\n\tshowModeToggle,\n\ttitle,\n\theadline,\n\tlocale,\n\tcanNavigatePrev,\n\tcanNavigateNext,\n\tcanNavigatePreviousYear,\n\tcanNavigateNextYear,\n\tonPrev,\n\tonNext,\n\tonPreviousYear,\n\tonNextYear,\n\tonToggleSelector,\n\tonToggleMode,\n}) => {\n\tconst date = new Date(displayedMonthMs);\n\tconst monthLabel = new Intl.DateTimeFormat(locale.locale, {\n\t\tmonth: \"short\",\n\t\ttimeZone: \"UTC\",\n\t}).format(date);\n\tconst yearLabel = String(date.getUTCFullYear());\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1 px-6 pb-4 pt-5\">\n\t\t\t<div className=\"text-(length:--md-typescale-label-large-size,14px) font-(--md-typescale-label-large-weight,500) text-m3-on-surface-variant\">\n\t\t\t\t{title}\n\t\t\t</div>\n\t\t\t<div className=\"mb-2 leading-tight text-(length:--md-typescale-headline-large-size,32px) font-(--md-typescale-headline-large-weight,400) text-m3-on-surface-variant\">\n\t\t\t\t{headline}\n\t\t\t</div>\n\n\t\t\t{displayMode === \"picker\" && (\n\t\t\t\t<div className=\"flex min-h-10 items-center gap-0.5\">\n\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tonClick={onPrev}\n\t\t\t\t\t\t\taria-label=\"Previous month\"\n\t\t\t\t\t\t\tdisabled={!canNavigatePrev}\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"chevron_left\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onToggleSelector(\"month\")}\n\t\t\t\t\t\taria-expanded={activeSelector === \"month\"}\n\t\t\t\t\t\taria-controls=\"date-picker-selection\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tselectorClassName,\n\t\t\t\t\t\t\tactiveSelector === \"month\" && \"bg-m3-on-surface/8\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{monthLabel}\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname=\"arrow_drop_down\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-[20px] transition-transform duration-200\",\n\t\t\t\t\t\t\t\tactiveSelector === \"month\" && \"rotate-180\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tonClick={onNext}\n\t\t\t\t\t\t\taria-label=\"Next month\"\n\t\t\t\t\t\t\tdisabled={!canNavigateNext}\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon name=\"chevron_right\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"ml-auto flex items-center gap-0.5\">\n\t\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onPreviousYear}\n\t\t\t\t\t\t\t\taria-label=\"Previous year\"\n\t\t\t\t\t\t\t\tdisabled={!canNavigatePreviousYear}\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_left\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onToggleSelector(\"year\")}\n\t\t\t\t\t\t\taria-expanded={activeSelector === \"year\"}\n\t\t\t\t\t\t\taria-controls=\"date-picker-selection\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tselectorClassName,\n\t\t\t\t\t\t\t\tactiveSelector === \"year\" && \"bg-m3-on-surface/8\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{yearLabel}\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tname=\"arrow_drop_down\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-[20px] transition-transform duration-200\",\n\t\t\t\t\t\t\t\t\tactiveSelector === \"year\" && \"rotate-180\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{activeSelector === null && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onNextYear}\n\t\t\t\t\t\t\t\taria-label=\"Next year\"\n\t\t\t\t\t\t\t\tdisabled={!canNavigateNextYear}\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_right\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showModeToggle && (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tonClick={onToggleMode}\n\t\t\t\t\t\t\t\taria-label=\"Switch to text input\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"keyboard\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{displayMode === \"input\" && showModeToggle && (\n\t\t\t\t<IconButton\n\t\t\t\t\tonClick={onToggleMode}\n\t\t\t\t\taria-label=\"Switch to calendar\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tclassName=\"self-end\"\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"calendar_month\" />\n\t\t\t\t</IconButton>\n\t\t\t)}\n\t\t\t<span className=\"sr-only\">\n\t\t\t\t{formatMonthYear(displayedMonthMs, locale)}\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nCalendarHeader.displayName = \"CalendarHeader\";\n","/**\n * Scrollable month selector used by the calendar header.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { Icon } from \"../../../icon\";\nimport type { ResolvedDateLocale } from \"../../shared/types\";\n\ninterface MonthPickerListProps {\n\tselectedMonth: number;\n\tlocale: ResolvedDateLocale;\n\tonMonthSelect(month: number): void;\n}\n\nconst getMonthLabel = (month: number, locale: string): string =>\n\tnew Intl.DateTimeFormat(locale, {\n\t\tmonth: \"long\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(Date.UTC(2025, month, 1)));\n\nexport const MonthPickerList: React.FC<MonthPickerListProps> = ({\n\tselectedMonth,\n\tlocale,\n\tonMonthSelect,\n}) => {\n\tconst selectedRef = React.useRef<HTMLButtonElement>(null);\n\n\tReact.useEffect(() => {\n\t\tselectedRef.current?.scrollIntoView?.({\n\t\t\tblock: \"center\",\n\t\t\tbehavior: \"instant\",\n\t\t});\n\t}, []);\n\n\tconst months = React.useMemo(\n\t\t() => Array.from({ length: 12 }, (_, month) => month),\n\t\t[],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full min-h-[240px] overflow-y-auto py-2\"\n\t\t\trole=\"listbox\"\n\t\t\taria-label=\"Select month\"\n\t\t>\n\t\t\t{months.map((month) => {\n\t\t\t\tconst isSelected = month === selectedMonth;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={month}\n\t\t\t\t\t\tref={isSelected ? selectedRef : undefined}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\tonClick={() => onMonthSelect(month)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex min-h-12 w-full items-center gap-4 px-6 text-left\",\n\t\t\t\t\t\t\t\"text-[length:var(--md-typescale-body-large-size,16px)]\",\n\t\t\t\t\t\t\t\"text-m3-on-surface transition-m3-fast-effects\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\",\n\t\t\t\t\t\t\tisSelected &&\n\t\t\t\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"w-6\" aria-hidden>\n\t\t\t\t\t\t\t{isSelected && <Icon name=\"check\" className=\"text-[20px]\" />}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{getMonthLabel(month, locale.locale)}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nMonthPickerList.displayName = \"MonthPickerList\";\n","/**\n * Scrollable, responsive year selector used by the calendar header.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { Icon } from \"../../../icon\";\nimport { isYearSelectable } from \"../../shared/calendar-model\";\nimport type { SelectableDates } from \"../../shared/types\";\n\ninterface YearPickerListProps {\n\tselectedYear: number;\n\tyearRange: [number, number];\n\tselectableDates: SelectableDates;\n\tonYearSelect(year: number): void;\n}\n\nexport const YearPickerList: React.FC<YearPickerListProps> = ({\n\tselectedYear,\n\tyearRange,\n\tselectableDates,\n\tonYearSelect,\n}) => {\n\tconst selectedRef = React.useRef<HTMLButtonElement>(null);\n\tconst years = React.useMemo(() => {\n\t\tconst [min, max] = yearRange;\n\t\treturn Array.from({ length: max - min + 1 }, (_, index) => min + index);\n\t}, [yearRange]);\n\n\tReact.useEffect(() => {\n\t\tselectedRef.current?.scrollIntoView?.({\n\t\t\tblock: \"center\",\n\t\t\tbehavior: \"instant\",\n\t\t});\n\t}, []);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full min-h-[240px] overflow-y-auto py-2\"\n\t\t\trole=\"listbox\"\n\t\t\taria-label=\"Select year\"\n\t\t>\n\t\t\t{years.map((year) => {\n\t\t\t\tconst isSelected = year === selectedYear;\n\t\t\t\tconst isSelectable = isYearSelectable(year, selectableDates);\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={year}\n\t\t\t\t\t\tref={isSelected ? selectedRef : undefined}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\taria-disabled={!isSelectable || undefined}\n\t\t\t\t\t\tdisabled={!isSelectable}\n\t\t\t\t\t\tonClick={() => onYearSelect(year)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex min-h-12 w-full items-center gap-4 px-6 text-left\",\n\t\t\t\t\t\t\t\"text-[length:var(--md-typescale-body-large-size,16px)]\",\n\t\t\t\t\t\t\t\"text-m3-on-surface transition-m3-fast-effects\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8 focus-visible:outline-2 focus-visible:outline-m3-primary\",\n\t\t\t\t\t\t\tisSelected &&\n\t\t\t\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\t\t\t\t!isSelectable && \"cursor-not-allowed opacity-[0.38]\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"w-6\" aria-hidden>\n\t\t\t\t\t\t\t{isSelected && <Icon name=\"check\" className=\"text-[20px]\" />}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{year}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n};\n\nYearPickerList.displayName = \"YearPickerList\";\n","/**\n * @file date-picker/date-picker.tsx\n *\n * DatePicker — calendar UI component (excluding dialog wrapper).\n * Equivalent to `DatePicker` composable in Android Compose Material3.\n *\n * Layout:\n * CalendarHeader (title, headline, month nav)\n * ↓\n * CalendarGrid | YearPickerGrid (AnimatePresence toggle)\n * ↓\n * DatePickerInput (when displayMode === 'input')\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { PICKER_SELECTOR_ANIM } from \"../shared/animation-tokens\";\nimport {\n\tformatDate,\n\tgetNavigableMonth,\n\tisMonthNavigable,\n} from \"../shared/calendar-model\";\nimport type { DatePickerProps } from \"./date-picker.types\";\nimport { DatePickerInput } from \"./date-picker-input\";\nimport { CalendarGrid } from \"./subcomponents/calendar-grid\";\nimport {\n\tCalendarHeader,\n\ttype CalendarSelector,\n} from \"./subcomponents/calendar-header\";\nimport { MonthPickerList } from \"./subcomponents/month-picker-list\";\nimport { YearPickerList } from \"./subcomponents/year-picker-list\";\n\n/** Format UTC ms → \"MM/DD/YYYY\" for input sync */\nconst formatInputDate = (ms: number): string =>\n\tnew Intl.DateTimeFormat(\"en-US\", {\n\t\tmonth: \"2-digit\",\n\t\tday: \"2-digit\",\n\t\tyear: \"numeric\",\n\t\ttimeZone: \"UTC\",\n\t}).format(new Date(ms));\n\n/**\n * DatePicker calendar UI.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({ locale: { locale: 'en-US' } });\n *\n * <DatePicker\n * state={state}\n * showModeToggle\n * title=\"Select date\"\n * />\n * ```\n */\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n\tstate,\n\tshowModeToggle = true,\n\ttitle,\n\theadline,\n\tclassName,\n}) => {\n\tconst {\n\t\tselectedDateMs,\n\t\tdisplayedMonthMs,\n\t\tdisplayMode,\n\t\tyearRange,\n\t\tlocale,\n\t\tselectableDates,\n\t\tselectDate,\n\t\tnavigateMonth,\n\t\tnavigateToMonth,\n\t\tsetDisplayMode,\n\t} = state;\n\n\tconst [activeSelector, setActiveSelector] =\n\t\tReact.useState<CalendarSelector>(null);\n\n\t// ── Navigation direction tracking ────────────────────────────────────────────\n\tconst [slideDirection, setSlideDirection] = React.useState<\n\t\t\"prev\" | \"next\" | null\n\t>(null);\n\n\tconst handlePrev = React.useCallback(() => {\n\t\tsetSlideDirection(\"prev\");\n\t\tnavigateMonth(\"prev\");\n\t}, [navigateMonth]);\n\n\tconst handleNext = React.useCallback(() => {\n\t\tsetSlideDirection(\"next\");\n\t\tnavigateMonth(\"next\");\n\t}, [navigateMonth]);\n\n\tconst handleYearSelect = React.useCallback(\n\t\t(year: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(year, d.getUTCMonth());\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\tconst handleMonthSelect = React.useCallback(\n\t\t(month: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(d.getUTCFullYear(), month);\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\t// ── Input mode state ─────────────────────────────────────────────────────────\n\tconst [inputValue, setInputValue] = React.useState(() =>\n\t\tselectedDateMs !== null ? formatInputDate(selectedDateMs) : \"\",\n\t);\n\tconst [inputError, setInputError] = React.useState<string | undefined>();\n\n\tconst handleInputCommit = React.useCallback(\n\t\t(ms: number | null) => {\n\t\t\tif (ms === null && inputValue.length > 0) {\n\t\t\t\tsetInputError(\"Invalid date\");\n\t\t\t} else {\n\t\t\t\tsetInputError(undefined);\n\t\t\t\tselectDate(ms);\n\t\t\t}\n\t\t},\n\t\t[inputValue, selectDate],\n\t);\n\n\t// ── Default title / headline ─────────────────────────────────────────────────\n\tconst resolvedTitle = title ?? \"Select date\";\n\tconst resolvedHeadline =\n\t\theadline ??\n\t\t(selectedDateMs !== null\n\t\t\t? formatDate(selectedDateMs, locale, {\n\t\t\t\t\tweekday: \"short\",\n\t\t\t\t\tmonth: \"short\",\n\t\t\t\t\tday: \"numeric\",\n\t\t\t\t\ttimeZone: \"UTC\",\n\t\t\t\t})\n\t\t\t: \"—\");\n\n\t// ── Current year ─────────────────────────────────────────────────────────────\n\tconst currentYear = new Date(displayedMonthMs).getUTCFullYear();\n\tconst currentMonth = new Date(displayedMonthMs).getUTCMonth();\n\tconst computedAriaLabel =\n\t\ttypeof resolvedTitle === \"string\" ? resolvedTitle : \"Date picker\";\n\tconst canNavigatePrev =\n\t\tgetNavigableMonth(displayedMonthMs, \"prev\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigateNext =\n\t\tgetNavigableMonth(displayedMonthMs, \"next\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigatePreviousYear = isMonthNavigable(\n\t\tcurrentYear - 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\tconst canNavigateNextYear = isMonthNavigable(\n\t\tcurrentYear + 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={cn(\"flex flex-col select-none\", className)}\n\t\t\tstyle={{ width: \"min(100%, 360px)\" }}\n\t\t\taria-label={computedAriaLabel}\n\t\t>\n\t\t\t<legend className=\"sr-only\">{computedAriaLabel}</legend>\n\t\t\t{/* Header */}\n\t\t\t<CalendarHeader\n\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\tactiveSelector={activeSelector}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t\tshowModeToggle={showModeToggle}\n\t\t\t\ttitle={resolvedTitle}\n\t\t\t\theadline={resolvedHeadline}\n\t\t\t\tlocale={locale}\n\t\t\t\tcanNavigatePrev={canNavigatePrev}\n\t\t\t\tcanNavigateNext={canNavigateNext}\n\t\t\t\tcanNavigatePreviousYear={canNavigatePreviousYear}\n\t\t\t\tcanNavigateNextYear={canNavigateNextYear}\n\t\t\t\tonPrev={handlePrev}\n\t\t\t\tonNext={handleNext}\n\t\t\t\tonPreviousYear={() => navigateToMonth(currentYear - 1, currentMonth)}\n\t\t\t\tonNextYear={() => navigateToMonth(currentYear + 1, currentMonth)}\n\t\t\t\tonToggleSelector={(selector) =>\n\t\t\t\t\tsetActiveSelector((active) => (active === selector ? null : selector))\n\t\t\t\t}\n\t\t\t\tonToggleMode={() => {\n\t\t\t\t\tsetDisplayMode(displayMode === \"picker\" ? \"input\" : \"picker\");\n\t\t\t\t\tsetActiveSelector(null);\n\t\t\t\t\tsetInputError(undefined);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{/* Body */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative flex-1 overflow-hidden\"\n\t\t\t\tstyle={{ minHeight: \"296px\" }}\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{displayMode === \"input\" ? (\n\t\t\t\t\t\t// Input mode\n\t\t\t\t\t\t<DatePickerInput\n\t\t\t\t\t\t\tkey=\"input-mode\"\n\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\tonChange={setInputValue}\n\t\t\t\t\t\t\tonCommit={handleInputCommit}\n\t\t\t\t\t\t\terror={inputError}\n\t\t\t\t\t\t\tlocale={locale.locale}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : activeSelector === \"month\" ? (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"month-list\"\n\t\t\t\t\t\t\tinitial={PICKER_SELECTOR_ANIM.initial}\n\t\t\t\t\t\t\tanimate={PICKER_SELECTOR_ANIM.animate}\n\t\t\t\t\t\t\texit={PICKER_SELECTOR_ANIM.exit}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MonthPickerList\n\t\t\t\t\t\t\t\tselectedMonth={currentMonth}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t\tonMonthSelect={handleMonthSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</m.div>\n\t\t\t\t\t) : activeSelector === \"year\" ? (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"year-list\"\n\t\t\t\t\t\t\tinitial={PICKER_SELECTOR_ANIM.initial}\n\t\t\t\t\t\t\tanimate={PICKER_SELECTOR_ANIM.animate}\n\t\t\t\t\t\t\texit={PICKER_SELECTOR_ANIM.exit}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<YearPickerList\n\t\t\t\t\t\t\t\tselectedYear={currentYear}\n\t\t\t\t\t\t\t\tyearRange={yearRange}\n\t\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\t\tonYearSelect={handleYearSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</m.div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t// Calendar grid\n\t\t\t\t\t\t<CalendarGrid\n\t\t\t\t\t\t\tkey=\"calendar\"\n\t\t\t\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\t\t\t\tslideDirection={slideDirection}\n\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\tselectedMs={selectedDateMs}\n\t\t\t\t\t\t\tisRangePicker={false}\n\t\t\t\t\t\t\tonDaySelect={(ms) => {\n\t\t\t\t\t\t\t\tselectDate(ms);\n\t\t\t\t\t\t\t\tsetInputValue(formatInputDate(ms));\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</fieldset>\n\t);\n};\n\nDatePicker.displayName = \"DatePicker\";\n","/**\n * @file date-picker/date-picker.tokens.ts\n *\n * MD3 Design tokens for Date Picker component.\n * Maps from DatePickerModalTokens.kt → CSS variables in packages/tailwind/src/index.css.\n *\n * @see docs/m3/date-and-time-pickers/date-pickers/DatePickerModalTokens.kt\n * @see packages/tailwind/src/index.css\n */\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/** Color tokens — uses CSS custom properties from MD3 theme */\nexport const DP_COLORS = {\n\t/** Dialog container — SurfaceContainerHigh */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\t/** Selected day background — Primary */\n\tdaySelected: \"var(--md-sys-color-primary)\",\n\t/** Selected day text — OnPrimary */\n\tdaySelectedText: \"var(--md-sys-color-on-primary)\",\n\t/** Today outline — Primary */\n\ttodayOutline: \"var(--md-sys-color-primary)\",\n\t/** Today text — Primary */\n\ttodayText: \"var(--md-sys-color-primary)\",\n\t/** Unselected day text — OnSurface */\n\tdayText: \"var(--md-sys-color-on-surface)\",\n\t/** Weekday header text — OnSurface */\n\tweekdayText: \"var(--md-sys-color-on-surface)\",\n\t/** Header headline + supporting text — OnSurfaceVariant */\n\theaderText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Range highlight background — SecondaryContainer */\n\trangeHighlight: \"var(--md-sys-color-secondary-container)\",\n\t/** Range highlight text — OnSecondaryContainer */\n\trangeText: \"var(--md-sys-color-on-secondary-container)\",\n\t/** Unselected year text — OnSurfaceVariant */\n\tyearText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Selected year background — Primary */\n\tyearSelected: \"var(--md-sys-color-primary)\",\n\t/** Selected year text — OnPrimary */\n\tyearSelectedText: \"var(--md-sys-color-on-primary)\",\n\t/** Scrim overlay */\n\tscrim: \"var(--md-sys-color-scrim)\",\n} as const;\n\n// ─── Shape Tokens ─────────────────────────────────────────────────────────────\n\n/** Shape tokens — corner radii from MD3 shape scale */\nexport const DP_SHAPE = {\n\t/** Dialog container — CornerExtraLarge = 28px */\n\tcontainer: \"var(--md-sys-shape-corner-extra-large)\",\n\t/** Day cell — CornerFull = pill */\n\tday: \"var(--md-sys-shape-corner-full)\",\n\t/** Range start/end indicator — CornerFull */\n\trangeEndpoint: \"var(--md-sys-shape-corner-full)\",\n\t/** Year chip — CornerFull */\n\tyear: \"var(--md-sys-shape-corner-full)\",\n} as const;\n\n// ─── Dimension Tokens ─────────────────────────────────────────────────────────\n\n/** Fixed dimension tokens from DatePickerModalTokens.kt */\nexport const DP_SIZE = {\n\t/** Dialog container width */\n\tcontainerWidth: 360,\n\t/** Dialog container height */\n\tcontainerHeight: 568,\n\t/** Day cell width/height */\n\tdayCell: 40,\n\t/** Today border width */\n\ttodayOutlineWidth: 1,\n\t/** Header container height */\n\theaderHeight: 120,\n\t/** Range picker header height */\n\trangeHeaderHeight: 128,\n\t/** Year chip height */\n\tyearChipHeight: 36,\n\t/** Year chip width */\n\tyearChipWidth: 72,\n} as const;\n\n// ─── Tailwind Class Helpers ───────────────────────────────────────────────────\n\n/**\n * Tailwind utility class strings for Date Picker elements.\n * Used with `cn()` function.\n */\nexport const DP_CLASSES = {\n\t/** Dialog container */\n\tdialog: [\n\t\t\"bg-m3-surface-container-high\",\n\t\t\"rounded-m3-xl\",\n\t\t\"w-[360px]\",\n\t\t\"overflow-hidden\",\n\t\t\"elevation-3\",\n\t].join(\" \"),\n\n\t/** Day cell container */\n\tdayCell: [\n\t\t\"relative flex items-center justify-center\",\n\t\t\"w-10 h-10 rounded-m3-full\",\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)]\",\n\t\t\"font-[var(--md-typescale-body-large-weight,400)]\",\n\t\t\"cursor-pointer select-none\",\n\t\t\"transition-m3-fast-effects\",\n\t].join(\" \"),\n\n\t/** Day cell: selected state */\n\tdayCellSelected: [\"bg-m3-primary\", \"text-m3-on-primary\"].join(\" \"),\n\n\t/** Day cell: today state */\n\tdayCellToday: [\n\t\t\"outline outline-1 outline-m3-primary\",\n\t\t\"text-m3-primary\",\n\t].join(\" \"),\n\n\t/** Day cell: disabled state */\n\tdayCellDisabled: \"opacity-[0.38] pointer-events-none cursor-not-allowed\",\n\n\t/** Range highlight (between start and end) */\n\trangeHighlight: \"bg-m3-secondary-container\",\n\n\t/** Weekday header row */\n\tweekdayRow:\n\t\t\"text-[length:var(--md-typescale-body-large-size,14px)] text-m3-on-surface\",\n} as const;\n","\"use client\";\n\nimport * as RadixScrollArea from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n/** Radix accepts hover/scroll/always/auto. We add 'none' as a UI-only hide. */\nexport type ScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"none\";\ntype RadixScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"auto\";\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface ScrollAreaProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Root>,\n\t\t\"type\"\n\t> {\n\t/**\n\t * Controls when the scrollbars are visible.\n\t * - `hover`: Show on hover (default, recommended for desktop)\n\t * - `scroll`: Show only while scrolling (recommended for mobile)\n\t * - `always`: Always visible\n\t * - `none`: Never visible\n\t */\n\ttype?: ScrollAreaType;\n\t/**\n\t * The scrollbar orientation to render.\n\t * @default \"vertical\"\n\t */\n\torientation?: ScrollAreaOrientation;\n\t/** Delay in ms before scrollbars hide when `type` is `hover` or `scroll`. */\n\tscrollHideDelay?: number;\n\t/** Extra classes applied to the inner viewport element. */\n\tviewportClassName?: string;\n\t/** Ref to the scrolling viewport element. */\n\tviewportRef?: React.Ref<HTMLDivElement>;\n\t/** Extra props applied to the viewport element. */\n\tviewportProps?: React.ComponentPropsWithoutRef<\n\t\ttypeof RadixScrollArea.Viewport\n\t>;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\nconst ScrollArea = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Root>,\n\tScrollAreaProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tviewportClassName,\n\t\t\tchildren,\n\t\t\ttype = \"hover\",\n\t\t\torientation = \"vertical\",\n\t\t\tscrollHideDelay = 600,\n\t\t\tviewportRef,\n\t\t\tviewportProps,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [isTouchDevice, setIsTouchDevice] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tsetIsTouchDevice(\n\t\t\t\t\t\"ontouchstart\" in window || navigator.maxTouchPoints > 0,\n\t\t\t\t);\n\t\t\t}\n\t\t}, []);\n\n\t\tconst resolvedType = React.useMemo(() => {\n\t\t\tif (type === \"hover\" && isTouchDevice) {\n\t\t\t\treturn \"scroll\";\n\t\t\t}\n\t\t\treturn type;\n\t\t}, [type, isTouchDevice]);\n\n\t\tconst radixType: RadixScrollAreaType =\n\t\t\tresolvedType === \"none\" ? \"always\" : resolvedType;\n\n\t\treturn (\n\t\t\t<RadixScrollArea.Root\n\t\t\t\tref={ref}\n\t\t\t\ttype={radixType}\n\t\t\t\tscrollHideDelay={scrollHideDelay}\n\t\t\t\tclassName={cn(\"relative overflow-hidden flex flex-col\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<RadixScrollArea.Viewport\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\t{...viewportProps}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"h-full w-full flex-1 min-h-0 min-w-0 rounded-[inherit]\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-1\",\n\t\t\t\t\t\tviewportClassName,\n\t\t\t\t\t\tviewportProps?.className,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RadixScrollArea.Viewport>\n\n\t\t\t\t{(orientation === \"vertical\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{(orientation === \"horizontal\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"horizontal\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<RadixScrollArea.Corner className=\"bg-m3-surface-container\" />\n\t\t\t</RadixScrollArea.Root>\n\t\t);\n\t},\n);\nScrollArea.displayName = \"ScrollArea\";\n\n// ─── Scrollbar ────────────────────────────────────────────────────────────────\nconst ScrollAreaScrollbar = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Scrollbar>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Scrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n\t<RadixScrollArea.Scrollbar\n\t\tref={ref}\n\t\torientation={orientation}\n\t\tclassName={cn(\n\t\t\t\"flex touch-none select-none transition-all duration-300 ease-in-out\",\n\t\t\t\"absolute z-50\",\n\t\t\torientation === \"vertical\" &&\n\t\t\t\t\"right-0 top-0 bottom-0 w-2.5 border-l border-l-transparent p-px\",\n\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\"bottom-0 left-0 right-0 h-2.5 flex-col border-t border-t-transparent p-px\",\n\t\t\t\"data-[state=hidden]:opacity-0 data-[state=visible]:opacity-100\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<RadixScrollArea.Thumb\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex-1 rounded-full bg-m3-on-surface/25 transition-colors duration-200\",\n\t\t\t\t\"hover:bg-m3-on-surface/40 active:bg-m3-on-surface/55\",\n\t\t\t\t\"before:absolute before:left-1/2 before:top-1/2 before:min-h-11 before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2\",\n\t\t\t)}\n\t\t/>\n\t</RadixScrollArea.Scrollbar>\n));\nScrollAreaScrollbar.displayName = RadixScrollArea.Scrollbar.displayName;\n\n// ─── Corner ───────────────────────────────────────────────────────────────────\nconst ScrollAreaCorner = React.forwardRef<\n\tReact.ComponentRef<typeof RadixScrollArea.Corner>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Corner>\n>(({ className, ...props }, ref) => (\n\t<RadixScrollArea.Corner\n\t\tref={ref}\n\t\tclassName={cn(\"bg-m3-surface-container\", className)}\n\t\t{...props}\n\t/>\n));\nScrollAreaCorner.displayName = \"ScrollAreaCorner\";\n\nexport { ScrollArea, ScrollAreaScrollbar };\n","/**\n * @file dialog.tsx\n *\n * Dialog component system built on Material Design 3 Expressive guidelines.\n *\n * Extends Radix UI Dialog primitives with Framer Motion physics-based Spring animations\n * for entrance and exit transitions matching MD3 Expressive specifications.\n * Supports both Standard modal and Full-Screen dialog variants.\n *\n * @see https://m3.material.io/components/dialogs/overview\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { IconButton } from \"./buttons/icon-button\";\nimport { Icon } from \"./icon\";\nimport { ScrollArea } from \"./scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─── MD3 Spring Config (Expressive) ──────────────────────────────────────────\n// MD3 default.spatial: stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19\nconst MD3_SPRING = DEFAULT_SPATIAL_SPRING;\n\nconst MD3_OVERLAY_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: \"easeOut\" as const },\n\t},\n\texit: { opacity: 0, transition: { duration: 0.15, ease: \"easeIn\" as const } },\n};\n\nconst MD3_CONTENT_ANIM = {\n\tinitial: { opacity: 0, scale: 0.85, y: 24 },\n\tanimate: { opacity: 1, scale: 1, y: 0, transition: MD3_SPRING },\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 8,\n\t\ttransition: { duration: 0.15, ease: \"easeIn\" as const },\n\t},\n};\n\nconst MD3_FULLSCREEN_ANIM = {\n\tinitial: { y: \"100%\" },\n\tanimate: { y: 0, transition: MD3_SPRING },\n\texit: { y: \"100%\", transition: { duration: 0.2, ease: \"easeIn\" as const } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Root `Dialog` props. Wraps Radix `Dialog.Root` supporting controlled and uncontrolled open state.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Open Dialog</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Confirm Action</DialogTitle>\n * </DialogHeader>\n * <DialogBody>Are you sure you want to proceed?</DialogBody>\n * <DialogFooter>\n * <Button onClick={() => setOpen(false)} variant=\"text\">Cancel</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n */\nexport interface DialogProps {\n\t/** Whether the dialog is open (controlled). Omit for uncontrolled. */\n\topen?: boolean;\n\t/** Called when the open state should change. */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Dialog trigger + content. */\n\tchildren: React.ReactNode;\n}\n\n/**\n * Props passed to standard container `DialogContent`.\n *\n * @see {@link DialogContent}\n */\nexport interface DialogContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Hides the top-right close (X) button. @default false */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n/**\n * Props for `DialogFullScreenContent` dedicated to Full-Screen dialog mode.\n *\n * @remarks\n * Full-screen dialogs expand to cover the entire device screen and feature a Top App Bar\n * with a title label, close button, and action confirmation button.\n *\n * @see {@link DialogFullScreenContent}\n * @see https://m3.material.io/components/dialogs/guidelines#full-screen\n */\nexport interface DialogFullScreenContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Title label displayed in the Top App Bar. */\n\ttitle?: string;\n\t/** Label for the primary action button on the Top App Bar (e.g. \"Save\"). */\n\tactionLabel?: string;\n\t/** Handler invoked when pressing the primary action button. */\n\tonAction?: () => void;\n\t/** Renders a divider separating Top App Bar from scrollable body content. @default false */\n\tshowDivider?: boolean;\n\tclassName?: string;\n}\n\n// ─── Re-exports wrapper ───────────────────────────────────────────────────────\n\n/**\n * Dialog component Root — wraps Radix `Dialog.Root`.\n *\n * @remarks Supports controlled state via `open`/`onOpenChange`, or uncontrolled state using `DialogTrigger`.\n */\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => (\n\t<RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t{children}\n\t</RadixDialog.Root>\n);\nDialog.displayName = \"Dialog\";\n\n/** Trigger element that toggles the open state of the Dialog (supports `asChild`). */\nconst DialogTrigger = RadixDialog.Trigger;\nDialogTrigger.displayName = \"DialogTrigger\";\n\n// ─── Portal + Overlay + Content ───────────────────────────────────────────────\nconst DialogPortal = ({\n\topen,\n\tchildren,\n}: {\n\topen?: boolean;\n\tchildren: React.ReactNode;\n}) => (\n\t<RadixDialog.Portal forceMount>\n\t\t<AnimatePresence>\n\t\t\t{open ? React.Children.toArray(children) : null}\n\t\t</AnimatePresence>\n\t</RadixDialog.Portal>\n);\nDialogPortal.displayName = \"DialogPortal\";\n\nconst DialogOverlay = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Overlay>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Overlay ref={ref} asChild {...props}>\n\t\t<m.div\n\t\t\tclassName={cn(\"fixed inset-0 z-50 bg-black/32\", className)}\n\t\t\taria-hidden=\"true\"\n\t\t\t{...MD3_OVERLAY_ANIM}\n\t\t/>\n\t</RadixDialog.Overlay>\n));\nDialogOverlay.displayName = \"DialogOverlay\";\n\nconst DialogContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogContentProps\n>(({ className, children, hideCloseButton = false, ...props }, ref) => (\n\t<RadixDialog.Content\n\t\tref={ref}\n\t\tasChild\n\t\taria-describedby={undefined}\n\t\t{...props}\n\t>\n\t\t<m.div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\"w-[calc(100%-2rem)] max-w-140\",\n\t\t\t\t\"rounded-[28px] bg-m3-surface-container-high p-6\",\n\t\t\t\t\"shadow-lg outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\trole=\"dialog\"\n\t\t\t{...MD3_CONTENT_ANIM}\n\t\t>\n\t\t\t{children}\n\t\t\t{!hideCloseButton && (\n\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tcolorStyle=\"filled\"\n\t\t\t\t\t\tclassName=\"absolute right-4 top-4\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</RadixDialog.Close>\n\t\t\t)}\n\t\t</m.div>\n\t</RadixDialog.Content>\n));\nDialogContent.displayName = \"DialogContent\";\n\n// ─── Header & Related ────────────────────────────────────────────────────────\nconst DialogIcon = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n\t<div\n\t\tref={ref}\n\t\tclassName={cn(\"flex justify-center mb-4 text-m3-secondary\", className)}\n\t\taria-hidden=\"true\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</div>\n));\nDialogIcon.displayName = \"DialogIcon\";\n\nconst DialogHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-2 mb-4\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\n// RadixDialog.Title surfaces to the accessibility tree — required\nconst DialogTitle = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Title>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Title\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\n\t\t\t\"text-[24px] leading-8 font-normal text-m3-on-surface tracking-[0em]\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = \"DialogTitle\";\n\nconst DialogDescription = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Description>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Description\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\"text-sm text-m3-on-surface-variant leading-5\", className)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = \"DialogDescription\";\n\n// ─── Body & Footer ───────────────────────────────────────────────────────────\nconst DialogBody = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, dir, ...props }, ref) => (\n\t<ScrollArea\n\t\tref={ref}\n\t\ttype=\"hover\"\n\t\tdir={dir as \"ltr\" | \"rtl\" | undefined}\n\t\tclassName={cn(\"max-h-[calc(85dvh-200px)] -mx-6\", className)}\n\t\tviewportClassName=\"px-6\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</ScrollArea>\n));\nDialogBody.displayName = \"DialogBody\";\n\nconst DialogFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\"flex flex-row justify-end gap-2 mt-6\", className)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogClose = RadixDialog.Close;\n\n// ─── Full Screen Content Variant ──────────────────────────────────────────────\nconst DialogFullScreenContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogFullScreenContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\ttitle,\n\t\t\tactionLabel,\n\t\t\tonAction,\n\t\t\tshowDivider,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<RadixDialog.Content\n\t\t\tref={ref}\n\t\t\tasChild\n\t\t\taria-describedby={undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t<m.div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-50 w-full h-full bg-m3-surface flex flex-col\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\trole=\"dialog\"\n\t\t\t\t{...MD3_FULLSCREEN_ANIM}\n\t\t\t>\n\t\t\t\t<div className=\"flex shrink-0 items-center px-4 h-14 gap-2 bg-m3-surface\">\n\t\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t\t<IconButton size=\"sm\" colorStyle=\"filled\" aria-label=\"Close\">\n\t\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</RadixDialog.Close>\n\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<DialogTitle className=\"flex-1 text-[22px] leading-7 font-medium truncate pr-2\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</DialogTitle>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{actionLabel && onAction && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onAction}\n\t\t\t\t\t\t\tclassName=\"text-sm font-medium text-m3-primary px-3 py-2 rounded-full hover:bg-m3-primary/8 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary transition-colors whitespace-nowrap\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{showDivider && (\n\t\t\t\t\t<hr className=\"border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t)}\n\n\t\t\t\t<ScrollArea\n\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\tclassName=\"flex-1 w-full\"\n\t\t\t\t\tviewportClassName=\"p-6\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</ScrollArea>\n\t\t\t</m.div>\n\t\t</RadixDialog.Content>\n\t),\n);\nDialogFullScreenContent.displayName = \"DialogFullScreenContent\";\n\nexport {\n\tDialog,\n\tDialogBody,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogFullScreenContent,\n\tDialogHeader,\n\tDialogIcon,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","/**\n * @file date-picker/date-picker-dialog.tsx\n *\n * Modal container for Date Pickers — reuses Dialog + DialogPortal primitives.\n * Equivalent to `DatePickerDialog` composable in Android Compose Material3.\n *\n * Tokens from DatePickerModalTokens.kt:\n * - ContainerColor = SurfaceContainerHigh (#ece6f0)\n * - ContainerShape = CornerExtraLarge (28px)\n * - ContainerElevation = Level3\n * - ContainerWidth = 360px, ContainerHeight = 568px (single date)\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { m } from \"motion/react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Dialog, DialogPortal } from \"../../dialog\";\nimport {\n\tPICKER_CONTENT_ANIM,\n\tPICKER_OVERLAY_ANIM,\n} from \"../shared/animation-tokens\";\nimport type { DatePickerDialogProps } from \"./date-picker.types\";\n\n/**\n * Modal Date Picker dialog with MD3 Expressive spring animations.\n *\n * Reuses `<Dialog>` (Root) and `<DialogPortal>` (AnimatePresence + Portal lifecycle)\n * while managing Overlay and Content to preserve MD3 Date Picker layout specs.\n *\n * @example\n\n * ```tsx\n * const state = useDatePickerState();\n * const [open, setOpen] = React.useState(false);\n *\n * <DatePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * confirmButton={\n * <Button variant=\"text\" onClick={() => { handleConfirm(state.selectedDateMs); setOpen(false); }}>\n * OK\n * </Button>\n * }\n * dismissButton={\n * <Button variant=\"text\" onClick={() => setOpen(false)}>Cancel</Button>\n * }\n * >\n * <DatePicker state={state} />\n * </DatePickerDialog>\n * ```\n */\nexport const DatePickerDialog: React.FC<DatePickerDialogProps> = ({\n\topen,\n\tonDismiss,\n\tconfirmButton,\n\tdismissButton,\n\tchildren,\n\tclassName,\n\ttitle = \"Select date\",\n}) => {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={(v) => !v && onDismiss()}>\n\t\t\t<DialogPortal open={open}>\n\t\t\t\t{/* Scrim */}\n\t\t\t\t<RadixDialog.Overlay asChild forceMount>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"picker-overlay\"\n\t\t\t\t\t\tclassName=\"fixed inset-0 z-50 bg-m3-scrim/40\"\n\t\t\t\t\t\tinitial={PICKER_OVERLAY_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_OVERLAY_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_OVERLAY_ANIM.exit}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t/>\n\t\t\t\t</RadixDialog.Overlay>\n\n\t\t\t\t{/* Dialog panel */}\n\t\t\t\t<RadixDialog.Content\n\t\t\t\t\tasChild\n\t\t\t\t\tforceMount\n\t\t\t\t\tonEscapeKeyDown={onDismiss}\n\t\t\t\t\tonPointerDownOutside={(e) => e.preventDefault()} // scrim handles dismiss\n\t\t\t\t\taria-modal\n\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"picker-content\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"fixed z-50 left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t\"bg-m3-surface-container-high\",\n\t\t\t\t\t\t\t\"rounded-m3-xl\",\n\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t// Elevation Level 3\n\t\t\t\t\t\t\t\"elevation-3\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ width: \"min(calc(100vw - 32px), 360px)\" }}\n\t\t\t\t\t\tinitial={PICKER_CONTENT_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_CONTENT_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_CONTENT_ANIM.exit}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">{title}</RadixDialog.Title>\n\n\t\t\t\t\t\t{/* Content — DatePicker or DateRangePicker */}\n\t\t\t\t\t\t<div className=\"flex-1 overflow-hidden\">{children}</div>\n\n\t\t\t\t\t\t{/* Action buttons footer */}\n\t\t\t\t\t\t<div className=\"flex items-center justify-end gap-2 px-4 py-3\">\n\t\t\t\t\t\t\t{dismissButton}\n\t\t\t\t\t\t\t{confirmButton}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</RadixDialog.Content>\n\t\t\t</DialogPortal>\n\t\t</Dialog>\n\t);\n};\n\nDatePickerDialog.displayName = \"DatePickerDialog\";\n","/**\n * @file date-picker/date-range-picker.tsx\n *\n * DateRangePicker — calendar UI for date range selection.\n * Equivalent to `DateRangePicker` composable in Android Compose Material3.\n *\n * Differences from DatePicker:\n * - Highlights range between start and end (SecondaryContainer)\n * - Headline displays \"Start date → End date\"\n * - Default title: \"Select dates\" (plural)\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { PICKER_SELECTOR_ANIM } from \"../shared/animation-tokens\";\nimport {\n\tformatDate,\n\tgetNavigableMonth,\n\tisMonthNavigable,\n} from \"../shared/calendar-model\";\nimport type { DateRangePickerProps } from \"./date-picker.types\";\nimport { CalendarGrid } from \"./subcomponents/calendar-grid\";\nimport {\n\tCalendarHeader,\n\ttype CalendarSelector,\n} from \"./subcomponents/calendar-header\";\nimport { MonthPickerList } from \"./subcomponents/month-picker-list\";\nimport { YearPickerList } from \"./subcomponents/year-picker-list\";\n\n/**\n * DateRangePicker calendar UI.\n *\n * @example\n * ```tsx\n * const state = useDateRangePickerState();\n *\n * <DateRangePicker\n * state={state}\n * title=\"Select travel dates\"\n * />\n * ```\n */\nexport const DateRangePicker: React.FC<DateRangePickerProps> = ({\n\tstate,\n\tshowModeToggle = false,\n\ttitle,\n\tclassName,\n}) => {\n\tconst {\n\t\tselectedStartMs,\n\t\tselectedEndMs,\n\t\tdisplayedMonthMs,\n\t\tdisplayMode,\n\t\tyearRange,\n\t\tlocale,\n\t\tselectableDates,\n\t\tselectDate,\n\t\tnavigateMonth,\n\t\tnavigateToMonth,\n\t\tsetDisplayMode,\n\t} = state;\n\n\tconst [activeSelector, setActiveSelector] =\n\t\tReact.useState<CalendarSelector>(null);\n\tconst [slideDirection, setSlideDirection] = React.useState<\n\t\t\"prev\" | \"next\" | null\n\t>(null);\n\n\tconst handlePrev = React.useCallback(() => {\n\t\tsetSlideDirection(\"prev\");\n\t\tnavigateMonth(\"prev\");\n\t}, [navigateMonth]);\n\n\tconst handleNext = React.useCallback(() => {\n\t\tsetSlideDirection(\"next\");\n\t\tnavigateMonth(\"next\");\n\t}, [navigateMonth]);\n\n\tconst handleYearSelect = React.useCallback(\n\t\t(year: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(year, d.getUTCMonth());\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\tconst handleMonthSelect = React.useCallback(\n\t\t(month: number) => {\n\t\t\tconst d = new Date(displayedMonthMs);\n\t\t\tnavigateToMonth(d.getUTCFullYear(), month);\n\t\t\tsetActiveSelector(null);\n\t\t},\n\t\t[displayedMonthMs, navigateToMonth],\n\t);\n\n\t// ── Headline: \"Start → End\" ──────────────────────────────────────────────────\n\tconst formatShort = React.useCallback(\n\t\t(ms: number | null): string => {\n\t\t\tif (ms === null) return \"—\";\n\t\t\treturn formatDate(ms, locale, {\n\t\t\t\tmonth: \"short\",\n\t\t\t\tday: \"numeric\",\n\t\t\t\ttimeZone: \"UTC\",\n\t\t\t});\n\t\t},\n\t\t[locale],\n\t);\n\n\tconst headline = `${formatShort(selectedStartMs)} – ${formatShort(selectedEndMs)}`;\n\n\tconst currentYear = new Date(displayedMonthMs).getUTCFullYear();\n\tconst currentMonth = new Date(displayedMonthMs).getUTCMonth();\n\n\tconst computedAriaLabel =\n\t\ttypeof title === \"string\" ? title : \"Date range picker\";\n\tconst canNavigatePrev =\n\t\tgetNavigableMonth(displayedMonthMs, \"prev\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigateNext =\n\t\tgetNavigableMonth(displayedMonthMs, \"next\", yearRange, selectableDates) !==\n\t\tnull;\n\tconst canNavigatePreviousYear = isMonthNavigable(\n\t\tcurrentYear - 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\tconst canNavigateNextYear = isMonthNavigable(\n\t\tcurrentYear + 1,\n\t\tyearRange,\n\t\tselectableDates,\n\t);\n\n\treturn (\n\t\t<fieldset\n\t\t\tclassName={cn(\"flex flex-col select-none\", className)}\n\t\t\tstyle={{ width: \"min(100%, 360px)\" }}\n\t\t\taria-label={computedAriaLabel}\n\t\t>\n\t\t\t<legend className=\"sr-only\">{computedAriaLabel}</legend>\n\t\t\t{/* Header */}\n\t\t\t<CalendarHeader\n\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\tactiveSelector={activeSelector}\n\t\t\t\tdisplayMode={displayMode}\n\t\t\t\tshowModeToggle={showModeToggle}\n\t\t\t\ttitle={title ?? \"Select dates\"}\n\t\t\t\theadline={headline}\n\t\t\t\tlocale={locale}\n\t\t\t\tcanNavigatePrev={canNavigatePrev}\n\t\t\t\tcanNavigateNext={canNavigateNext}\n\t\t\t\tcanNavigatePreviousYear={canNavigatePreviousYear}\n\t\t\t\tcanNavigateNextYear={canNavigateNextYear}\n\t\t\t\tonPrev={handlePrev}\n\t\t\t\tonNext={handleNext}\n\t\t\t\tonPreviousYear={() => navigateToMonth(currentYear - 1, currentMonth)}\n\t\t\t\tonNextYear={() => navigateToMonth(currentYear + 1, currentMonth)}\n\t\t\t\tonToggleSelector={(selector) =>\n\t\t\t\t\tsetActiveSelector((active) => (active === selector ? null : selector))\n\t\t\t\t}\n\t\t\t\tonToggleMode={() => {\n\t\t\t\t\tsetDisplayMode(displayMode === \"picker\" ? \"input\" : \"picker\");\n\t\t\t\t\tsetActiveSelector(null);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{/* Body */}\n\t\t\t<div\n\t\t\t\tclassName=\"relative flex-1 overflow-hidden\"\n\t\t\t\tstyle={{ minHeight: \"296px\" }}\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{activeSelector === \"month\" ? (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"month-list\"\n\t\t\t\t\t\t\tinitial={PICKER_SELECTOR_ANIM.initial}\n\t\t\t\t\t\t\tanimate={PICKER_SELECTOR_ANIM.animate}\n\t\t\t\t\t\t\texit={PICKER_SELECTOR_ANIM.exit}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MonthPickerList\n\t\t\t\t\t\t\t\tselectedMonth={currentMonth}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t\tonMonthSelect={handleMonthSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</m.div>\n\t\t\t\t\t) : activeSelector === \"year\" ? (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid=\"date-picker-selection\"\n\t\t\t\t\t\t\tkey=\"year-list\"\n\t\t\t\t\t\t\tinitial={PICKER_SELECTOR_ANIM.initial}\n\t\t\t\t\t\t\tanimate={PICKER_SELECTOR_ANIM.animate}\n\t\t\t\t\t\t\texit={PICKER_SELECTOR_ANIM.exit}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<YearPickerList\n\t\t\t\t\t\t\t\tselectedYear={currentYear}\n\t\t\t\t\t\t\t\tyearRange={yearRange}\n\t\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\t\tonYearSelect={handleYearSelect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</m.div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CalendarGrid\n\t\t\t\t\t\t\tkey=\"calendar\"\n\t\t\t\t\t\t\tdisplayedMonthMs={displayedMonthMs}\n\t\t\t\t\t\t\tslideDirection={slideDirection}\n\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\tselectableDates={selectableDates}\n\t\t\t\t\t\t\tselectedMs={null}\n\t\t\t\t\t\t\tselectedStartMs={selectedStartMs}\n\t\t\t\t\t\t\tselectedEndMs={selectedEndMs}\n\t\t\t\t\t\t\tisRangePicker\n\t\t\t\t\t\t\tonDaySelect={selectDate}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</fieldset>\n\t);\n};\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","/**\n * @file date-time-pickers/shared/types.ts\n *\n * Shared TypeScript base types for Date Pickers and Time Pickers system.\n * Designed for reuse across both picker systems.\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\n// ─── Display Mode ─────────────────────────────────────────────────────────────\n\n/**\n * Picker display mode.\n * - `picker` — calendar/dial UI (default)\n * - `input` — text input mode for manual entry\n *\n * Equivalent to `DisplayMode` enum in Android Compose Material3.\n */\nexport type DisplayMode = \"picker\" | \"input\";\n\n// ─── Week Configuration ───────────────────────────────────────────────────────\n\n/**\n * First day of the week.\n * - `0` = Sunday (US standard)\n * - `1` = Monday (ISO 8601, default for this library)\n */\nexport type WeekStartsOn = 0 | 1;\n\n// ─── Locale Configuration ─────────────────────────────────────────────────────\n\n/**\n * Locale configuration for Date Picker.\n * Uses native `Intl.DateTimeFormat` API — zero bundle overhead.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'en-US', weekStartsOn: 1 }\n * });\n * ```\n */\nexport interface DateLocale {\n\t/**\n\t * BCP 47 language tag.\n\t * @example 'en-US', 'fr-FR', 'ja-JP'\n\t * @default navigator.language (runtime)\n\t */\n\tlocale?: string;\n\n\t/**\n\t * First day of the week.\n\t * @default 1 (Monday)\n\t */\n\tweekStartsOn?: WeekStartsOn;\n}\n\n/** Required version — all fields resolved */\nexport type ResolvedDateLocale = Required<DateLocale>;\n\n// ─── Selectable Dates ─────────────────────────────────────────────────────────\n\n/**\n * Interface for filtering selectable dates and years.\n * Equivalent to `SelectableDates` interface in Android Compose Material3.\n\n *\n * @example\n * ```tsx\n * // Disable weekends\n * const selectableDates: SelectableDates = {\n * isSelectableDate(utcMs) {\n * const day = new Date(utcMs).getUTCDay();\n * return day !== 0 && day !== 6;\n * },\n * isSelectableYear(year) {\n * return year >= 2020;\n * }\n * };\n * ```\n */\nexport interface SelectableDates {\n\t/**\n\t * Checks if a date is selectable.\n\t * @param utcTimeMs - UTC milliseconds (normalized to UTC midnight)\n\t * @returns `true` if date is selectable\n\t */\n\tisSelectableDate(utcTimeMs: number): boolean;\n\n\t/**\n\t * Checks if a year is selectable.\n\t * Unselectable years are disabled in year grid view.\n\t * @param year - Full year (e.g., 2025)\n\t * @returns `true` if year is selectable\n\t */\n\tisSelectableYear(year: number): boolean;\n}\n\n/** Default SelectableDates — allows all dates and years */\nexport const ALL_DATES_SELECTABLE: SelectableDates = {\n\tisSelectableDate: () => true,\n\tisSelectableYear: () => true,\n};\n\n// ─── Date Range ───────────────────────────────────────────────────────────────\n\n/**\n * Date range with start and end.\n * Both can be null during selection flow.\n */\nexport interface DateRange {\n\t/** Start date UTC milliseconds (UTC midnight). Null if unselected. */\n\tstart: number | null;\n\t/** End date UTC milliseconds (UTC midnight). Null if unselected. */\n\tend: number | null;\n}\n\n// ─── Calendar Day / Week ──────────────────────────────────────────────────────\n\n/** Represents a day cell in calendar grid */\nexport interface CalendarDay {\n\t/** UTC milliseconds (UTC midnight) */\n\tutcMs: number;\n\t/** Day of month (1–31) */\n\tday: number;\n\t/** Month index (0–11) — 0 = January */\n\tmonth: number;\n\t/** Full year */\n\tyear: number;\n\t/** `true` if day belongs to currently displayed month */\n\tisCurrentMonth: boolean;\n\t/** `true` if day is today */\n\tisToday: boolean;\n}\n\n/** A single week — array of 7 days (or null for padding) */\nexport type CalendarWeek = Array<CalendarDay | null>;\n","/**\n * @file date-picker/use-date-picker-state.ts\n *\n * Core state hook for DatePicker — hoisted state pattern.\n * Equivalent to `rememberDatePickerState()` in Android Compose Material3.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'en-US', weekStartsOn: 1 },\n * selectableDates: {\n * isSelectableDate: (ms) => new Date(ms).getUTCDay() !== 0,\n * isSelectableYear: (year) => year >= 2020,\n * }\n * });\n *\n * <DatePicker state={state} />\n * <p>Selected: {state.selectedDateMs}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tgetNavigableMonth,\n\tisMonthNavigable,\n\tnormalizeToMonthStart,\n\tresolveLocale,\n\tstartOfDayUTC,\n\ttodayUTC,\n} from \"../shared/calendar-model\";\nimport type { DisplayMode } from \"../shared/types\";\nimport { ALL_DATES_SELECTABLE } from \"../shared/types\";\nimport type {\n\tDatePickerState,\n\tUseDatePickerStateOptions,\n} from \"./date-picker.types\";\n\n// ─── Defaults ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_YEAR_RANGE: [number, number] = [1900, 2100];\nconst DEFAULT_DISPLAY_MODE: DisplayMode = \"picker\";\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for managing state of DatePicker.\n *\n * @param options - Initial state configuration\n * @returns `DatePickerState` object with state and actions\n */\nexport const useDatePickerState = (\n\toptions?: UseDatePickerStateOptions,\n): DatePickerState => {\n\t// ── Initial values ──────────────────────────────────────────────────────────\n\tconst initialSelectedMs = options?.initialSelectedDateMs ?? null;\n\n\tconst initialMonthMs = normalizeToMonthStart(\n\t\toptions?.initialDisplayedMonthMs ??\n\t\t\t(initialSelectedMs !== null ? initialSelectedMs : todayUTC()),\n\t);\n\n\tconst yearRange = options?.yearRange ?? DEFAULT_YEAR_RANGE;\n\tconst selectableDates = options?.selectableDates ?? ALL_DATES_SELECTABLE;\n\tconst initialDisplayMode =\n\t\toptions?.initialDisplayMode ?? DEFAULT_DISPLAY_MODE;\n\tconst locale = resolveLocale(options?.locale);\n\n\t// ── State ───────────────────────────────────────────────────────────────────\n\tconst [selectedDateMs, setSelectedDateMs] = useState<number | null>(\n\t\tinitialSelectedMs !== null ? startOfDayUTC(initialSelectedMs) : null,\n\t);\n\tconst [displayedMonthMs, setDisplayedMonthMs] =\n\t\tuseState<number>(initialMonthMs);\n\tconst [displayMode, setDisplayModeState] =\n\t\tuseState<DisplayMode>(initialDisplayMode);\n\n\t// ── Actions ─────────────────────────────────────────────────────────────────\n\n\tconst selectDate = useCallback(\n\t\t(ms: number | null): void => {\n\t\t\tif (ms === null) {\n\t\t\t\tsetSelectedDateMs(null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst normalized = startOfDayUTC(ms);\n\t\t\t// Validate selectable\n\t\t\tif (!selectableDates.isSelectableDate(normalized)) return;\n\t\t\tsetSelectedDateMs(normalized);\n\t\t\t// Auto-navigate calendar to month of selected date\n\t\t\tsetDisplayedMonthMs(normalizeToMonthStart(normalized));\n\t\t},\n\t\t[selectableDates],\n\t);\n\n\tconst navigateMonthAction = useCallback(\n\t\t(direction: \"prev\" | \"next\"): void => {\n\t\t\tsetDisplayedMonthMs(\n\t\t\t\t(prev) =>\n\t\t\t\t\tgetNavigableMonth(prev, direction, yearRange, selectableDates) ??\n\t\t\t\t\tprev,\n\t\t\t);\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst navigateToMonth = useCallback(\n\t\t(year: number, month: number): void => {\n\t\t\tif (!isMonthNavigable(year, yearRange, selectableDates)) return;\n\t\t\tsetDisplayedMonthMs(Date.UTC(year, month, 1));\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst setDisplayMode = useCallback((mode: DisplayMode): void => {\n\t\tsetDisplayModeState(mode);\n\t}, []);\n\n\tconst reset = useCallback((): void => {\n\t\tsetSelectedDateMs(\n\t\t\tinitialSelectedMs !== null ? startOfDayUTC(initialSelectedMs) : null,\n\t\t);\n\t\tsetDisplayedMonthMs(initialMonthMs);\n\t\tsetDisplayModeState(initialDisplayMode);\n\t}, [initialSelectedMs, initialMonthMs, initialDisplayMode]);\n\n\t// ── Memoized state object ───────────────────────────────────────────────────\n\treturn useMemo<DatePickerState>(\n\t\t() => ({\n\t\t\tselectedDateMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tnavigateMonth: navigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\tselectedDateMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tnavigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t],\n\t);\n};\n","/**\n * @file date-picker/use-date-range-picker-state.ts\n *\n * Core state hook for DateRangePicker — hoisted state pattern.\n * Equivalent to `rememberDateRangePickerState()` in Android Compose Material3.\n *\n * Range selection logic:\n * - Click 1: set start date\n * - Click 2 (ms > start): set end date → range complete\n * - Click 2 (ms <= start): reset, set start = ms\n * - If both start and end exist: reset, set start = ms\n *\n * @example\n * ```tsx\n * const state = useDateRangePickerState();\n *\n * <DateRangePicker state={state} />\n * <p>Start: {state.selectedStartMs}, End: {state.selectedEndMs}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useReducer, useState } from \"react\";\nimport {\n\tgetNavigableMonth,\n\tisMonthNavigable,\n\tnormalizeToMonthStart,\n\tresolveLocale,\n\tstartOfDayUTC,\n\ttodayUTC,\n} from \"../shared/calendar-model\";\nimport type { DisplayMode } from \"../shared/types\";\nimport { ALL_DATES_SELECTABLE } from \"../shared/types\";\nimport type {\n\tDateRangePickerState,\n\tUseDateRangePickerStateOptions,\n} from \"./date-picker.types\";\n\n// ─── Defaults ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_YEAR_RANGE: [number, number] = [1900, 2100];\n\n// ─── Range Reducer ────────────────────────────────────────────────────────────\n\ninterface RangeState {\n\tstartMs: number | null;\n\tendMs: number | null;\n}\n\ntype RangeAction =\n\t| { type: \"SELECT\"; ms: number }\n\t| { type: \"CLEAR\" }\n\t| { type: \"RESET\"; startMs: number | null; endMs: number | null };\n\n/**\n * Pure reducer to update start/end atomically in a single dispatch —\n * avoids nested setState anti-pattern and stale closure issues.\n */\nfunction rangeReducer(state: RangeState, action: RangeAction): RangeState {\n\tswitch (action.type) {\n\t\tcase \"SELECT\": {\n\t\t\tconst { startMs, endMs } = state;\n\t\t\tconst ms = action.ms;\n\n\t\t\t// Case 1: No start date → set start\n\t\t\tif (startMs === null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 2: Both start and end exist → reset, set start = ms\n\t\t\tif (endMs !== null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 3: Has start, no end, ms > start → set end\n\t\t\tif (ms > startMs) return { startMs, endMs: ms };\n\n\t\t\t// Case 4: ms <= start → reset, set start = ms\n\t\t\treturn { startMs: ms, endMs: null };\n\t\t}\n\t\tcase \"CLEAR\":\n\t\t\treturn { startMs: null, endMs: null };\n\t\tcase \"RESET\":\n\t\t\treturn { startMs: action.startMs, endMs: action.endMs };\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for managing state of DateRangePicker.\n *\n * @param options - Initial configuration\n * @returns `DateRangePickerState` object with state and actions\n */\nexport const useDateRangePickerState = (\n\toptions?: UseDateRangePickerStateOptions,\n): DateRangePickerState => {\n\t// ── Initial values ──────────────────────────────────────────────────────────\n\tconst initialStartMs =\n\t\toptions?.initialStartMs != null\n\t\t\t? startOfDayUTC(options.initialStartMs)\n\t\t\t: null;\n\tconst initialEndMs =\n\t\toptions?.initialEndMs != null ? startOfDayUTC(options.initialEndMs) : null;\n\n\tconst initialMonthMs = normalizeToMonthStart(\n\t\toptions?.initialDisplayedMonthMs ??\n\t\t\t(initialStartMs !== null ? initialStartMs : todayUTC()),\n\t);\n\n\tconst yearRange = options?.yearRange ?? DEFAULT_YEAR_RANGE;\n\tconst selectableDates = options?.selectableDates ?? ALL_DATES_SELECTABLE;\n\tconst initialDisplayMode: DisplayMode =\n\t\toptions?.initialDisplayMode ?? \"picker\";\n\tconst locale = resolveLocale(options?.locale);\n\n\t// ── State ───────────────────────────────────────────────────────────────────\n\tconst [{ startMs: selectedStartMs, endMs: selectedEndMs }, dispatch] =\n\t\tuseReducer(rangeReducer, {\n\t\t\tstartMs: initialStartMs,\n\t\t\tendMs: initialEndMs,\n\t\t});\n\n\tconst [displayedMonthMs, setDisplayedMonthMs] =\n\t\tuseState<number>(initialMonthMs);\n\tconst [displayMode, setDisplayModeState] =\n\t\tuseState<DisplayMode>(initialDisplayMode);\n\n\t// ── Actions ─────────────────────────────────────────────────────────────────\n\n\t/**\n\t * Dispatch atomic SELECT action — start and end are updated simultaneously\n\t * in reducer, avoiding nested setState anti-pattern.\n\t */\n\tconst selectDate = useCallback(\n\t\t(ms: number): void => {\n\t\t\tconst normalized = startOfDayUTC(ms);\n\t\t\tif (!selectableDates.isSelectableDate(normalized)) return;\n\t\t\tdispatch({ type: \"SELECT\", ms: normalized });\n\t\t},\n\t\t[selectableDates],\n\t);\n\n\tconst clearRange = useCallback((): void => {\n\t\tdispatch({ type: \"CLEAR\" });\n\t}, []);\n\n\tconst navigateMonthAction = useCallback(\n\t\t(direction: \"prev\" | \"next\"): void => {\n\t\t\tsetDisplayedMonthMs(\n\t\t\t\t(prev) =>\n\t\t\t\t\tgetNavigableMonth(prev, direction, yearRange, selectableDates) ??\n\t\t\t\t\tprev,\n\t\t\t);\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst navigateToMonth = useCallback(\n\t\t(year: number, month: number): void => {\n\t\t\tif (!isMonthNavigable(year, yearRange, selectableDates)) return;\n\t\t\tsetDisplayedMonthMs(Date.UTC(year, month, 1));\n\t\t},\n\t\t[yearRange, selectableDates],\n\t);\n\n\tconst setDisplayMode = useCallback((mode: DisplayMode): void => {\n\t\tsetDisplayModeState(mode);\n\t}, []);\n\n\tconst reset = useCallback((): void => {\n\t\tdispatch({ type: \"RESET\", startMs: initialStartMs, endMs: initialEndMs });\n\t\tsetDisplayedMonthMs(initialMonthMs);\n\t\tsetDisplayModeState(initialDisplayMode);\n\t}, [initialStartMs, initialEndMs, initialMonthMs, initialDisplayMode]);\n\n\t// ── Memoized state object ───────────────────────────────────────────────────\n\treturn useMemo<DateRangePickerState>(\n\t\t() => ({\n\t\t\tselectedStartMs,\n\t\t\tselectedEndMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tclearRange,\n\t\t\tnavigateMonth: navigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\tselectedStartMs,\n\t\t\tselectedEndMs,\n\t\t\tdisplayedMonthMs,\n\t\t\tdisplayMode,\n\t\t\tyearRange,\n\t\t\tlocale,\n\t\t\tselectableDates,\n\t\t\tselectDate,\n\t\t\tclearRange,\n\t\t\tnavigateMonthAction,\n\t\t\tnavigateToMonth,\n\t\t\tsetDisplayMode,\n\t\t\treset,\n\t\t],\n\t);\n};\n","/**\n * @file time-picker/time-picker.tokens.ts\n *\n * MD3 Design tokens for Time Picker component system.\n * Verified mapping from:\n * - TimePickerTokens.kt → ClockDial, TimeSelector, PeriodSelector (Picker mode)\n * - TimeInputTokens.kt → TimeField, PeriodSelector (Input mode)\n *\n * CSS variables → packages/tokens/src/colors.css\n * Tailwind classes → packages/tailwind/src/index.css\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerTokens.kt\n * @see docs/m3/date-and-time-pickers/time-pickers/TimeInputTokens.kt\n */\n\n// ─── Color Tokens ──────────────────────────────────────────────────────────────\n\n/**\n * Color tokens for Time Picker — mapped from TimePickerTokens.kt + TimeInputTokens.kt.\n * Uses CSS custom properties from MD3 theme (packages/tokens/src/colors.css).\n */\nexport const TP_COLORS = {\n\t// ── Clock Dial (TimePickerTokens) ─────────────────────────────────────────\n\t/** Dial background — SurfaceContainerHighest */\n\tclockDial: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Selected number text — OnPrimary */\n\tclockDialSelected: \"var(--md-sys-color-on-primary)\",\n\t/** Unselected number text — OnSurface */\n\tclockDialUnselected: \"var(--md-sys-color-on-surface)\",\n\t/** Selector handle circle — Primary */\n\tselectorHandle: \"var(--md-sys-color-primary)\",\n\t/** Selector track line — Primary */\n\tselectorTrack: \"var(--md-sys-color-primary)\",\n\t/** Selector center dot — Primary */\n\tselectorCenter: \"var(--md-sys-color-primary)\",\n\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** Picker/Input container — SurfaceContainerHigh */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\n\t// ── Time Selector Buttons (hour/minute display) ───────────────────────────\n\t/** Selected selector (hour/min button) — PrimaryContainer */\n\ttimeSelectorSelected: \"var(--md-sys-color-primary-container)\",\n\t/** Unselected selector — SurfaceContainerHighest */\n\ttimeSelectorUnselected: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Selected selector text — OnPrimaryContainer */\n\ttimeSelectorSelectedText: \"var(--md-sys-color-on-primary-container)\",\n\t/** Unselected selector text — OnSurface */\n\ttimeSelectorUnselectedText: \"var(--md-sys-color-on-surface)\",\n\n\t// ── Period Selector AM/PM (updated flag = true → PrimaryContainer) ────────\n\t/** AM/PM selected background — TertiaryContainer */\n\tperiodSelected: \"var(--md-sys-color-tertiary-container)\",\n\t/** AM/PM unselected background — transparent */\n\tperiodUnselected: \"transparent\",\n\t/** AM/PM selected text — OnTertiaryContainer */\n\tperiodSelectedText: \"var(--md-sys-color-on-tertiary-container)\",\n\t/** AM/PM unselected text — OnSurfaceVariant */\n\tperiodUnselectedText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** AM/PM border — Outline */\n\tperiodOutline: \"var(--md-sys-color-outline)\",\n\n\t// ── Time Field (TimeInput mode, TimeInputTokens) ───────────────────────────\n\t/** Time field default background — SurfaceContainerHighest */\n\ttimeField: \"var(--md-sys-color-surface-container-highest)\",\n\t/** Time field focused background — PrimaryContainer */\n\ttimeFieldFocus: \"var(--md-sys-color-primary-container)\",\n\t/** Time field focused text — OnPrimaryContainer */\n\ttimeFieldFocusText: \"var(--md-sys-color-on-primary-container)\",\n\t/** Time field focus outline — Primary */\n\ttimeFieldFocusOutline: \"var(--md-sys-color-primary)\",\n\t/** Time field default text — OnSurface */\n\ttimeFieldText: \"var(--md-sys-color-on-surface)\",\n\t/** \":\" separator — OnSurface */\n\tseparator: \"var(--md-sys-color-on-surface)\",\n\t/** Headline label (\"Select time\") — OnSurfaceVariant */\n\theadline: \"var(--md-sys-color-on-surface-variant)\",\n} as const;\n\n// ─── Tailwind Class Helpers ────────────────────────────────────────────────────\n\n/**\n * Tailwind utility class strings for Time Picker elements.\n * Used with `cn()` function.\n * Mapped from packages/tailwind/src/index.css (--color-m3-* tokens).\n */\nexport const TP_CLASSES = {\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** Main picker/input container */\n\tcontainer: \"bg-m3-surface-container-high rounded-m3-xl select-none\",\n\n\t// ── Time Selector Buttons ─────────────────────────────────────────────────\n\t/** Hour/minute selector button — selected */\n\ttimeSelectorSelected: \"bg-m3-primary-container text-m3-on-primary-container\",\n\t/** Hour/minute selector button — unselected */\n\ttimeSelectorUnselected: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\n\t// ── Period Selector ───────────────────────────────────────────────────────\n\t/** AM/PM button — selected */\n\tperiodSelected: \"bg-m3-primary-container text-m3-on-primary-container\",\n\t/** AM/PM button — unselected */\n\tperiodUnselected: \"bg-transparent text-m3-on-surface-variant\",\n\n\t// ── Time Field (input mode) ────────────────────────────────────────────────\n\t/** Time input field — default */\n\ttimeField: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\t/** Time input field — focused */\n\ttimeFieldFocused:\n\t\t\"bg-m3-primary-container text-m3-on-primary-container ring-2 ring-m3-primary\",\n\n\t// ── Clock Dial ─────────────────────────────────────────────────────────────\n\t/** Clock dial background circle */\n\tclockDial: \"fill-[var(--md-sys-color-surface-container-highest)]\",\n\t/** Selected number on dial */\n\tclockDialSelectedText: \"fill-[var(--md-sys-color-on-primary)]\",\n\t/** Unselected number on dial */\n\tclockDialUnselectedText: \"fill-[var(--md-sys-color-on-surface)]\",\n\t/** Selector handle, track, center dot */\n\tselectorPrimary: \"fill-m3-primary stroke-m3-primary\",\n} as const;\n\n// ─── Shape Tokens ──────────────────────────────────────────────────────────────\n\n/**\n * Shape tokens — corner radii from MD3 shape scale.\n * Mapped from ShapeKeyTokens in TimePickerTokens.kt + TimeInputTokens.kt.\n *\n * Uses Tailwind class names from packages/tailwind/src/index.css.\n */\nexport const TP_SHAPE = {\n\t/** Dialog container — CornerExtraLarge = 28px */\n\tcontainer: \"rounded-m3-xl\",\n\t/** Hour/minute selector button — CornerSmall = 8px */\n\ttimeSelector: \"rounded-m3-sm\",\n\t/** Period (AM/PM) container — CornerSmall = 8px */\n\tperiodSelector: \"rounded-m3-sm\",\n\t/** Clock dial circle — CornerFull */\n\tclockDial: \"rounded-m3-full\",\n\t/** Time field — CornerSmall = 8px */\n\ttimeField: \"rounded-m3-sm\",\n} as const;\n\n// ─── Dimension Tokens ──────────────────────────────────────────────────────────\n\n/**\n * Fixed dimension tokens from TimePickerTokens.kt + TimeInputTokens.kt.\n * Unit: px (converted from dp).\n */\nexport const TP_SIZE = {\n\t// ── Clock Dial (TimePickerTokens) ─────────────────────────────────────────\n\t/** ClockDialContainerSize = 256dp */\n\tclockDialSize: 256,\n\t/** ClockDialSelectorHandleContainerSize = 48dp */\n\tselectorHandleSize: 48,\n\t/** ClockDialSelectorCenterContainerSize = 8dp */\n\tselectorCenterSize: 8,\n\t/** ClockDialSelectorTrackContainerWidth = 2dp */\n\tselectorTrackWidth: 2,\n\n\t// ── Time Selector (TimeSelectorContainer) ─────────────────────────────────\n\t/** TimeSelectorContainerWidth = 96dp */\n\ttimeSelectorWidth: 96,\n\t/** TimeSelectorContainerHeight = 80dp */\n\ttimeSelectorHeight: 80,\n\t/** TimeSelector24HVerticalContainerWidth = 114dp (24h mode) */\n\ttimeSelector24hWidth: 114,\n\n\t// ── Period Selector (Picker mode) ─────────────────────────────────────────\n\t/** PeriodSelectorVerticalContainerWidth = 52dp */\n\tperiodSelectorVerticalWidth: 52,\n\t/** PeriodSelectorVerticalContainerHeight = 80dp */\n\tperiodSelectorVerticalHeight: 80,\n\t/** PeriodSelectorHorizontalContainerWidth = 216dp */\n\tperiodSelectorHorizWidth: 216,\n\t/** PeriodSelectorHorizontalContainerHeight = 38dp */\n\tperiodSelectorHorizHeight: 38,\n\n\t// ── Time Field (Input mode, TimeInputTokens) ───────────────────────────────\n\t/** TimeFieldContainerWidth = 96dp */\n\ttimeFieldWidth: 96,\n\t/** TimeFieldContainerHeight = 72dp */\n\ttimeFieldHeight: 72,\n\t/** PeriodSelectorContainerHeight (Input mode) = 72dp */\n\tperiodInputHeight: 72,\n\t/** PeriodSelectorContainerWidth (Input mode) = 52dp */\n\tperiodInputWidth: 52,\n} as const;\n","/**\n * @file time-picker/subcomponents/period-selector.tsx\n *\n * AM/PM toggle — equivalent to `VerticalPeriodToggle` / `PeriodToggleImpl` in TimePicker.kt.\n *\n * - Hidden when `is24hour = true`\n * - Vertical layout (AM top, PM bottom) — default layout for M3 vertical TimePicker\n * - Border: 1px Outline or gap between AM/PM\n * - Selected: bg-m3-primary-container + bold text\n * - Unselected: transparent + text-m3-on-surface-variant\n *\n * Ported from `VerticalPeriodToggle` + `PeriodToggleImpl` in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (PeriodToggleImpl)\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_SIZE } from \"../time-picker.tokens\";\nimport type { TimePickerState } from \"../time-picker.types\";\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface PeriodSelectorProps {\n\t/** Hoisted state — requires `isPm`, `isHourInputValid`, `setIsPm` */\n\tstate: TimePickerState;\n\t/**\n\t * Layout direction.\n\t * - \"vertical\": AM top, PM bottom (used in Vertical TimePicker)\n\t * - \"horizontal\": AM left, PM right (used in Horizontal TimePicker)\n\t * @default \"vertical\"\n\t */\n\tlayout?: \"vertical\" | \"horizontal\";\n\t/** Inline style override — used for custom dimensions */\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * AM/PM Period Selector.\n *\n * Automatically hidden when `state.is24hour = true`.\n *\n * Implementation following \"updated toggle\" pattern (isUpdatedTimepickerToggleEnabled = true):\n * - No outer container border\n * - Two distinct buttons with rounded-m3-full shape\n * - Selected: bg-m3-primary-container + bold text\n *\n * @example\n * ```tsx\n * <PeriodSelector state={state} layout=\"vertical\" />\n * ```\n */\nexport const PeriodSelector: React.FC<PeriodSelectorProps> = ({\n\tstate,\n\tlayout = \"vertical\",\n\tstyle,\n\tclassName,\n}) => {\n\t// Completely hidden in 24h format\n\tif (state.is24hour) return null;\n\n\tconst { isPm, isHourInputValid, setIsPm } = state;\n\n\tconst handleAmClick = (): void => {\n\t\t// Only update if hour input is valid — per Compose source:\n\t\t// onClick = { if (state.isPm && state.isHourInputValid) state.hour -= 12 }\n\t\tif (isPm && isHourInputValid) {\n\t\t\tsetIsPm(false);\n\t\t}\n\t};\n\n\tconst handlePmClick = (): void => {\n\t\t// onClick = { if (!state.isPm && state.isHourInputValid) state.hour += 12 }\n\t\tif (!isPm && isHourInputValid) {\n\t\t\tsetIsPm(true);\n\t\t}\n\t};\n\n\tconst isVertical = layout === \"vertical\";\n\n\treturn (\n\t\t<fieldset\n\t\t\taria-label=\"AM/PM\"\n\t\t\tstyle={{\n\t\t\t\twidth: isVertical\n\t\t\t\t\t? TP_SIZE.periodSelectorVerticalWidth\n\t\t\t\t\t: TP_SIZE.periodSelectorHorizWidth,\n\t\t\t\theight: isVertical\n\t\t\t\t\t? TP_SIZE.periodSelectorVerticalHeight\n\t\t\t\t\t: TP_SIZE.periodSelectorHorizHeight,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\tisVertical ? \"flex flex-col\" : \"flex flex-row\",\n\t\t\t\t\"gap-0 overflow-hidden\",\n\t\t\t\t// Container shape (CornerSmall = rounded-m3-sm)\n\t\t\t\t\"rounded-m3-sm\",\n\t\t\t\t// Border (period selector outline — updated toggle uses border on container)\n\t\t\t\t\"border border-m3-outline\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* AM Button */}\n\t\t\t<PeriodButton\n\t\t\t\tlabel=\"AM\"\n\t\t\t\tisSelected={!isPm}\n\t\t\t\tonClick={handleAmClick}\n\t\t\t\tisFirst\n\t\t\t\tisVertical={isVertical}\n\t\t\t/>\n\n\t\t\t{/* PM Button */}\n\t\t\t<PeriodButton\n\t\t\t\tlabel=\"PM\"\n\t\t\t\tisSelected={isPm}\n\t\t\t\tonClick={handlePmClick}\n\t\t\t\tisFirst={false}\n\t\t\t\tisVertical={isVertical}\n\t\t\t/>\n\t\t</fieldset>\n\t);\n};\n\nPeriodSelector.displayName = \"PeriodSelector\";\n\n// ─── Period Button ─────────────────────────────────────────────────────────────\n\ninterface PeriodButtonProps {\n\tlabel: \"AM\" | \"PM\";\n\tisSelected: boolean;\n\tonClick: () => void;\n\tisFirst: boolean;\n\tisVertical: boolean;\n}\n\nconst PeriodButton: React.FC<PeriodButtonProps> = ({\n\tlabel,\n\tisSelected,\n\tonClick,\n\tisFirst,\n\tisVertical,\n}) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-pressed={isSelected}\n\t\t\taria-label={label}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\t\"flex-1 flex items-center justify-center\",\n\t\t\t\t\"min-w-0 min-h-0\",\n\t\t\t\t// Typography — TitleMedium equivalent (16px, medium weight)\n\t\t\t\t\"text-[16px] leading-none\",\n\t\t\t\t// Selected state — from PeriodToggleImpl (useUpdatedToggle = true)\n\t\t\t\tisSelected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t\"bg-m3-tertiary-container text-m3-on-tertiary-container\",\n\t\t\t\t\t\t\t\"font-bold\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\"bg-transparent text-m3-on-surface-variant\", \"font-medium\"],\n\t\t\t\t// Divider between buttons via border\n\t\t\t\t!isFirst && isVertical && \"border-t border-m3-outline\",\n\t\t\t\t!isFirst && !isVertical && \"border-l border-m3-outline\",\n\t\t\t\t// Interaction\n\t\t\t\t\"cursor-pointer transition-colors transition-m3-fast-effects\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t)}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n};\n","/**\n * @file time-picker/subcomponents/time-field.tsx\n *\n * TimeField — display/input cell for hour or minute.\n *\n * Used in both modes:\n * - \"selector\" → <button> in TimePicker (dial), click to switch hour/minute selection\n * - \"input\" → <input> in TimeInput, manual number entry\n *\n * Ported from `TimeSelector` and `TimePickerTextField` composables in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (TimeSelector, TimePickerTextField)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_SIZE } from \"../time-picker.tokens\";\nimport type { TimePickerSelectionMode } from \"../time-picker.types\";\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface TimeFieldSelectorProps {\n\t/** Mode \"selector\" = button in dial picker */\n\tmode: \"selector\";\n\t/** Display value (number, zero-padded) */\n\n\tvalue: number;\n\t/** Field type: hour or minute */\n\tfield: TimePickerSelectionMode;\n\t/** Current picker selection mode */\n\tselection: TimePickerSelectionMode;\n\t/** Callback when user clicks to activate field */\n\tonActivate: () => void;\n\tclassName?: string;\n}\n\ninterface TimeFieldInputProps {\n\t/** Mode \"input\" = text input in TimeInput */\n\tmode: \"input\";\n\t/** Raw input value (bound to input element) */\n\tvalue: number;\n\t/** Field type: hour or minute */\n\tfield: TimePickerSelectionMode;\n\t/** Whether field is currently focused (controlled) */\n\tisFocused: boolean;\n\t/** Whether value is valid (for error state styling) */\n\tisValid: boolean;\n\t/** Callback when value changes */\n\tonChange: (value: number) => void;\n\t/** Callback fired when 2 digits are entered → advances focus to next field */\n\tonAutoAdvance?: () => void;\n\t/** Callback when field receives focus */\n\tonFocus?: () => void;\n\t/** Callback when field loses focus */\n\tonBlur?: () => void;\n\tclassName?: string;\n}\n\ntype TimeFieldProps = TimeFieldSelectorProps | TimeFieldInputProps;\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * TimeField component — renders hour/minute box according to mode.\n *\n * Selector mode: button with DisplayLarge typography, highlighted when selected.\n * Input mode: text input field with DisplayMedium typography, focus outline when focused.\n *\n * @example Selector mode (in TimePicker)\n\n * ```tsx\n * <TimeField\n * mode=\"selector\"\n * value={state.hourForDisplay}\n * field=\"hour\"\n * selection={state.selection}\n * onActivate={() => state.setSelection('hour')}\n * />\n * ```\n *\n * @example Input mode (trong TimeInput)\n * ```tsx\n * <TimeField\n * mode=\"input\"\n * value={state.hourInput}\n * field=\"hour\"\n * isFocused={focusedField === 'hour'}\n * isValid={state.isHourInputValid}\n * onChange={(v) => state.setHourInput(v)}\n * onAutoAdvance={() => setFocusedField('minute')}\n * />\n * ```\n */\nexport const TimeField: React.FC<TimeFieldProps> = (props) => {\n\tif (props.mode === \"selector\") {\n\t\treturn <SelectorField {...props} />;\n\t}\n\treturn <InputField {...props} />;\n};\n\nTimeField.displayName = \"TimeField\";\n\n// ─── Selector Field (Dial mode) ────────────────────────────────────────────────\n\nconst SelectorField: React.FC<TimeFieldSelectorProps> = ({\n\tvalue,\n\tfield,\n\tselection,\n\tonActivate,\n\tclassName,\n}) => {\n\tconst isSelected = selection === field;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={field === \"hour\" ? \"Hour\" : \"Minute\"}\n\t\t\taria-pressed={isSelected}\n\t\t\tonClick={onActivate}\n\t\t\tstyle={{\n\t\t\t\twidth: TP_SIZE.timeSelectorWidth,\n\t\t\t\theight: TP_SIZE.timeSelectorHeight,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t// Layout\n\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\"rounded-m3-sm\",\n\t\t\t\t// Typography — DisplayLarge equivalent (57px)\n\t\t\t\t\"text-[57px] font-normal leading-none tabular-nums\",\n\t\t\t\t// State\n\t\t\t\tisSelected\n\t\t\t\t\t? \"bg-m3-primary-container text-m3-on-primary-container\"\n\t\t\t\t\t: \"bg-m3-surface-container-highest text-m3-on-surface\",\n\t\t\t\t// Interaction\n\t\t\t\t\"cursor-pointer transition-colors transition-m3-fast-effects\",\n\t\t\t\t\"hover:opacity-90 active:opacity-80\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{String(value).padStart(2, \"0\")}\n\t\t</button>\n\t);\n};\n\n// ─── Input Field (Text input mode) ────────────────────────────────────────────\n\nconst InputField: React.FC<TimeFieldInputProps> = ({\n\tvalue,\n\tfield,\n\tisFocused,\n\tisValid,\n\tonChange,\n\tonAutoAdvance,\n\tonFocus,\n\tonBlur,\n\tclassName,\n}) => {\n\t// Track current input content for digit-by-digit handling\n\tconst [inputText, setInputText] = React.useState(\n\t\tString(value).padStart(2, \"0\"),\n\t);\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\t// Sync from state when value changes externally (e.g. on reset)\n\tReact.useEffect(() => {\n\t\tif (!isFocused) {\n\t\t\tsetInputText(String(value).padStart(2, \"0\"));\n\t\t}\n\t}, [value, isFocused]);\n\n\t// Focus/blur the input element when isFocused prop changes\n\tReact.useEffect(() => {\n\t\tif (isFocused) {\n\t\t\tinputRef.current?.focus();\n\t\t\tinputRef.current?.select();\n\t\t}\n\t}, [isFocused]);\n\n\tconst handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n\t\tconst raw = e.target.value.replace(/\\D/g, \"\"); // retain digits only\n\t\tconst limited = raw.slice(-2); // max 2 digits\n\n\t\tsetInputText(limited);\n\n\t\tconst numVal = parseInt(limited, 10);\n\t\tif (!Number.isNaN(numVal)) {\n\t\t\tonChange(numVal);\n\n\t\t\t// Auto-advance after entering 2 digits\n\t\t\tif (limited.length === 2) {\n\t\t\t\tonAutoAdvance?.();\n\t\t\t}\n\t\t} else if (limited === \"\") {\n\t\t\t// Empty input — reset to 0 while keeping display empty\n\t\t\tonChange(0);\n\t\t}\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n\t\t// Allow: digits, Backspace, Delete, Tab, Arrow keys\n\n\t\tconst allowed = [\n\t\t\t\"Backspace\",\n\t\t\t\"Delete\",\n\t\t\t\"Tab\",\n\t\t\t\"ArrowLeft\",\n\t\t\t\"ArrowRight\",\n\t\t\t\"Enter\",\n\t\t];\n\t\tconst isDigit = e.key >= \"0\" && e.key <= \"9\";\n\t\tif (!isDigit && !allowed.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t}\n\t};\n\n\tconst handleFocus = (e: React.FocusEvent<HTMLInputElement>): void => {\n\t\te.target.select(); // select all text khi focus\n\t\tonFocus?.();\n\t};\n\n\tconst displayText = isFocused ? inputText : String(value).padStart(2, \"0\");\n\n\tconst isError = isFocused && !isValid && inputText.length === 2;\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\twidth: TP_SIZE.timeFieldWidth,\n\t\t\t\theight: TP_SIZE.timeFieldHeight,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center rounded-m3-sm\",\n\t\t\t\t// Background state\n\t\t\t\tisFocused\n\t\t\t\t\t? \"bg-m3-primary-container\"\n\t\t\t\t\t: \"bg-m3-surface-container-highest\",\n\t\t\t\t// Error border\n\t\t\t\tisError && \"ring-2 ring-m3-error\",\n\t\t\t\t// Focus outline (non-error)\n\t\t\t\tisFocused && !isError && \"ring-2 ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"text\"\n\t\t\t\tinputMode=\"numeric\"\n\t\t\t\tvalue={displayText}\n\t\t\t\tmaxLength={2}\n\t\t\t\taria-label={field === \"hour\" ? \"Hour\" : \"Minute\"}\n\t\t\t\taria-invalid={isError}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonFocus={handleFocus}\n\t\t\t\tonBlur={onBlur}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Reset input styles\n\t\t\t\t\t\"w-full h-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\"text-center tabular-nums select-all\",\n\t\t\t\t\t// Typography — DisplayMedium equivalent (45px)\n\t\t\t\t\t\"text-[45px] font-normal leading-none\",\n\t\t\t\t\t// Color\n\t\t\t\t\tisFocused ? \"text-m3-on-primary-container\" : \"text-m3-on-surface\",\n\t\t\t\t\t// Caret\n\t\t\t\t\t\"caret-m3-primary\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","/**\n * @file time-picker/time-input.tsx\n *\n * TimeInput — text input mode for time entry.\n *\n * Layout:\n * ```\n * ┌────────────────────────────────┐\n * │ Enter time │ ← headline (labelMedium)\n * │ [07] : [00] [AM] │ ← input fields + PeriodSelector\n * │ [PM] │\n * │ Hour Minute │ ← helper labels (bodySmall)\n * └────────────────────────────────┘\n * ```\n *\n * Behavior:\n * - Two `<input>` fields for hour and minute\n * - Auto-advance: entering 2 valid digits automatically focuses next field\n * - Validation: error state when value is out of range\n * - AM/PM toggle on right (hidden when is24hour)\n *\n * Ported from `TimeInputImpl` in TimePicker.kt.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (TimeInputImpl)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { PeriodSelector } from \"./subcomponents/period-selector\";\nimport { TimeField } from \"./subcomponents/time-field\";\nimport { TP_SIZE } from \"./time-picker.tokens\";\nimport type { TimeInputProps } from \"./time-picker.types\";\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * TimeInput — text input mode.\n *\n * Used with `useTimePickerState`:\n *\n * @example\n * ```tsx\n * const state = useTimePickerState({ initialHour: 9, initialMinute: 30 });\n *\n * // Standalone\n * <TimeInput state={state} />\n *\n * // In dialog (with toggle)\n * <TimePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * confirmButton={<Button variant=\"text\" onClick={() => setOpen(false)}>OK</Button>}\n * >\n * <TimeInput state={state} />\n * </TimePickerDialog>\n * ```\n */\nexport const TimeInput: React.FC<TimeInputProps> = ({ state, className }) => {\n\tconst { is24hour, setHourInput, setMinuteInput, setSelection } = state;\n\n\tconst [focusedField, setFocusedField] = React.useState<\n\t\t\"hour\" | \"minute\" | null\n\t>(null);\n\n\tconst handleHourAutoAdvance = (): void => {\n\t\tsetFocusedField(\"minute\");\n\t\tsetSelection(\"minute\");\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-m3-surface-container-high rounded-m3-xl\",\n\t\t\t\t\"flex flex-col\",\n\t\t\t\t\"p-6 gap-0 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* ── Headline ── */}\n\t\t\t<p\n\t\t\t\tclassName=\"w-full text-left text-m3-on-surface-variant mb-5\"\n\t\t\t\tstyle={{ fontSize: \"12px\", fontWeight: 500, letterSpacing: \"0.1em\" }}\n\t\t\t>\n\t\t\t\tEnter time\n\t\t\t</p>\n\n\t\t\t{/* ── Input Row: fields + separator + AM/PM ── */}\n\t\t\t<div className=\"flex flex-row items-start gap-2\">\n\t\t\t\t{/* Hour input */}\n\t\t\t\t<div className=\"flex flex-col items-center gap-1\">\n\t\t\t\t\t<TimeField\n\t\t\t\t\t\tmode=\"input\"\n\t\t\t\t\t\tvalue={state.hourInput}\n\t\t\t\t\t\tfield=\"hour\"\n\t\t\t\t\t\tisFocused={focusedField === \"hour\"}\n\t\t\t\t\t\tisValid={state.isHourInputValid}\n\t\t\t\t\t\tonChange={setHourInput}\n\t\t\t\t\t\tonAutoAdvance={handleHourAutoAdvance}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tsetFocusedField(\"hour\");\n\t\t\t\t\t\t\tsetSelection(\"hour\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonBlur={() => setFocusedField(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"text-[11px] text-m3-on-surface-variant font-normal leading-none mt-1\">\n\t\t\t\t\t\tHour\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Separator \":\" */}\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"text-m3-on-surface text-center self-start\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontSize: \"57px\",\n\t\t\t\t\t\tfontWeight: 400,\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\twidth: 24,\n\t\t\t\t\t\t// Aligned with height of input field\n\t\t\t\t\t\tmarginTop: `${(TP_SIZE.timeFieldHeight - 57) / 2}px`,\n\t\t\t\t\t}}\n\t\t\t\t\taria-hidden\n\t\t\t\t>\n\t\t\t\t\t:\n\t\t\t\t</span>\n\n\t\t\t\t{/* Minute input */}\n\t\t\t\t<div className=\"flex flex-col items-center gap-1\">\n\t\t\t\t\t<TimeField\n\t\t\t\t\t\tmode=\"input\"\n\t\t\t\t\t\tvalue={state.minuteInput}\n\t\t\t\t\t\tfield=\"minute\"\n\t\t\t\t\t\tisFocused={focusedField === \"minute\"}\n\t\t\t\t\t\tisValid={state.isMinuteInputValid}\n\t\t\t\t\t\tonChange={setMinuteInput}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tsetFocusedField(\"minute\");\n\t\t\t\t\t\t\tsetSelection(\"minute\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonBlur={() => setFocusedField(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t{/* Helper label */}\n\t\t\t\t\t<span className=\"text-[11px] text-m3-on-surface-variant font-normal leading-none mt-1\">\n\t\t\t\t\t\tMinute\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* AM/PM (hidden when is24hour) */}\n\t\t\t\t{!is24hour && (\n\t\t\t\t\t<PeriodSelector\n\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\tlayout=\"vertical\"\n\t\t\t\t\t\tclassName=\"ml-2 self-start\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: TP_SIZE.periodInputHeight,\n\t\t\t\t\t\t\twidth: TP_SIZE.periodInputWidth,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTimeInput.displayName = \"TimeInput\";\n","/**\n * @file time-picker/subcomponents/clock-dial.tsx\n *\n * Clock dial SVG — clock face with pointer interaction.\n *\n * Renders SVG circle with:\n * - Background circle (SurfaceContainerHighest)\n * - 12 (or 24) numbers positioned evenly on circle\n * - Selector: center dot + track line + handle circle (all Primary)\n * - Pointer events: click + drag to pick hour/minute\n * - autoSwitchToMinute: automatically switches to minute after hour selection\n *\n * Math ported from `AnalogTimePickerState` in TimePicker.kt:\n * - RadiansPerHour, RadiansPerMinute, InnerCircleToSizeRatio, OuterCircleToSizeRatio\n * - `rotateTo`, `onTap` logic\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePicker.kt (ClockFace, AnalogTimePickerState)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { TP_COLORS, TP_SIZE } from \"../time-picker.tokens\";\nimport type {\n\tTimePickerSelectionMode,\n\tTimePickerState,\n} from \"../time-picker.types\";\n\n// ─── Constants (from TimePicker.kt) ──────────────────────────────────────────────\n\nconst FULL_CIRCLE = Math.PI * 2;\nconst QUARTER_CIRCLE = Math.PI / 2;\nconst RADIANS_PER_HOUR = FULL_CIRCLE / 12;\nconst RADIANS_PER_MINUTE = FULL_CIRCLE / 60;\n\n/**\n * OuterCircleToSizeRatio — 101dp on 256dp dial.\n */\nconst OUTER_CIRCLE_RATIO = 101 / TP_SIZE.clockDialSize;\n\n/**\n * InnerCircleToSizeRatio — 69dp on 256dp dial.\n */\nconst INNER_CIRCLE_RATIO = 69 / TP_SIZE.clockDialSize;\n\n/** SVG Center = diameter / 2 */\nconst CENTER = TP_SIZE.clockDialSize / 2; // 128\n\n/** Outer ring radius (hours 1-12, minutes) */\nconst OUTER_RADIUS = TP_SIZE.clockDialSize * OUTER_CIRCLE_RATIO; // ~106.8\n\n/** Inner ring radius (hours 13-23 in 24h mode) */\nconst INNER_RADIUS = TP_SIZE.clockDialSize * INNER_CIRCLE_RATIO; // ~74.9\n\n/** Handle circle radius = selectorHandleSize / 2 */\nconst HANDLE_RADIUS = TP_SIZE.selectorHandleSize / 2; // 24\n\n/**\n * SELECTOR_GAP — minimum gap from handle edge to container edge.\n * MD3 spec: 4dp gap between selector handle and background circle.\n */\nconst SELECTOR_GAP = 4;\n\n// ─── Number data ────────────────────────────────────────────────────────────────\n\ninterface ClockNumber {\n\tvalue: number;\n\tx: number;\n\ty: number;\n\tradius: number; // for 24h inner ring detection\n}\n\n/**\n * Calculates number position on dial circle.\n * Starting from 12 o'clock (top) = -PI/2\n */\nconst getPositionOnDial = (\n\tindex: number,\n\ttotal: number,\n\tradius: number,\n): { x: number; y: number } => {\n\tconst angle = (index / total) * FULL_CIRCLE - QUARTER_CIRCLE;\n\treturn {\n\t\tx: CENTER + radius * Math.cos(angle),\n\t\ty: CENTER + radius * Math.sin(angle),\n\t};\n};\n\n/** Generates number list for 12h hour mode (1-12) */\nconst buildHour12Numbers = (): ClockNumber[] =>\n\tArray.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i === 0 ? 12 : i;\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: OUTER_RADIUS };\n\t});\n\n/** Generates number list for 24h mode (0-23, outer 0-11, inner 12-23) */\nconst buildHour24Numbers = (): ClockNumber[] => {\n\tconst outer: ClockNumber[] = Array.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i; // 0-11\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: OUTER_RADIUS };\n\t});\n\tconst inner: ClockNumber[] = Array.from({ length: 12 }, (_, i) => {\n\t\tconst hour = i + 12; // 12-23\n\t\tconst pos = getPositionOnDial(i, 12, INNER_RADIUS);\n\t\treturn { value: hour, ...pos, radius: INNER_RADIUS };\n\t});\n\treturn [...outer, ...inner];\n};\n\n/** Generates number list for minute mode (0, 5, 10, ..., 55) */\nconst buildMinuteNumbers = (): ClockNumber[] =>\n\tArray.from({ length: 12 }, (_, i) => {\n\t\tconst minute = i * 5; // 0, 5, 10, ..., 55\n\t\tconst pos = getPositionOnDial(i, 12, OUTER_RADIUS);\n\t\treturn { value: minute, ...pos, radius: OUTER_RADIUS };\n\t});\n\n// ─── Math ──────────────────────────────────────────────────────────────────────\n\n/**\n * Calculates angle from pointer position (x, y) relative to center.\n * Similar to `atan2` in Compose — returns angle in [-PI, PI].\n * Offset by -QUARTER_CIRCLE so 12 o'clock = 0 rad.\n */\nconst getAngleFromPointer = (x: number, y: number): number => {\n\treturn Math.atan2(y - CENTER, x - CENTER);\n};\n\n/**\n * Normalizes angle to range [0, 2PI).\n */\nconst normalizeAngle = (angle: number): number => {\n\tlet a = angle % FULL_CIRCLE;\n\tif (a < 0) a += FULL_CIRCLE;\n\treturn a;\n};\n\n/**\n * Converts angle → hour (12h mode, 1-12).\n * Ported from `Float.toHour()` in AnalogTimePickerState.\n */\nconst angleToHour12 = (angle: number): number => {\n\tconst hourOffset = RADIANS_PER_HOUR / 2;\n\tconst totalOffset = hourOffset + QUARTER_CIRCLE;\n\tconst hour = Math.round((angle + totalOffset) / RADIANS_PER_HOUR) % 12;\n\treturn hour === 0 ? 12 : hour;\n};\n\n/**\n * Converts angle → minute (0-55, step 5 on click, step 1 on drag).\n * Ported from `Float.toMinute()` in AnalogTimePickerState.\n */\nconst angleToMinute = (angle: number, snap = true): number => {\n\tif (snap) {\n\t\tconst minuteOffset = RADIANS_PER_MINUTE / 2;\n\t\tconst totalOffset = minuteOffset + QUARTER_CIRCLE;\n\t\tconst raw = Math.round((angle + totalOffset) / RADIANS_PER_MINUTE) % 60;\n\t\treturn raw < 0 ? raw + 60 : raw;\n\t}\n\t// Drag mode — step 1\n\tconst normalized = normalizeAngle(angle + QUARTER_CIRCLE);\n\tconst raw = Math.round((normalized / FULL_CIRCLE) * 60) % 60;\n\treturn raw < 0 ? raw + 60 : raw;\n};\n\n/**\n * Calculates selector handle position from angle and is24h/isPm.\n * Ported from `AnalogTimePickerState.selectorPos`.\n */\nconst getSelectorPosition = (\n\tangle: number,\n\tselection: TimePickerSelectionMode,\n\tis24hour: boolean,\n\tisPm: boolean,\n): { x: number; y: number } => {\n\t// Inner circle for 24h PM hours (13-23)\n\tconst useInner = is24hour && isPm && selection === \"hour\";\n\tconst baseRadius = useInner ? INNER_RADIUS : OUTER_RADIUS;\n\n\t// MD3: clamps handle center so handle edge maintains SELECTOR_GAP to container edge.\n\t// maxLength = CENTER - HANDLE_RADIUS - GAP = 128 - 24 - 4 = 100px\n\tconst length = Math.min(baseRadius, CENTER - HANDLE_RADIUS - SELECTOR_GAP);\n\n\treturn {\n\t\tx: CENTER + length * Math.cos(angle),\n\t\ty: CENTER + length * Math.sin(angle),\n\t};\n};\n\n/**\n * Calculates display angle from hour/minute value.\n * Ported from `hourAngle = RadiansPerHour * (state.hour % 12) - FullCircle / 4`\n */\nconst valueToAngle = (\n\tvalue: number,\n\tselection: TimePickerSelectionMode,\n): number => {\n\tif (selection === \"hour\") {\n\t\treturn RADIANS_PER_HOUR * (value % 12) - QUARTER_CIRCLE;\n\t}\n\treturn RADIANS_PER_MINUTE * value - QUARTER_CIRCLE;\n};\n\n// ─── Props ─────────────────────────────────────────────────────────────────────\n\ninterface ClockDialProps {\n\t/** Hoisted state */\n\tstate: TimePickerState;\n\t/**\n\t * Automatically switches selection to \"minute\" after picking hour.\n\t * @default true\n\t */\n\tautoSwitchToMinute?: boolean;\n\t/** Inline style override */\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * ClockDial — SVG clock face with pointer interaction.\n *\n * Renders numbers around dial circle and selector handle, supporting:\n * - Click to select specific hour/minute\n * - Drag for continuous rotation\n * - autoSwitchToMinute\n * - 24h mode (dual ring: outer 0-11, inner 12-23)\n *\n * @example\n * ```tsx\n * <ClockDial state={state} autoSwitchToMinute />\n * ```\n */\nexport const ClockDial: React.FC<ClockDialProps> = ({\n\tstate,\n\tautoSwitchToMinute = true,\n\tstyle,\n\tclassName,\n}) => {\n\tconst {\n\t\tselection,\n\t\tis24hour,\n\t\tisPm,\n\t\thour,\n\t\tminute,\n\t\tsetHour,\n\t\tsetMinute,\n\t\tsetSelection,\n\t} = state;\n\n\t// Calculate display angle from current value\n\tconst displayAngle = React.useMemo(() => {\n\t\tif (selection === \"hour\") {\n\t\t\treturn valueToAngle(hour, \"hour\");\n\t\t}\n\t\treturn valueToAngle(minute, \"minute\");\n\t}, [selection, hour, minute]);\n\n\tconst selectorPos = React.useMemo(\n\t\t() => getSelectorPosition(displayAngle, selection, is24hour, isPm),\n\t\t[displayAngle, selection, is24hour, isPm],\n\t);\n\n\tconst trackEnd = React.useMemo(() => {\n\t\tconst dx = selectorPos.x - CENTER;\n\t\tconst dy = selectorPos.y - CENTER;\n\t\tconst length = Math.hypot(dx, dy);\n\t\tif (length === 0) return selectorPos;\n\t\treturn {\n\t\t\tx: selectorPos.x - (dx / length) * HANDLE_RADIUS,\n\t\t\ty: selectorPos.y - (dy / length) * HANDLE_RADIUS,\n\t\t};\n\t}, [selectorPos]);\n\n\tconst numbers = React.useMemo((): ClockNumber[] => {\n\t\tif (selection === \"minute\") return buildMinuteNumbers();\n\t\tif (is24hour) return buildHour24Numbers();\n\t\treturn buildHour12Numbers();\n\t}, [selection, is24hour]);\n\n\tconst isDragging = React.useRef(false);\n\tconst svgRef = React.useRef<SVGSVGElement>(null);\n\n\t/** Convert pointer event → SVG coordinate */\n\tconst getSVGPoint = (\n\t\te: PointerEvent | React.PointerEvent,\n\t): { x: number; y: number } => {\n\t\tconst svg = svgRef.current;\n\t\tif (!svg) return { x: e.clientX, y: e.clientY };\n\t\tconst rect = svg.getBoundingClientRect();\n\t\tconst scaleX = TP_SIZE.clockDialSize / rect.width;\n\t\tconst scaleY = TP_SIZE.clockDialSize / rect.height;\n\t\treturn {\n\t\t\tx: (e.clientX - rect.left) * scaleX,\n\t\t\ty: (e.clientY - rect.top) * scaleY,\n\t\t};\n\t};\n\n\t/** Handles new value from pointer position */\n\tconst handlePosition = (x: number, y: number, isPointerUp = false): void => {\n\t\tconst angle = getAngleFromPointer(x, y);\n\n\t\tif (selection === \"hour\") {\n\t\t\tlet newHour: number;\n\n\t\t\tif (is24hour) {\n\t\t\t\t// 24h: check distance from center to differentiate inner (PM) / outer (AM)\n\t\t\t\tconst dist = Math.sqrt((x - CENTER) ** 2 + (y - CENTER) ** 2);\n\t\t\t\tconst isPmHour = dist < (OUTER_RADIUS + INNER_RADIUS) / 2;\n\t\t\t\tconst hour12 = angleToHour12(angle);\n\t\t\t\tnewHour = isPmHour ? hour12 + 12 : hour12 === 12 ? 0 : hour12;\n\t\t\t} else {\n\t\t\t\tconst hour12 = angleToHour12(angle);\n\t\t\t\t// Convert 12h display → 24h internal\n\t\t\t\tnewHour = hour12 === 12 ? (isPm ? 12 : 0) : isPm ? hour12 + 12 : hour12;\n\t\t\t}\n\n\t\t\tsetHour(newHour);\n\n\t\t\t// Auto-switch: switch to minute after pointer up\n\t\t\tif (isPointerUp && autoSwitchToMinute) {\n\t\t\t\tsetTimeout(() => setSelection(\"minute\"), 100);\n\t\t\t}\n\t\t} else {\n\t\t\tconst newMinute = angleToMinute(angle, !isDragging.current);\n\t\t\tsetMinute(newMinute);\n\t\t}\n\t};\n\n\tconst handlePointerDown = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\te.currentTarget.setPointerCapture(e.pointerId);\n\t\tisDragging.current = false;\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y);\n\t};\n\n\tconst handlePointerMove = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\tif (e.buttons === 0) return; // mouse not pressed\n\t\tisDragging.current = true;\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y);\n\t};\n\n\tconst handlePointerUp = (e: React.PointerEvent<SVGSVGElement>): void => {\n\t\te.currentTarget.releasePointerCapture(e.pointerId);\n\t\tconst { x, y } = getSVGPoint(e);\n\t\thandlePosition(x, y, true);\n\t\tisDragging.current = false;\n\t};\n\n\tconst getDisplayHour = (): number => {\n\t\tif (is24hour) return hour;\n\t\treturn hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n\t};\n\n\t/**\n\t * MD3 spec: when the handle circle overlaps a number, the number switches to OnPrimary.\n\t * For minutes, we use geometric distance to avoid nearest-5 rounding causing abrupt jumps.\n\t */\n\tconst isNumberHighlighted = (num: ClockNumber): boolean => {\n\t\tif (selection === \"hour\") return num.value === getDisplayHour();\n\t\tconst dx = selectorPos.x - num.x;\n\t\tconst dy = selectorPos.y - num.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy) < HANDLE_RADIUS;\n\t};\n\n\t/**\n\t * Hour numbers move to sit inside the handle circle.\n\t * Minute numbers always stay at their fixed positions — the handle naturally overlaps them.\n\t */\n\tconst isNumberAtHandle = (num: ClockNumber): boolean => {\n\t\tif (selection === \"hour\") return num.value === getDisplayHour();\n\t\treturn false;\n\t};\n\n\t// ── Render ────────────────────────────────────────────────────────────────\n\n\treturn (\n\t\t<svg\n\t\t\tref={svgRef}\n\t\t\twidth={TP_SIZE.clockDialSize}\n\t\t\theight={TP_SIZE.clockDialSize}\n\t\t\tviewBox={`0 0 ${TP_SIZE.clockDialSize} ${TP_SIZE.clockDialSize}`}\n\t\t\trole=\"img\"\n\t\t\taria-label={`Clock face, ${selection === \"hour\" ? \"select hour\" : \"select minute\"}`}\n\t\t\tstyle={style}\n\t\t\toverflow=\"visible\"\n\t\t\tclassName={cn(\"touch-none select-none cursor-pointer\", className)}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={handlePointerUp}\n\t\t>\n\t\t\t{/* ── Background circle ── */}\n\t\t\t<circle cx={CENTER} cy={CENTER} r={CENTER} fill={TP_COLORS.clockDial} />\n\n\t\t\t{/* ── Selector track (line from center → handle) ── */}\n\t\t\t<line\n\t\t\t\tx1={CENTER}\n\t\t\t\ty1={CENTER}\n\t\t\t\tx2={trackEnd.x}\n\t\t\t\ty2={trackEnd.y}\n\t\t\t\tstroke={TP_COLORS.selectorTrack}\n\t\t\t\tstrokeWidth={TP_SIZE.selectorTrackWidth}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\n\t\t\t{/* ── Handle circle ── */}\n\t\t\t<circle\n\t\t\t\tcx={selectorPos.x}\n\t\t\t\tcy={selectorPos.y}\n\t\t\t\tr={HANDLE_RADIUS}\n\t\t\t\tfill={TP_COLORS.selectorHandle}\n\t\t\t/>\n\n\t\t\t{/* ── Center dot — rendered after handle to stay on top ── */}\n\t\t\t<circle\n\t\t\t\tcx={CENTER}\n\t\t\t\tcy={CENTER}\n\t\t\t\tr={TP_SIZE.selectorCenterSize / 2}\n\t\t\t\tfill={TP_COLORS.selectorCenter}\n\t\t\t/>\n\n\t\t\t{/* ── Number labels — rendered last on top of handle ── */}\n\t\t\t{numbers.map((num) => {\n\t\t\t\tconst highlighted = isNumberHighlighted(num);\n\t\t\t\tconst atHandle = isNumberAtHandle(num);\n\t\t\t\t// Only move into handle when exactly matching selected tick\n\n\t\t\t\treturn (\n\t\t\t\t\t<text\n\t\t\t\t\t\tkey={`${num.value}-${num.radius}`}\n\t\t\t\t\t\tx={atHandle ? selectorPos.x : num.x}\n\t\t\t\t\t\ty={atHandle ? selectorPos.y : num.y}\n\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\tdominantBaseline=\"central\"\n\t\t\t\t\t\tfontSize={is24hour && num.radius === INNER_RADIUS ? 12 : 14}\n\t\t\t\t\t\tfontWeight={highlighted ? \"600\" : \"400\"}\n\t\t\t\t\t\tfill={\n\t\t\t\t\t\t\thighlighted\n\t\t\t\t\t\t\t\t? TP_COLORS.clockDialSelected\n\t\t\t\t\t\t\t\t: TP_COLORS.clockDialUnselected\n\t\t\t\t\t\t}\n\t\t\t\t\t\taria-label={String(num.value)}\n\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{selection === \"hour\" && is24hour\n\t\t\t\t\t\t\t? String(num.value).padStart(2, \"0\")\n\t\t\t\t\t\t\t: num.value}\n\t\t\t\t\t</text>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n};\n\nClockDial.displayName = \"ClockDial\";\n","/**\n * @file time-picker/time-picker.tsx\n *\n * Android MD3 clock picker. The picker uses a compact vertical arrangement in\n * portrait and moves the clock beside the display on larger landscape screens.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { ClockDial } from \"./subcomponents/clock-dial\";\nimport { PeriodSelector } from \"./subcomponents/period-selector\";\nimport { TimeField } from \"./subcomponents/time-field\";\nimport { TP_SIZE } from \"./time-picker.tokens\";\nimport type {\n\tTimePickerLayout,\n\tTimePickerProps,\n\tTimePickerState,\n} from \"./time-picker.types\";\n\nconst getHourForDisplay = (state: TimePickerState): number => {\n\tconst { hour, is24hour, isPm } = state;\n\tif (is24hour) return hour;\n\tif (hour % 12 === 0) return 12;\n\treturn isPm ? hour - 12 : hour;\n};\n\nconst getAutoLayout = (): Exclude<TimePickerLayout, \"auto\"> => {\n\tif (typeof window === \"undefined\") return \"vertical\";\n\tconst { innerHeight, innerWidth } = window;\n\treturn innerWidth >= 600 && innerHeight >= 300 && innerWidth >= innerHeight\n\t\t? \"horizontal\"\n\t\t: \"vertical\";\n};\n\nconst useResolvedLayout = (\n\tlayout: TimePickerLayout,\n): Exclude<TimePickerLayout, \"auto\"> => {\n\t// Start vertical so SSR and the first client render agree; measure after mount.\n\tconst [autoLayout, setAutoLayout] =\n\t\tReact.useState<Exclude<TimePickerLayout, \"auto\">>(\"vertical\");\n\n\tReact.useEffect(() => {\n\t\tif (layout !== \"auto\") return;\n\t\tconst updateLayout = () => setAutoLayout(getAutoLayout());\n\t\tupdateLayout();\n\t\twindow.addEventListener(\"resize\", updateLayout);\n\t\treturn () => window.removeEventListener(\"resize\", updateLayout);\n\t}, [layout]);\n\n\treturn layout === \"auto\" ? autoLayout : layout;\n};\n\ninterface ClockDisplayProps {\n\tstate: TimePickerState;\n\tlayout: Exclude<TimePickerLayout, \"auto\">;\n}\n\nconst ClockDisplay: React.FC<ClockDisplayProps> = ({ state, layout }) => {\n\tconst { selection, setSelection, is24hour } = state;\n\tconst periodLayout = layout === \"horizontal\" ? \"horizontal\" : \"vertical\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex\",\n\t\t\t\tlayout === \"horizontal\"\n\t\t\t\t\t? \"flex-col items-start justify-center\"\n\t\t\t\t\t: \"flex-row items-center justify-center\",\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-center\">\n\t\t\t\t<TimeField\n\t\t\t\t\tmode=\"selector\"\n\t\t\t\t\tvalue={getHourForDisplay(state)}\n\t\t\t\t\tfield=\"hour\"\n\t\t\t\t\tselection={selection}\n\t\t\t\t\tonActivate={() => setSelection(\"hour\")}\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName=\"w-6 text-center text-[57px] leading-none font-normal text-m3-on-surface\"\n\t\t\t\t>\n\t\t\t\t\t:\n\t\t\t\t</span>\n\t\t\t\t<TimeField\n\t\t\t\t\tmode=\"selector\"\n\t\t\t\t\tvalue={state.minute}\n\t\t\t\t\tfield=\"minute\"\n\t\t\t\t\tselection={selection}\n\t\t\t\t\tonActivate={() => setSelection(\"minute\")}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{!is24hour ? (\n\t\t\t\t<PeriodSelector\n\t\t\t\t\tstate={state}\n\t\t\t\t\tlayout={periodLayout}\n\t\t\t\t\tclassName={layout === \"horizontal\" ? \"mt-3\" : \"ml-3\"}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n};\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n\tstate,\n\tlayout = \"auto\",\n\tclassName,\n}) => {\n\tconst resolvedLayout = useResolvedLayout(layout);\n\n\treturn (\n\t\t<div\n\t\t\tdata-time-picker-layout={resolvedLayout}\n\t\t\tclassName={cn(\n\t\t\t\t\"time-picker rounded-m3-xl bg-m3-surface-container-high p-6 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<p className=\"mb-5 text-left text-[12px] font-medium tracking-[0.1em] text-m3-on-surface-variant\">\n\t\t\t\tSelect time\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex\",\n\t\t\t\t\tresolvedLayout === \"horizontal\"\n\t\t\t\t\t\t? \"flex-row items-center gap-[52px]\"\n\t\t\t\t\t\t: \"flex-col items-center gap-9\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<ClockDisplay state={state} layout={resolvedLayout} />\n\t\t\t\t<ClockDial\n\t\t\t\t\tstate={state}\n\t\t\t\t\tautoSwitchToMinute\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: TP_SIZE.clockDialSize,\n\t\t\t\t\t\theight: TP_SIZE.clockDialSize,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTimePicker.displayName = \"TimePicker\";\n","/**\n * @file time-picker/time-picker-dialog.tsx\n *\n * TimePickerDialog — modal container for TimePicker and TimeInput.\n * Reuses Dialog + DialogPortal primitives matching DatePickerDialog pattern.\n *\n * Layout:\n * ```\n * ┌─────────────────────┐\n * │ [Content] │ ← TimePicker or TimeInput\n * │─────────────────────│\n * │ 🎹 [Cancel] [OK] │ ← footer: modeToggle + spacer + dismiss + confirm\n * └─────────────────────┘\n * ```\n *\n * Tokens from TimePickerDialog.kt (shared with DatePickerDialog):\n * - ContainerColor = SurfaceContainerHigh\n * - ContainerShape = CornerExtraLarge (28px)\n * - ContainerElevation = Level3\n *\n * Ported from `TimePickerDialog.kt` and `DatePickerDialog` pattern.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerDialog.kt\n * @see packages/react/src/ui/date-time-pickers/date-picker/date-picker-dialog.tsx\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { m } from \"motion/react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Dialog, DialogPortal } from \"../../dialog\";\nimport {\n\tPICKER_CONTENT_ANIM,\n\tPICKER_OVERLAY_ANIM,\n} from \"../shared/animation-tokens\";\nimport type { TimePickerDialogProps } from \"./time-picker.types\";\n\n/**\n * TimePickerDialog — modal dialog container for TimePicker / TimeInput.\n *\n * Reuses `<Dialog>` (Root) and `<DialogPortal>` (AnimatePresence + Portal)\n * while managing Overlay and Content to preserve MD3 Time Picker specs.\n *\n * @example Basic usage\n\n * ```tsx\n * const state = useTimePickerState({ initialHour: 7 });\n * const [open, setOpen] = React.useState(false);\n * const [mode, setMode] = React.useState<'dial' | 'input'>('dial');\n *\n * <TimePickerDialog\n * open={open}\n * onDismiss={() => setOpen(false)}\n * modeToggleButton={\n * <button onClick={() => setMode(m => m === 'dial' ? 'input' : 'dial')}>\n * <span className=\"md-icon\">{mode === 'dial' ? 'keyboard' : 'schedule'}</span>\n * </button>\n * }\n * confirmButton={\n * <Button variant=\"text\" onClick={() => { handleConfirm(state); setOpen(false); }}>\n * OK\n * </Button>\n * }\n * dismissButton={\n * <Button variant=\"text\" onClick={() => setOpen(false)}>Cancel</Button>\n * }\n * >\n * {mode === 'dial' ? <TimePicker state={state} /> : <TimeInput state={state} />}\n * </TimePickerDialog>\n * ```\n */\nexport const TimePickerDialog: React.FC<TimePickerDialogProps> = ({\n\topen,\n\tonDismiss,\n\tconfirmButton,\n\tdismissButton,\n\tmodeToggleButton,\n\ttitle = \"Select time\",\n\tchildren,\n\tclassName,\n}) => {\n\treturn (\n\t\t<Dialog open={open} onOpenChange={(v) => !v && onDismiss()}>\n\t\t\t<DialogPortal open={open}>\n\t\t\t\t{/* Scrim */}\n\t\t\t\t<RadixDialog.Overlay asChild forceMount>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"time-picker-overlay\"\n\t\t\t\t\t\tclassName=\"fixed inset-0 z-50 bg-m3-scrim/40\"\n\t\t\t\t\t\tinitial={PICKER_OVERLAY_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_OVERLAY_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_OVERLAY_ANIM.exit}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t/>\n\t\t\t\t</RadixDialog.Overlay>\n\n\t\t\t\t{/* Dialog panel */}\n\t\t\t\t<RadixDialog.Content\n\t\t\t\t\tasChild\n\t\t\t\t\tforceMount\n\t\t\t\t\tonEscapeKeyDown={onDismiss}\n\t\t\t\t\tonPointerDownOutside={(e) => e.preventDefault()} // scrim handles dismiss\n\t\t\t\t\taria-modal\n\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tkey=\"time-picker-content\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t// Positioning\n\t\t\t\t\t\t\t\"fixed z-50 left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\t\t\t// Layout\n\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t// MD3 Time Picker container tokens\n\t\t\t\t\t\t\t\"bg-m3-surface-container-high\",\n\t\t\t\t\t\t\t\"rounded-m3-xl\",\n\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t\"max-w-[calc(100vw-32px)] max-h-[calc(100dvh-32px)]\",\n\t\t\t\t\t\t\t// Elevation Level 3\n\t\t\t\t\t\t\t\"elevation-3\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tinitial={PICKER_CONTENT_ANIM.initial}\n\t\t\t\t\t\tanimate={PICKER_CONTENT_ANIM.animate}\n\t\t\t\t\t\texit={PICKER_CONTENT_ANIM.exit}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Accessible title (screen reader only) */}\n\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">{title}</RadixDialog.Title>\n\n\t\t\t\t\t\t{/* Content — TimePicker or TimeInput */}\n\t\t\t\t\t\t<div className=\"flex-1\">{children}</div>\n\n\t\t\t\t\t\t{/* Footer: modeToggle | spacer | dismiss | confirm */}\n\t\t\t\t\t\t<div className=\"flex min-h-16 items-center gap-2 px-6 py-2\">\n\t\t\t\t\t\t\t{/* Mode toggle (keyboard ↔ clock icon) — optional */}\n\t\t\t\t\t\t\t{modeToggleButton && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center\">{modeToggleButton}</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{/* Spacer */}\n\t\t\t\t\t\t\t<div className=\"flex-1\" />\n\t\t\t\t\t\t\t{/* Action buttons */}\n\t\t\t\t\t\t\t{dismissButton}\n\t\t\t\t\t\t\t{confirmButton}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</RadixDialog.Content>\n\t\t\t</DialogPortal>\n\t\t</Dialog>\n\t);\n};\n\nTimePickerDialog.displayName = \"TimePickerDialog\";\n","/**\n * @file time-picker/use-time-picker-state.ts\n *\n * Core state hook for TimePicker — hoisted state pattern.\n * Ported from `rememberTimePickerState()` in Android Compose Material3.\n *\n * Separates `hour`/`minute` (always valid) and `hourInput`/`minuteInput`\n * (raw input, can be invalid mid-typing) — preserving Kotlin semantics.\n *\n * @see docs/m3/date-and-time-pickers/time-pickers/TimePickerState.md\n *\n * @example\n * ```tsx\n * const state = useTimePickerState({\n * initialHour: 7,\n * initialMinute: 0,\n * is24hour: false,\n * });\n *\n * <TimePicker state={state} />\n * <p>{state.hour}:{String(state.minute).padStart(2, '0')} {state.isPm ? 'PM' : 'AM'}</p>\n * ```\n */\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport type {\n\tTimePickerSelectionMode,\n\tTimePickerState,\n\tUseTimePickerStateOptions,\n} from \"./time-picker.types\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Clamps a number within [min, max] range. */\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.max(min, Math.min(max, value));\n\n/**\n * Validates hour input according to time format.\n * 24h: 0-23. 12h: 1-12 (user-facing 12h clock).\n */\nconst isValidHourInput = (h: number, is24hour: boolean): boolean =>\n\tis24hour ? h >= 0 && h <= 23 : h >= 1 && h <= 12;\n\n/** Validates minute input: 0-59 */\nconst isValidMinuteInput = (m: number): boolean => m >= 0 && m <= 59;\n\n/**\n * Converts 12h input + isPm → 24h internal value.\n * Standard mapping:\n * 12 AM = 0, 1 AM = 1, ..., 11 AM = 11\n * 12 PM = 12, 1 PM = 13, ..., 11 PM = 23\n */\nconst to24Hour = (hour12: number, isPm: boolean): number => {\n\tif (isPm) {\n\t\treturn hour12 === 12 ? 12 : hour12 + 12;\n\t}\n\treturn hour12 === 12 ? 0 : hour12;\n};\n\n/**\n * Convert 24h internal → 12h display value.\n * 0 → 12 AM, 13 → 1 PM, 12 → 12 PM\n */\nconst to12Hour = (hour24: number): number => {\n\tif (hour24 === 0) return 12;\n\tif (hour24 > 12) return hour24 - 12;\n\treturn hour24;\n};\n\n// ─── Hook ──────────────────────────────────────────────────────────────────────\n\n/**\n * State management hook for TimePicker and TimeInput.\n * Equivalent to `rememberTimePickerState()` in Android Compose.\n *\n * @param options - Initial configuration options\n * @returns `TimePickerState` object with state and actions\n */\nexport const useTimePickerState = (\n\toptions?: UseTimePickerStateOptions,\n): TimePickerState => {\n\t// ── Initial values ────────────────────────────────────────────────────────\n\tconst initialHour = clamp(options?.initialHour ?? 0, 0, 23);\n\tconst initialMinute = clamp(options?.initialMinute ?? 0, 0, 59);\n\tconst is24hour = options?.is24hour ?? false;\n\n\t// ── State ─────────────────────────────────────────────────────────────────\n\tconst [hour, setHourState] = useState<number>(initialHour);\n\tconst [minute, setMinuteState] = useState<number>(initialMinute);\n\t// hourInput: raw display value (12h when !is24hour)\n\tconst [hourInput, setHourInputState] = useState<number>(\n\t\tis24hour ? initialHour : to12Hour(initialHour),\n\t);\n\tconst [minuteInput, setMinuteInputState] = useState<number>(initialMinute);\n\tconst [selection, setSelectionState] =\n\t\tuseState<TimePickerSelectionMode>(\"hour\");\n\n\t// ── Computed ──────────────────────────────────────────────────────────────\n\tconst isPm = hour >= 12;\n\tconst isHourInputValid = isValidHourInput(hourInput, is24hour);\n\tconst isMinuteInputValid = isValidMinuteInput(minuteInput);\n\tconst isInputValid = isHourInputValid && isMinuteInputValid;\n\n\t// ── Actions ───────────────────────────────────────────────────────────────\n\n\t/**\n\t * Sets valid hour (0-23) — used for clock dial.\n\t * Automatically updates both hour and hourInput.\n\t */\n\tconst setHour = useCallback(\n\t\t(h: number): void => {\n\t\t\tconst clamped = clamp(h, 0, 23);\n\t\t\tsetHourState(clamped);\n\t\t\t// hourInput always displays 12h format when !is24hour\n\t\t\tsetHourInputState(is24hour ? clamped : to12Hour(clamped));\n\t\t},\n\t\t[is24hour],\n\t);\n\n\t/**\n\t * Sets valid minute (0-59) — used for clock dial.\n\t * Automatically updates both minute and minuteInput.\n\t */\n\tconst setMinute = useCallback((m: number): void => {\n\t\tconst clamped = clamp(m, 0, 59);\n\t\tsetMinuteState(clamped);\n\t\tsetMinuteInputState(clamped);\n\t}, []);\n\n\t/**\n\t * Sets raw hour input — used for TimeInput text field.\n\t * Only updates internal `hour` (24h) when value is valid.\n\t * `hourInput` is always updated for immediate UI reflection.\n\t */\n\tconst setHourInput = useCallback(\n\t\t(h: number): void => {\n\t\t\tsetHourInputState(h);\n\t\t\tif (isValidHourInput(h, is24hour)) {\n\t\t\t\t// Convert to 24h internal\n\t\t\t\tconst h24 = is24hour ? h : to24Hour(h, isPm);\n\t\t\t\tsetHourState(clamp(h24, 0, 23));\n\t\t\t}\n\t\t},\n\t\t[is24hour, isPm],\n\t);\n\n\t/**\n\t * Sets raw minute input — used for TimeInput text field.\n\t * Only updates `minute` when value is valid.\n\t */\n\tconst setMinuteInput = useCallback((m: number): void => {\n\t\tsetMinuteInputState(m);\n\t\tif (isValidMinuteInput(m)) {\n\t\t\tsetMinuteState(m);\n\t\t}\n\t}, []);\n\n\t/** Switches selection mode between 'hour' and 'minute'. */\n\tconst setSelection = useCallback((mode: TimePickerSelectionMode): void => {\n\t\tsetSelectionState(mode);\n\t}, []);\n\n\t/**\n\t * Toggles AM/PM.\n\t * Automatically converts internal hour (24h) and updates hourInput (12h display).\n\t */\n\tconst setIsPm = useCallback((pm: boolean): void => {\n\t\tsetHourState((prev) => {\n\t\t\tconst wasAlreadyPm = prev >= 12;\n\t\t\tif (pm === wasAlreadyPm) return prev;\n\t\t\tconst newHour = pm ? prev + 12 : prev - 12;\n\t\t\tconst clamped = clamp(newHour, 0, 23);\n\t\t\t// Sync hourInput (12h display remains unchanged, only internal hour changes)\n\t\t\tsetHourInputState(to12Hour(clamped));\n\t\t\treturn clamped;\n\t\t});\n\t}, []);\n\n\t/**\n\t * Resets to initial state.\n\t */\n\tconst reset = useCallback((): void => {\n\t\tsetHourState(initialHour);\n\t\tsetMinuteState(initialMinute);\n\t\tsetHourInputState(is24hour ? initialHour : to12Hour(initialHour));\n\t\tsetMinuteInputState(initialMinute);\n\t\tsetSelectionState(\"hour\");\n\t}, [initialHour, initialMinute, is24hour]);\n\n\t// ── Memoized state object ──────────────────────────────────────────────────\n\treturn useMemo<TimePickerState>(\n\t\t() => ({\n\t\t\thour,\n\t\t\tminute,\n\t\t\thourInput,\n\t\t\tminuteInput,\n\t\t\tis24hour,\n\t\t\tselection,\n\t\t\tisInputValid,\n\t\t\tisHourInputValid,\n\t\t\tisMinuteInputValid,\n\t\t\tisPm,\n\t\t\tsetHour,\n\t\t\tsetMinute,\n\t\t\tsetHourInput,\n\t\t\tsetMinuteInput,\n\t\t\tsetSelection,\n\t\t\tsetIsPm,\n\t\t\treset,\n\t\t}),\n\t\t[\n\t\t\thour,\n\t\t\tminute,\n\t\t\thourInput,\n\t\t\tminuteInput,\n\t\t\tis24hour,\n\t\t\tselection,\n\t\t\tisInputValid,\n\t\t\tisHourInputValid,\n\t\t\tisMinuteInputValid,\n\t\t\tisPm,\n\t\t\tsetHour,\n\t\t\tsetMinute,\n\t\t\tsetHourInput,\n\t\t\tsetMinuteInput,\n\t\t\tsetSelection,\n\t\t\tsetIsPm,\n\t\t\treset,\n\t\t],\n\t);\n};\n"]}