@bug-on/m3-expressive 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/README.md +110 -0
- package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
- package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/loading-indicator.svg +19 -0
- package/dist/assets/material-symbols-cdn.css +65 -0
- package/dist/assets/material-symbols-self-hosted.css +94 -0
- package/dist/buttons.d.mts +180 -0
- package/dist/buttons.d.ts +180 -0
- package/dist/buttons.js +4282 -0
- package/dist/buttons.js.map +1 -0
- package/dist/buttons.mjs +4227 -0
- package/dist/buttons.mjs.map +1 -0
- package/dist/core.d.mts +422 -0
- package/dist/core.d.ts +422 -0
- package/dist/core.js +2581 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +2547 -0
- package/dist/core.mjs.map +1 -0
- package/dist/feedback.d.mts +600 -0
- package/dist/feedback.d.ts +600 -0
- package/dist/feedback.js +2357 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +2321 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/forms.d.mts +40 -0
- package/dist/forms.d.ts +40 -0
- package/dist/forms.js +4263 -0
- package/dist/forms.js.map +1 -0
- package/dist/forms.mjs +4228 -0
- package/dist/forms.mjs.map +1 -0
- package/dist/icon-button-D-gs0gfj.d.mts +136 -0
- package/dist/icon-button-D-gs0gfj.d.ts +136 -0
- package/dist/index.css +309 -0
- package/dist/index.css.d.ts +2 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +23972 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +23668 -0
- package/dist/index.mjs.map +1 -0
- package/dist/layout.d.mts +610 -0
- package/dist/layout.d.ts +610 -0
- package/dist/layout.js +5091 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout.mjs +5042 -0
- package/dist/layout.mjs.map +1 -0
- package/dist/material-symbols-cdn.css +65 -0
- package/dist/material-symbols-cdn.css.d.ts +2 -0
- package/dist/material-symbols-self-hosted.css +94 -0
- package/dist/material-symbols-self-hosted.css.d.ts +2 -0
- package/dist/md3-DFhj-NZj.d.mts +17 -0
- package/dist/md3-DFhj-NZj.d.ts +17 -0
- package/dist/navigation.d.mts +2766 -0
- package/dist/navigation.d.ts +2766 -0
- package/dist/navigation.js +6684 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +6573 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/overlays.d.mts +161 -0
- package/dist/overlays.d.ts +161 -0
- package/dist/overlays.js +3298 -0
- package/dist/overlays.js.map +1 -0
- package/dist/overlays.mjs +3244 -0
- package/dist/overlays.mjs.map +1 -0
- package/dist/pickers.d.mts +1074 -0
- package/dist/pickers.d.ts +1074 -0
- package/dist/pickers.js +4240 -0
- package/dist/pickers.js.map +1 -0
- package/dist/pickers.mjs +4200 -0
- package/dist/pickers.mjs.map +1 -0
- package/dist/plugin.d.mts +1 -0
- package/dist/plugin.d.ts +1 -0
- package/dist/plugin.js +13 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugin.mjs +3 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/scroll-area-CVS6HyLl.d.mts +33 -0
- package/dist/scroll-area-CVS6HyLl.d.ts +33 -0
- package/dist/shapes.d.mts +1119 -0
- package/dist/shapes.d.ts +1119 -0
- package/dist/shapes.js +2941 -0
- package/dist/shapes.js.map +1 -0
- package/dist/shapes.mjs +2889 -0
- package/dist/shapes.mjs.map +1 -0
- package/dist/side-sheet-modal-BY6VCC8p.d.mts +553 -0
- package/dist/side-sheet-modal-CglP6KYA.d.ts +553 -0
- package/dist/split-button-trailing-uncheckable-C5CLCIKP.d.ts +731 -0
- package/dist/split-button-trailing-uncheckable-MXj_kyNt.d.mts +731 -0
- package/dist/text-field-eAIpz9z1.d.mts +1038 -0
- package/dist/text-field-eAIpz9z1.d.ts +1038 -0
- package/dist/typography-339RV6v7.d.mts +486 -0
- package/dist/typography-339RV6v7.d.ts +486 -0
- package/dist/typography.css +22 -0
- package/dist/typography.css.d.ts +2 -0
- package/package.json +207 -0
|
@@ -0,0 +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","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 โ khรดng cรณ React dependencies.\n * 100% testable, reusable cho cแบฃ Date Pickers vร Time Pickers (tฦฐฦกng lai).\n *\n * Tแบฅt cแบฃ timestamps ฤแปu lร UTC milliseconds ฤแป trรกnh timezone issues.\n */\n\nimport type {\n\tCalendarWeek,\n\tDateLocale,\n\tResolvedDateLocale,\n\tSelectableDates,\n} from \"./types\";\n\n// โโโ UTC Date Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Normalize mแปt timestamp vแป UTC midnight (00:00:00.000 UTC).\n * Quan trแปng ฤแป ฤแบฃm bแบฃo so sรกnh ngร y nhแบฅt quรกn.\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/** Lแบฅy UTC midnight cแปงa hรดm nay */\nexport const todayUTC = (): number => startOfDayUTC(Date.now());\n\n/** Lแบฅy UTC midnight cแปงa ngร y ฤแบงu tiรชn trong thรกng */\nexport const startOfMonthUTC = (year: number, month: number): number =>\n\tDate.UTC(year, month, 1);\n\n/** Lแบฅy sแป ngร y trong thรกng */\nexport const getDaysInMonth = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n\n/** Lแบฅy day-of-week (0=Sun, 6=Sat) cแปงa ngร y ฤแบงu thรกng */\nexport const getFirstDayOfWeek = (year: number, month: number): number =>\n\tnew Date(Date.UTC(year, month, 1)).getUTCDay();\n\n// โโโ Calendar Grid โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Tแบกo grid calendar cho mแปt thรกng cแปฅ thแป.\n * Trแบฃ vแป mแบฃng cรกc tuแบงn, mแปi tuแบงn cรณ 7 รด (null = padding).\n *\n * @param year - Nฤm ฤแบงy ฤแปง\n * @param month - Thรกng (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// Tรญnh sแป รด padding แป ฤแบงu theo weekStartsOn\n\tconst startPadding = (firstDow - weekStartsOn + 7) % 7;\n\n\t// Tแปng รด = padding + ngร y thแปฑc\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/** So sรกnh hai timestamps cรณ cรนng ngร y UTC khรดng */\nexport const isSameDay = (a: number, b: number): boolean =>\n\tstartOfDayUTC(a) === startOfDayUTC(b);\n\n/** Kiแปm tra ms cรณ nแบฑm trong khoแบฃng [startMs, endMs] (inclusive) khรดng */\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/** Kiแปm tra ms cรณ phแบฃi ngร y bแบฏt ฤแบงu range khรดng */\nexport const isRangeStart = (ms: number, startMs: number | null): boolean =>\n\tstartMs !== null && isSameDay(ms, startMs);\n\n/** Kiแปm tra ms cรณ phแบฃi ngร y kแบฟt thรบc range khรดng */\nexport const isRangeEnd = (ms: number, endMs: number | null): boolean =>\n\tendMs !== null && isSameDay(ms, endMs);\n\n/** Kiแปm tra nฤm cรณ thแป chแปn theo `SelectableDates` config */\nexport const isYearSelectable = (\n\tyear: number,\n\tselectableDates: SelectableDates,\n): boolean => selectableDates.isSelectableYear(year);\n\n// โโโ Locale / Month Normalization โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/** Resolve partial DateLocale config vแปi 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/** Normalize bแบฅt kแปณ timestamp vแป UTC midnight ngร y 1 cแปงa thรกng ฤรณ */\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 * Navigate ฤแบฟn thรกng kแบฟ tiแบฟp/trฦฐแปc.\n * @returns UTC ms cแปงa ngร y 1 cแปงa thรกng mแปi\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 * Format mแปt UTC timestamp thร nh chuแปi ngร y theo locale.\n *\n * @example\n * ```ts\n * formatDate(Date.UTC(2025, 5, 26), 'vi-VN')\n * // โ \"26 thรกng 6, 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 * Format thรกng + nฤm cho calendar header (e.g., \"June 2025\" / \"Thรกng 6, 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 * Lแบฅy tรชn cรกc ngร y trong tuแบงn (narrow) theo locale vร weekStartsOn.\n * @returns Mแบฃng 7 tรชn, bแบฏt ฤแบงu tแปซ 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// Dรนng mแปt tuแบงn cแป ฤแปnh (2025-01-05 lร Sunday) ฤแป lแบฅy tรชn ngร y\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 theo weekStartsOn: 0=Sun (khรดng 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 * Parse chuแปi ngร y dแบกng \"MM/DD/YYYY\" thร nh UTC ms.\n * @returns UTC ms nแบฟu hแปฃp lแป, null nแบฟu khรดng hแปฃp lแป\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\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 cho Date Picker โ nhแบญp ngร y thแปง cรดng dแบกng MM/DD/YYYY.\n * Sแปญ dแปฅng TextField component cแปงa thฦฐ viแปn.\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 cho Date Picker vแปi format MM/DD/YYYY.\n * Validate realtime, commit khi blur hoแบทc 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 theo 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: chรจn \"/\" sau 2 kรฝ tแปฑ thรกng vร 2 kรฝ tแปฑ ngร y\n\tconst handleChange = React.useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tlet raw = e.target.value.replace(/\\D/g, \"\"); // chแป giแปฏ sแป\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 cho picker overlays.\n * Reuse shared motion-tokens tแปซ ui/shared vร bแป sung picker-specific animations.\n *\n * CSS variables lแบฅy tแปซ 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 * Scale tแปซ 0.85 lรชn 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 khi navigate sang thรกng tiแบฟp theo (โ).\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 * ร ngร y trong calendar grid vแปi ฤแบงy ฤแปง MD3 states.\n * Tokens tแปซ 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 * ร ngร y vแปi 6 visual states MD3:\n * - default, today, selected, in-range, range-start/end, disabled\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 hiแปn thแป tรชn cรกc ngร y trong tuแบงn.\n * Locale-aware qua Intl.DateTimeFormat.\n * Hแป trแปฃ weekStartsOn = 0 (Sun) hoแบทc 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 * Hร ng tiรชu ฤแป ngร y trong tuแบงn (Mon Tue Wed Thu Fri Sat Sun).\n * Locale-aware, tuรขn theo weekStartsOn config.\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-cแปt calendar grid vแปi slide animation khi navigate thรกng.\n * Dรนng AnimatePresence + direction-aware variants cho 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 cแปงa ngร y 1 cแปงa thรกng ฤang hiแปn thแป */\n\tdisplayedMonthMs: number;\n\t/** Direction cแปงa navigation ฤแป quyแบฟt ฤแปnh slide hฦฐแปng nร o */\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 vแปi direction-aware slide animation.\n * Render WeekdayRow + 6 hร ng ngร y.\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// Trรฌ hoรฃn chรจn <animate> 1 frame bแบฑng RequestAnimationFrame\n\t// giรบp bypass hoร n toร n lแปi Chromium ฤรณng bฤng SMIL khi parent container ฤang thแปฑc hiแปn CSS transform/animation.\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// Xแปญ lรฝ Flattening Logic dแปฑa trรชn prop determinateAnimation\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. CHแบพ ฤแป Cร XรC ฤแปNH (DETERMINATE)\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. CHแบพ ฤแป KHรNG XรC ฤแปNH (INDETERMINATE)\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 * Thanh tiแบฟn trรฌnh (Progress Indicator) theo nguyรชn tแบฏc Material Design 3 Expressive.\n * Hแป trแปฃ linh hoแบกt 2 loแบกi hรฌnh hiแปn thแป: Linear (ฤฦฐแปng thแบณng) vร Circular (Hรฌnh trรฒn),\n * cรนng vแปi thiแบฟt kแบฟ Wavy (Lฦฐแปฃn sรณng) ฤแปng rแบฅt mแปm mแบกi.\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 */\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 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}\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\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\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={cn(\n\t\t\t\t\t\tbaseIconButtonClasses,\n\t\t\t\t\t\tresolvedColorClass,\n\t\t\t\t\t\toutlineWidthClass,\n\t\t\t\t\t\tdisabledBgClass,\n\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\tSIZE_STYLES[size],\n\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\tisCustomSize\n\t\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\t: undefined\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{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\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<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\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</m.span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"content\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\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{children}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\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 * Tแบฅt cแบฃ cรกc trแปฅc biแบฟn thiรชn (variable font axes) ฤฦฐแปฃc map trแปฑc tiแบฟp sang `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Tรชn cแปงa Material Symbol theo ฤแปnh dแบกng snake_case.\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 * Kiแปu hรฌnh hแปc (Geometric style variant) โ tฦฐฦกng แปฉng vแปi font family ฤฦฐแปฃc tแบฃi.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * Trแปฅc FILL. `0` = outlined (viแปn), `1` = filled (trร n mร u).\n\t * Cรณ hiแปu แปฉng spring khi `animateFill` lร true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * Trแปฅc wght โ ฤแป dร y cแปงa nรฉt (stroke weight). Nรชn khแปp vแปi ฤแป dร y text xung quanh.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * Trแปฅc GRAD โ tinh chแปnh ฤแป dร y thแป giรกc mร khรดng แบฃnh hฦฐแปng tแปi layout.\n\t * Dรนng mแปฉc `-25` trรชn nแปn tแปi ฤแป bรน trแปซ hiแปu แปฉng phรกt sรกng (halation).\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * Trแปฅc opsz โ kรญch thฦฐแปc quang hแปc (optical size) tรญnh bแบฑng dp. Dรนng ฤแป thiแบฟt lแบญp `font-size` nแบฟu khรดng truyแปn `size`.\n\t * Hรฃy ฤแป giรก trแป khแปp vแปi pixel sแบฝ render ra ฤแป thแบฅy chแบฅt lฦฐแปฃng tแปt nhแบฅt.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Ghi ฤรจ trแปฑc tiแบฟp `font-size` bแบฑng px. Trแปฅc `opsz` vแบซn sแบฝ tuรขn theo thuแปc tรญnh `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * Kรญch hoแบกt hiแปu แปฉng spring mฦฐแปฃt mร khi chuyแปn ฤแปi giรก trแป FILL (sแปญ dแปฅng cแบฅu hรฌnh `SPRING_TRANSITION_FAST`).\n\t * Yรชu cแบงu dependency `motion/react`.\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 * Component hiแปn thแป Icon bแบฑng Material Symbols (variable font).\n *\n * Hรฃy ฤแบฃm bแบฃo ฤรฃ import CSS chแปฉa font trฦฐแปc khi dรนng:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols.css';\n * ```\n *\n * @remarks\n * - ฤแบทt tรชn icon dรนng snake_case: `\"arrow_forward\"`, KHรNG PHแบขI `\"ArrowForward\"`.\n * - Thuแปc tรญnh `aria-hidden=\"true\"` ฤฦฐแปฃc tแปฑ ฤแปng thรชm vร o โ bแบกn cแบงn thรชm label ฤแปc bแบฑng giแปng nรณi (accessible labels) แป phแบงn tแปญ cha.\n *\n * @example\n * ```tsx\n * // Icon cฦก bแบฃn\n * <Icon name=\"home\" />\n *\n * // Tรนy chแปnh trแปฑc quan (filled, nรฉt dร y)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animate khi trแบกng thรกi thay ฤแปi\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // ฤแปi kรญch thฦฐแปc icon cแปฅ thแป\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Kแบฟt hแปฃp vแปi cรกc component khรกc\n * <Button icon={<Icon name=\"add\" />}>Thรชm vร o giแป</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 (khรดng bao gแปm dialog wrapper).\n * Tฦฐฦกng ฤฦฐฦกng composable `DatePicker` trong Android Compose Material3.\n *\n * Layout:\n * CalendarHeader (title, headline, month nav)\n * โ\n * CalendarGrid | YearPickerGrid (AnimatePresence toggle)\n * โ\n * DatePickerInput (khi 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: 'vi-VN' } });\n *\n * <DatePicker\n * state={state}\n * showModeToggle\n * title=\"Chแปn ngร y\"\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 cho Date Picker component.\n * Map tแปซ DatePickerModalTokens.kt โ CSS variables trong 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 โ dรนng CSS custom properties tแปซ 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 tแปซ 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 tแปซ 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 cho Date Picker elements.\n * Sแปญ dแปฅng vแปi `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 * Sub-system Component Dialog theo phong cรกch hiแปn thแป MD3 Expressive.\n *\n * ฤฦฐแปฃc kแบฟ thแปซa trรชn nแปn lรตi cแปงa hแป mรฃ Radix UI Dialog primitives ฤi kรจm gรณi kรฉn Framer Motion dรนng vร o viแปc bแป sung\n * nhip ฤiแปu ฤแบฉy Spring แป hฦฐแปng hiแปn vร o (Entrance) cลฉng nhฦฐ bay lรชn (Exit); ฤn liแปn vแปi bแบฃn thiแบฟt kแบฟ specs MD3 Expressive siรชu quyแบฟn rลฉ.\n * Phแปฅc vแปฅ cแบฃ แป chแบฟ ฤแป Standard (Tiรชu chuแบฉn lแปt thแปm) vร phiรชn bแบฃn Full-Screen trร n viแปn toร n diแปn.\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 * Thuแปc tรญnh cแปงa cแปi gแปc Root `Dialog`. Chแปฉc nฤng lร m gฦฐฦกng phแบฃn hแปi cแปงa Radix `Dialog.Root` qua dแบกng controlled state ฤรณng hay mแป.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Bแบฅm Mแป Dialog</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Bแบกn cรณ muแปn phiรชu lฦฐu khรดng?</DialogTitle>\n * </DialogHeader>\n * <DialogBody>Chuแบฉn bแป lรชn ฤแป rแปi khแปi hang nร o.</DialogBody>\n * <DialogFooter>\n * <Button onClick={() => setOpen(false)} variant=\"text\">ฤรณng</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 * Cรกc props ฤฦฐแปฃc tiรชm vร o component bao ngoร i Container `DialogContent` thuแปc dแบกng Normal Standard.\n *\n * @see {@link DialogContent}\n */\nexport interface DialogContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Vรด hรฌnh ฤi ฤi nรบt Close dแบฅu (X) gรณc phแบฃi trรชn. @default false */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n/**\n * Thuแปc tรญnh Props cแปงa biแบฟn thแป `DialogFullScreenContent` chuyรชn dแปฅng dร nh riรชng cho Mode Full-Screen trร n mร n hรฌnh.\n *\n * @remarks\n * Nhแปฏng hแปp thoแบกi Full-screen cรณ biแปt tร i tแปฑ nแปi rแปng vร xรขm chiแบฟm cแบฃ bแป ngang dแปc nguyรชn thiแบฟt bแป. Nรณ cรฒn thiแบฟt lแบญp mแปt ฤฦฐแปng Top App bar (thanh ngang ฤแปnh)\n * kแบนp chung cแบฃ 1 nhรฃn title mรด tแบฃ ฤแปnh, mแปt nรบt icon X dแบนp แป rรฌa, thรชm luรดn hแบณn cรกi nรบt Confirm cแปฑc xแปn xรฒ.\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/** Nhรฃn Title nแบฑm vรนng khu vแปฑc thanh ngang Top Bar. */\n\ttitle?: string;\n\t/** Chแปฏ viแบฟt ฤรญnh kรจm bรชn trong cแปฅc Nรบt nhแบฅn thao tรกc ngay trรชn gรณc Top App bar ฤรณ (VD: \"Lฦฐu lแบกi\", \"Save\"). */\n\tactionLabel?: string;\n\t/** Hร m handler phรกt ฤแปng cแป ฤแป kรญch chแบกy tรญnh nฤng lฦฐu, xรกc nhแบญn kia. */\n\tonAction?: () => void;\n\t/** Rแบกch mแปt lร n kแบป chia cรกch thรขn body nแปi dung cuแปn bรชn dฦฐแปi vร dรฒng App bar cแป thแปง bรชn trรชn. @default false */\n\tshowDivider?: boolean;\n\tclassName?: string;\n}\n\n// โโโ Re-exports wrapper โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Gแปc rแป
Root cแปงa Component Dialog โ trแบกc lแบฅp lรชn cรกi module `Dialog.Root` cแปงa nhร Radix.\n *\n * @remarks Cฦก nฤng hoแบกt ฤแปng แป chแบฟ ฤแป Controlled (kiแปm soรกt vรฒng ฤแปi แป Client) xร i mแบฃng `open`/`onOpenChange`.\n * Tuy thแบฟ bแบกn nแบฟu khรดng thรญch thรฌ ฤแปซng cรณ xร i truyแปn mแบฅy cรกi Props tay ฤรดi trรชn, mร bแป xร i kiแปu Untracked thรดng qua cรกi cแปฅc `DialogTrigger` lร ฤแปง.\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/** Bแป Trigger gieo phรกt ฤร giรบp tแบฏt bแบญt cแป State ฤรณng mแป cแปงa Dialog con, dรนng kรจm kฤฉ nฤng nhรฉt thรดng qua cรกi cแบงu `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 cho Date Pickers โ tรกi sแปญ dแปฅng Dialog + DialogPortal tแปซ thฦฐ viแปn bug-on/md3-react.\n * Tฦฐฦกng ฤฦฐฦกng composable `DatePickerDialog` trong Android Compose Material3.\n *\n * Tokens tแปซ 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 vแปi MD3 Expressive spring animations.\n *\n * Tรกi sแปญ dแปฅng `<Dialog>` (Root) vร `<DialogPortal>` (AnimatePresence + Portal lifecycle)\n * tแปซ thฦฐ viแปn, trong khi tแปฑ quแบฃn lรฝ Overlay vร Content ฤแป giแปฏ ฤรบng\n * layout specs MD3 Date Picker (khรดng cรณ padding p-6, kรญch thฦฐแปc cแป ฤแปnh, animation riรชng).\n *\n * @example\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 cho chแปn khoแบฃng ngร y.\n * Tฦฐฦกng ฤฦฐฦกng composable `DateRangePicker` trong Android Compose Material3.\n *\n * Khรกc biแปt so vแปi DatePicker:\n * - Highlight range giแปฏa start vร end (SecondaryContainer)\n * - Headline hiแปn thแป \"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 cho hแป thแปng Date Pickers vร Time Pickers (tฦฐฦกng lai).\n * ฤฦฐแปฃc thiแบฟt kแบฟ ฤแป reuse across cแบฃ hai picker systems.\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\n\n// โโโ Display Mode โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Chแบฟ ฤแป hiแปn thแป cแปงa picker.\n * - `picker` โ calendar/dial UI (mแบทc ฤแปnh)\n * - `input` โ text input mode ฤแป nhแบญp thแปง cรดng\n *\n * Tฦฐฦกng ฤฦฐฦกng `DisplayMode` enum trong Android Compose Material3.\n */\nexport type DisplayMode = \"picker\" | \"input\";\n\n// โโโ Week Configuration โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Ngร y bแบฏt ฤแบงu tuแบงn.\n * - `0` = Sunday (US standard)\n * - `1` = Monday (ISO 8601, mแบทc ฤแปnh cแปงa thฦฐ viแปn nร y)\n */\nexport type WeekStartsOn = 0 | 1;\n\n// โโโ Locale Configuration โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Cแบฅu hรฌnh locale cho Date Picker.\n * Dรนng `Intl.DateTimeFormat` native API โ zero bundle overhead.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'vi-VN', weekStartsOn: 1 }\n * });\n * ```\n */\nexport interface DateLocale {\n\t/**\n\t * BCP 47 language tag.\n\t * @example 'en-US', 'vi-VN', 'ja-JP'\n\t * @default navigator.language (runtime)\n\t */\n\tlocale?: string;\n\n\t/**\n\t * Ngร y bแบฏt ฤแบงu tuแบงn.\n\t * @default 1 (Monday)\n\t */\n\tweekStartsOn?: WeekStartsOn;\n}\n\n/** Required version โ tแบฅt cแบฃ fields ฤรฃ ฤฦฐแปฃc resolved */\nexport type ResolvedDateLocale = Required<DateLocale>;\n\n// โโโ Selectable Dates โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Interface ฤแป filter cรกc ngร y/nฤm khรดng thแป chแปn.\n * Tฦฐฦกng ฤฦฐฦกng `SelectableDates` interface trong Android Compose Material3.\n *\n * @example\n * ```tsx\n * // Chแบทn ngร y cuแปi tuแบงn\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 * Kiแปm tra ngร y cรณ thแป chแปn khรดng.\n\t * @param utcTimeMs - UTC milliseconds (ฤรฃ normalize vแป UTC midnight)\n\t * @returns `true` nแบฟu ngร y cรณ thแป chแปn\n\t */\n\tisSelectableDate(utcTimeMs: number): boolean;\n\n\t/**\n\t * Kiแปm tra nฤm cรณ thแป chแปn khรดng.\n\t * Nฤm khรดng thแป chแปn sแบฝ bแป disabled trong year grid.\n\t * @param year - Full year (e.g., 2025)\n\t * @returns `true` nแบฟu nฤm cรณ thแป chแปn\n\t */\n\tisSelectableYear(year: number): boolean;\n}\n\n/** SelectableDates mแบทc ฤแปnh โ cho phรฉp tแบฅt cแบฃ ngร y vร nฤm */\nexport const ALL_DATES_SELECTABLE: SelectableDates = {\n\tisSelectableDate: () => true,\n\tisSelectableYear: () => true,\n};\n\n// โโโ Date Range โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Khoแบฃng ngร y vแปi start vร end.\n * Cแบฃ hai ฤแปu cรณ thแป null trong quรก trรฌnh selection.\n */\nexport interface DateRange {\n\t/** UTC milliseconds cแปงa ngร y bแบฏt ฤแบงu (UTC midnight). Null nแบฟu chฦฐa chแปn. */\n\tstart: number | null;\n\t/** UTC milliseconds cแปงa ngร y kแบฟt thรบc (UTC midnight). Null nแบฟu chฦฐa chแปn. */\n\tend: number | null;\n}\n\n// โโโ Calendar Day / Week โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/** ฤแบกi diแปn mแปt รด ngร y trong calendar grid */\nexport interface CalendarDay {\n\t/** UTC milliseconds (UTC midnight) */\n\tutcMs: number;\n\t/** Ngร y trong thรกng (1โ31) */\n\tday: number;\n\t/** Thรกng (0โ11) โ 0 = January */\n\tmonth: number;\n\t/** Nฤm ฤแบงy ฤแปง */\n\tyear: number;\n\t/** `true` nแบฟu ngร y nร y thuแปc thรกng ฤang hiแปn thแป */\n\tisCurrentMonth: boolean;\n\t/** `true` nแบฟu lร hรดm nay */\n\tisToday: boolean;\n}\n\n/** Mแปt tuแบงn โ mแบฃng 7 ngร y (hoแบทc null nแบฟu padding) */\nexport type CalendarWeek = Array<CalendarDay | null>;\n","/**\n * @file date-picker/use-date-picker-state.ts\n *\n * Core state hook cho DatePicker โ hoisted state pattern.\n * Tฦฐฦกng ฤฦฐฦกng `rememberDatePickerState()` trong Android Compose Material3.\n *\n * @example\n * ```tsx\n * const state = useDatePickerState({\n * locale: { locale: 'vi-VN', 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 quแบฃn lรฝ state cho DatePicker.\n *\n * @param options - Cแบฅu hรฌnh ban ฤแบงu cho state\n * @returns `DatePickerState` object vแปi cรกc 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 ฤแบฟn thรกng cแปงa ngร y ฤฦฐแปฃc chแปn\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 cho DateRangePicker โ hoisted state pattern.\n * Tฦฐฦกng ฤฦฐฦกng `rememberDateRangePickerState()` trong Android Compose Material3.\n *\n * Logic chแปn range:\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 * - Nแบฟu ฤรฃ cรณ cแบฃ start lแบซn end: 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 ฤแป cแบญp nhแบญt start/end atomically trong mแปt dispatch โ\n * trรกnh nested setState anti-pattern gรขy stale closure bug.\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: Chฦฐa cรณ start โ set start\n\t\t\tif (startMs === null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 2: ฤรฃ cรณ cแบฃ start vร end โ reset, set start = ms\n\t\t\tif (endMs !== null) return { startMs: ms, endMs: null };\n\n\t\t\t// Case 3: Cรณ start, chฦฐa cรณ end, ms sau start โ set end\n\t\t\tif (ms > startMs) return { startMs, endMs: ms };\n\n\t\t\t// Case 4: ms trฦฐแปc/bแบฑng 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 quแบฃn lรฝ state cho DateRangePicker.\n *\n * @param options - Cแบฅu hรฌnh ban ฤแบงu\n * @returns `DateRangePickerState` object vแปi cรกc 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 vร end ฤฦฐแปฃc cแบญp nhแบญt cรนng lรบc\n\t * trong reducer, khรดng cรฒn 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 cho Time Picker component system.\n * Verified mapping tแปซ:\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 cho Time Picker โ map tแปซ TimePickerTokens.kt + TimeInputTokens.kt.\n * Dรนng CSS custom properties tแปซ 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 cho Time Picker elements.\n * Dรนng vแปi `cn()` function.\n * Map chรญnh xรกc tแปซ 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 tแปซ MD3 shape scale.\n * Map tแปซ ShapeKeyTokens trong TimePickerTokens.kt + TimeInputTokens.kt.\n *\n * Sแปญ dแปฅng Tailwind class names tแปซ 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 tแปซ TimePickerTokens.kt + TimeInputTokens.kt.\n * ฤฦกn vแป: px (ฤรฃ convert tแปซ 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 โ tฦฐฦกng ฤฦฐฦกng `VerticalPeriodToggle` / `PeriodToggleImpl` trong TimePicker.kt.\n *\n * - แบจn khi `is24hour = true`\n * - Vertical layout (AM trรชn, PM dฦฐแปi) โ layout mแบทc ฤแปnh cแปงa M3 vertical TimePicker\n * - Border: 1px Outline (old toggle) hoแบทc gap giแปฏa AM/PM (updated toggle)\n * - Selected: bg-m3-primary-container + text bold\n * - Unselected: transparent + text-m3-on-surface-variant\n *\n * Port tแปซ `VerticalPeriodToggle` + `PeriodToggleImpl` trong 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 โ cแบงn `isPm`, `isHourInputValid`, `setIsPm` */\n\tstate: TimePickerState;\n\t/**\n\t * Layout direction.\n\t * - \"vertical\": AM trรชn, PM dฦฐแปi (dรนng trong TimePicker Vertical)\n\t * - \"horizontal\": AM trรกi, PM phแบฃi (dรนng trong HorizontalTimePicker)\n\t * @default \"vertical\"\n\t */\n\tlayout?: \"vertical\" | \"horizontal\";\n\t/** Inline style override โ dรนng cho custom dimensions */\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n}\n\n// โโโ Component โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * AM/PM Period Selector.\n *\n * Tแปฑ ฤแปng แบฉn khi `state.is24hour = true`.\n *\n * Implementation theo \"updated toggle\" pattern (isUpdatedTimepickerToggleEnabled = true):\n * - Khรดng cรณ border xung quanh container\n * - Hai button riรชng biแปt vแปi rounded-m3-full shape\n * - Selected: bg-m3-primary-container + text bold\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// แบจn hoร n toร n khi 24h format\n\tif (state.is24hour) return null;\n\n\tconst { isPm, isHourInputValid, setIsPm } = state;\n\n\tconst handleAmClick = (): void => {\n\t\t// Chแป update nแบฟu hour input hแปฃp lแป โ tแปซ 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 โ รด hiแปn thแป/nhแบญp giแป hoแบทc phรบt.\n *\n * Dรนng cho cแบฃ hai modes:\n * - \"selector\" โ <button> trong TimePicker (dial), click ฤแป switch hour/minute selection\n * - \"input\" โ <input> trong TimeInput, nhแบญp sแป thแปง cรดng\n *\n * Port tแปซ `TimeSelector` vร `TimePickerTextField` composables trong 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 trong dial picker */\n\tmode: \"selector\";\n\t/** Giรก trแป hiแปn thแป (sแป, 0-padded) */\n\tvalue: number;\n\t/** Field nร y lร hour hay minute */\n\tfield: TimePickerSelectionMode;\n\t/** Selection hiแปn tแบกi cแปงa picker */\n\tselection: TimePickerSelectionMode;\n\t/** Callback khi user click ฤแป activate field nร y */\n\tonActivate: () => void;\n\tclassName?: string;\n}\n\ninterface TimeFieldInputProps {\n\t/** Mode \"input\" = input text trong TimeInput */\n\tmode: \"input\";\n\t/** Raw giรก trแป input (ฤแป bind vร o input) */\n\tvalue: number;\n\t/** Field nร y lร hour hay minute */\n\tfield: TimePickerSelectionMode;\n\t/** Cรณ ฤang focused khรดng (controlled) */\n\tisFocused: boolean;\n\t/** Cรณ valid khรดng (ฤแป show error state) */\n\tisValid: boolean;\n\t/** Callback khi giรก trแป thay ฤแปi */\n\tonChange: (value: number) => void;\n\t/** Callback khi nhแบญp ฤแปง 2 digits โ chuyแปn focus sang field kแบฟ */\n\tonAutoAdvance?: () => void;\n\t/** Callback khi field ฤฦฐแปฃc focus */\n\tonFocus?: () => void;\n\t/** Callback khi field mแบฅt focus */\n\tonBlur?: () => void;\n\tclassName?: string;\n}\n\ntype TimeFieldProps = TimeFieldSelectorProps | TimeFieldInputProps;\n\n// โโโ Component โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * TimeField component โ render รด giแป/phรบt theo mode.\n *\n * Selector mode: button vแปi DisplayLarge typography, highlight khi selected.\n * Input mode: input field vแปi DisplayMedium typography, focus outline khi focused.\n *\n * @example Selector mode (trong TimePicker)\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 nแปi dung input hiแปn tแบกi ฤแป xแปญ lรฝ digit-by-digit\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 tแปซ state khi value thay ฤแปi externally (vd: khi 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 khi isFocused prop thay ฤแปi\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, \"\"); // chแป giแปฏ digits\n\t\tconst limited = raw.slice(-2); // tแปi ฤa 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 sau khi nhแบญp ฤแปง 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 vแป 0 nhฦฐng giแปฏ hiแปn thแป trแปng\n\t\t\tonChange(0);\n\t\t}\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n\t\t// Cho phรฉp: digit, Backspace, Delete, Tab, Arrow keys\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 cho 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 * - Hai `<input>` cho giแป vร phรบt\n * - Auto-advance: nhแบญp ฤแปง 2 digits hแปฃp lแป โ focus field kแบฟ\n * - Validation: error state nแบฟu giรก trแป ngoร i range\n * - AM/PM toggle bรชn phแบฃi (แบฉn khi is24hour)\n *\n * Port tแปซ `TimeInputImpl` trong 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 * Dรนng cรนng vแปi `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// Cฤn theo height cแปงa 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 (แบฉn khi 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 โ mแบทt ฤแปng hแป vแปi pointer interaction.\n *\n * Render SVG circle vแปi:\n * - Background circle (SurfaceContainerHighest)\n * - 12 (hoแบทc 24) sแป xแบฟp ฤแปu trรชn vรฒng trรฒn\n * - Selector: center dot + track line + handle circle (tแบฅt cแบฃ Primary)\n * - Pointer events: click + drag ฤแป chแปn giแป/phรบt\n * - autoSwitchToMinute: sau khi chแปn giแป xong โ tแปฑ chuyแปn sang phรบt\n *\n * Math port tแปซ `AnalogTimePickerState` trong 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 (tแปซ 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 trรชn dial 256dp.\n */\nconst OUTER_CIRCLE_RATIO = 101 / TP_SIZE.clockDialSize;\n\n/**\n * InnerCircleToSizeRatio โ 69dp trรชn dial 256dp.\n */\nconst INNER_CIRCLE_RATIO = 69 / TP_SIZE.clockDialSize;\n\n/** Center cแปงa SVG = diameter / 2 */\nconst CENTER = TP_SIZE.clockDialSize / 2; // 128\n\n/** Bรกn kรญnh vรฒng ngoร i (giแป 1-12, phรบt) */\nconst OUTER_RADIUS = TP_SIZE.clockDialSize * OUTER_CIRCLE_RATIO; // ~106.8\n\n/** Bรกn kรญnh vรฒng trong (giแป 13-23 trong 24h mode) */\nconst INNER_RADIUS = TP_SIZE.clockDialSize * INNER_CIRCLE_RATIO; // ~74.9\n\n/** Bรกn kรญnh cแปงa handle circle = selectorHandleSize / 2 */\nconst HANDLE_RADIUS = TP_SIZE.selectorHandleSize / 2; // 24\n\n/**\n * SELECTOR_GAP โ khoแบฃng cรกch tแปi thiแปu tแปซ mรฉp handle ฤแบฟn mรฉp container.\n * MD3 spec: 4dp gap giแปฏa selector handle vร 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; // ฤแป detect 24h inner ring\n}\n\n/**\n * Tรญnh vแป trรญ cแปงa sแป trรชn vรฒng trรฒn.\n * Bแบฏt ฤแบงu tแปซ 12 giแป (trรชn cรนng) = -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/** Tแบกo danh sรกch sแป cho mode hour 12h (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/** Tแบกo danh sรกch sแป cho mode hour 24h (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/** Tแบกo danh sรกch sแป cho mode minute (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 * Tรญnh gรณc tแปซ vแป trรญ pointer (x, y) relative ฤแบฟn center.\n * Giแปng `atan2` trong Compose โ trแบฃ vแป gรณc trong [-PI, PI].\n * ฤรฃ offset -QUARTER_CIRCLE ฤแป 12 giแป = 0.\n */\nconst getAngleFromPointer = (x: number, y: number): number => {\n\treturn Math.atan2(y - CENTER, x - CENTER);\n};\n\n/**\n * Normalize gรณc vแป [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 * Convert gรณc โ hour (12h mode, 1-12).\n * Port tแปซ `Float.toHour()` trong 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 * Convert gรณc โ minute (0-55, bฦฐแปc 5 khi click, bฦฐแปc 1 khi drag).\n * Port tแปซ `Float.toMinute()` trong 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 โ bฦฐแปc 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 * Tรญnh vแป trรญ cแปงa handle (selector) tแปซ angle vร is24h/isPm.\n * Port tแปซ `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 cho 24h PM hours (13-23)\n\tconst useInner = is24hour && isPm && selection === \"hour\";\n\tconst baseRadius = useInner ? INNER_RADIUS : OUTER_RADIUS;\n\n\t// MD3: clamp tรขm handle sao cho mรฉp handle cรกch mรฉp container ฤรบng SELECTOR_GAP.\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 * Tรญnh gรณc hiแปn thแป tแปซ hour/minute value.\n * Port tแปซ `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 * Tแปฑ ฤแปng chuyแปn sang selection \"minute\" sau khi chแปn xong giแป.\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 โ mแบทt ฤแปng hแป SVG vแปi pointer interaction.\n *\n * Render numbers trรชn vรฒng trรฒn vร selector handle, hแป trแปฃ:\n * - Click ฤแป chแปn giแป/phรบt cแปฅ thแป\n * - Drag ฤแป rotate liรชn tแปฅc\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// Tรญnh angle hiแปn thแป tแปซ 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/** Xแปญ lรฝ giรก trแป mแปi tแปซ 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 tแปซ center ฤแป phรขn biแปt 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: chuyแปn sang minute sau khi 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 tแปซ 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 โ render sau handle ฤแป nแบฑm trรชn cรนng โโ */}\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 โ render cuแปi cรนng, nแบฑm trรชn 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// Chแป di chuyแปn vร o handle khi chรญnh xรกc ฤรบng mแปc ฤฦฐแปฃc chแป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 cho TimePicker vร TimeInput.\n * Tรกi sแปญ dแปฅng Dialog + DialogPortal tแปซ thฦฐ viแปn bug-on/md3-react,\n * giแปng pattern cแปงa DatePickerDialog.\n *\n * Layout:\n * ```\n * โโโโโโโโโโโโโโโโโโโโโโโ\n * โ [Content] โ โ TimePicker hoแบทc TimeInput\n * โโโโโโโโโโโโโโโโโโโโโโโ\n * โ ๐น [Cancel] [OK] โ โ footer: modeToggle + spacer + dismiss + confirm\n * โโโโโโโโโโโโโโโโโโโโโโโ\n * ```\n *\n * Tokens tแปซ TimePickerDialog.kt (dรนng chung vแปi DatePickerDialog):\n * - ContainerColor = SurfaceContainerHigh\n * - ContainerShape = CornerExtraLarge (28px)\n * - ContainerElevation = Level3\n *\n * Port tแปซ `TimePickerDialog.kt` vร pattern `DatePickerDialog`.\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 cho TimePicker / TimeInput.\n *\n * Tรกi sแปญ dแปฅng `<Dialog>` (Root) vร `<DialogPortal>` (AnimatePresence + Portal)\n * tแปซ thฦฐ viแปn, ฤแปng thแปi tแปฑ quแบฃn lรฝ Overlay vร Content ฤแป giแปฏ ฤรบng\n * layout specs MD3 Time Picker.\n *\n * @example Basic usage\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 cho TimePicker โ hoisted state pattern.\n * Port tแปซ `rememberTimePickerState()` trong Android Compose Material3.\n *\n * Tรกch biแปt `hour`/`minute` (luรดn valid) vร `hourInput`/`minuteInput`\n * (raw input, cรณ thแป invalid mid-typing) โ giแปฏ nguyรชn semantics tแปซ Kotlin.\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/** Clamp sแป trong [min, max] */\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.max(min, Math.min(max, value));\n\n/**\n * Validate hour input theo format.\n * 24h: 0-23. 12h: 1-12 (ngฦฐแปi dรนng nhรฌn thแบฅy 12h clock).\n */\nconst isValidHourInput = (h: number, is24hour: boolean): boolean =>\n\tis24hour ? h >= 0 && h <= 23 : h >= 1 && h <= 12;\n\n/** Validate minute input: 0-59 */\nconst isValidMinuteInput = (m: number): boolean => m >= 0 && m <= 59;\n\n/**\n * Convert 12h input + isPm โ 24h internal value.\n * Theo chuแบฉn:\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 * Hook quแบฃn lรฝ state cho TimePicker vร TimeInput.\n * Tฦฐฦกng ฤฦฐฦกng `rememberTimePickerState()` trong Android Compose.\n *\n * @param options - Cแบฅu hรฌnh ban ฤแบงu\n * @returns `TimePickerState` object vแปi 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 value ngฦฐแปi dรนng nhรฌn thแบฅy (12h khi !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 * Set giแป hแปฃp lแป (0-23) โ dรนng cho clock dial.\n\t * Tแปฑ ฤแปng cแบญp nhแบญt cแบฃ hour lแบซn 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 luรดn hiแปn thแป 12h khi !is24hour\n\t\t\tsetHourInputState(is24hour ? clamped : to12Hour(clamped));\n\t\t},\n\t\t[is24hour],\n\t);\n\n\t/**\n\t * Set phรบt hแปฃp lแป (0-59) โ dรนng cho clock dial.\n\t * Tแปฑ ฤแปng cแบญp nhแบญt cแบฃ minute lแบซn 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 * Set raw hour input โ dรนng cho TimeInput text field.\n\t * Chแป cแบญp nhแบญt `hour` (internal 24h) khi giรก trแป valid.\n\t * `hourInput` luรดn ฤฦฐแปฃc cแบญp nhแบญt ฤแป UI reflect ngay.\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 sang 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 * Set raw minute input โ dรนng cho TimeInput text field.\n\t * Chแป cแบญp nhแบญt `minute` khi giรก trแป 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/** ฤแปi selection mode giแปฏa 'hour' vร 'minute'. */\n\tconst setSelection = useCallback((mode: TimePickerSelectionMode): void => {\n\t\tsetSelectionState(mode);\n\t}, []);\n\n\t/**\n\t * Toggle AM/PM.\n\t * Tแปฑ ฤแปng convert giแป nแปi bแป (24h) vร cแบญp nhแบญt 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 khรดng ฤแปi, chแป hour nแปi bแป ฤแปi)\n\t\t\tsetHourInputState(to12Hour(clamped));\n\t\t\treturn clamped;\n\t\t});\n\t}, []);\n\n\t/**\n\t * Reset vแป trแบกng thรกi ban ฤแบงu.\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"]}
|