@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.
Files changed (98) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +110 -0
  3. package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
  4. package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  5. package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  6. package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  7. package/dist/assets/loading-indicator.svg +19 -0
  8. package/dist/assets/material-symbols-cdn.css +65 -0
  9. package/dist/assets/material-symbols-self-hosted.css +94 -0
  10. package/dist/buttons.d.mts +180 -0
  11. package/dist/buttons.d.ts +180 -0
  12. package/dist/buttons.js +4282 -0
  13. package/dist/buttons.js.map +1 -0
  14. package/dist/buttons.mjs +4227 -0
  15. package/dist/buttons.mjs.map +1 -0
  16. package/dist/core.d.mts +422 -0
  17. package/dist/core.d.ts +422 -0
  18. package/dist/core.js +2581 -0
  19. package/dist/core.js.map +1 -0
  20. package/dist/core.mjs +2547 -0
  21. package/dist/core.mjs.map +1 -0
  22. package/dist/feedback.d.mts +600 -0
  23. package/dist/feedback.d.ts +600 -0
  24. package/dist/feedback.js +2357 -0
  25. package/dist/feedback.js.map +1 -0
  26. package/dist/feedback.mjs +2321 -0
  27. package/dist/feedback.mjs.map +1 -0
  28. package/dist/forms.d.mts +40 -0
  29. package/dist/forms.d.ts +40 -0
  30. package/dist/forms.js +4263 -0
  31. package/dist/forms.js.map +1 -0
  32. package/dist/forms.mjs +4228 -0
  33. package/dist/forms.mjs.map +1 -0
  34. package/dist/icon-button-D-gs0gfj.d.mts +136 -0
  35. package/dist/icon-button-D-gs0gfj.d.ts +136 -0
  36. package/dist/index.css +309 -0
  37. package/dist/index.css.d.ts +2 -0
  38. package/dist/index.d.mts +24 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.js +23972 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/index.mjs +23668 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/layout.d.mts +610 -0
  45. package/dist/layout.d.ts +610 -0
  46. package/dist/layout.js +5091 -0
  47. package/dist/layout.js.map +1 -0
  48. package/dist/layout.mjs +5042 -0
  49. package/dist/layout.mjs.map +1 -0
  50. package/dist/material-symbols-cdn.css +65 -0
  51. package/dist/material-symbols-cdn.css.d.ts +2 -0
  52. package/dist/material-symbols-self-hosted.css +94 -0
  53. package/dist/material-symbols-self-hosted.css.d.ts +2 -0
  54. package/dist/md3-DFhj-NZj.d.mts +17 -0
  55. package/dist/md3-DFhj-NZj.d.ts +17 -0
  56. package/dist/navigation.d.mts +2766 -0
  57. package/dist/navigation.d.ts +2766 -0
  58. package/dist/navigation.js +6684 -0
  59. package/dist/navigation.js.map +1 -0
  60. package/dist/navigation.mjs +6573 -0
  61. package/dist/navigation.mjs.map +1 -0
  62. package/dist/overlays.d.mts +161 -0
  63. package/dist/overlays.d.ts +161 -0
  64. package/dist/overlays.js +3298 -0
  65. package/dist/overlays.js.map +1 -0
  66. package/dist/overlays.mjs +3244 -0
  67. package/dist/overlays.mjs.map +1 -0
  68. package/dist/pickers.d.mts +1074 -0
  69. package/dist/pickers.d.ts +1074 -0
  70. package/dist/pickers.js +4240 -0
  71. package/dist/pickers.js.map +1 -0
  72. package/dist/pickers.mjs +4200 -0
  73. package/dist/pickers.mjs.map +1 -0
  74. package/dist/plugin.d.mts +1 -0
  75. package/dist/plugin.d.ts +1 -0
  76. package/dist/plugin.js +13 -0
  77. package/dist/plugin.js.map +1 -0
  78. package/dist/plugin.mjs +3 -0
  79. package/dist/plugin.mjs.map +1 -0
  80. package/dist/scroll-area-CVS6HyLl.d.mts +33 -0
  81. package/dist/scroll-area-CVS6HyLl.d.ts +33 -0
  82. package/dist/shapes.d.mts +1119 -0
  83. package/dist/shapes.d.ts +1119 -0
  84. package/dist/shapes.js +2941 -0
  85. package/dist/shapes.js.map +1 -0
  86. package/dist/shapes.mjs +2889 -0
  87. package/dist/shapes.mjs.map +1 -0
  88. package/dist/side-sheet-modal-BY6VCC8p.d.mts +553 -0
  89. package/dist/side-sheet-modal-CglP6KYA.d.ts +553 -0
  90. package/dist/split-button-trailing-uncheckable-C5CLCIKP.d.ts +731 -0
  91. package/dist/split-button-trailing-uncheckable-MXj_kyNt.d.mts +731 -0
  92. package/dist/text-field-eAIpz9z1.d.mts +1038 -0
  93. package/dist/text-field-eAIpz9z1.d.ts +1038 -0
  94. package/dist/typography-339RV6v7.d.mts +486 -0
  95. package/dist/typography-339RV6v7.d.ts +486 -0
  96. package/dist/typography.css +22 -0
  97. package/dist/typography.css.d.ts +2 -0
  98. 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"]}