@bug-on/md3-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -0
- package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
- package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/loading-indicator.svg +19 -0
- package/dist/assets/material-symbols-cdn.css +65 -0
- package/dist/assets/material-symbols-self-hosted.css +109 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/useMediaQuery.d.ts +11 -0
- package/dist/hooks/useRipple.d.ts +26 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +9059 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +8929 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/material-symbols-preconnect.d.ts +42 -0
- package/dist/lib/theme-utils.d.ts +63 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/material-symbols-cdn.css +65 -0
- package/dist/material-symbols-self-hosted.css +109 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/md3.d.ts +14 -0
- package/dist/typography.css +22 -0
- package/dist/ui/badge.d.ts +125 -0
- package/dist/ui/button-group.d.ts +59 -0
- package/dist/ui/button.d.ts +148 -0
- package/dist/ui/card.d.ts +62 -0
- package/dist/ui/checkbox.d.ts +82 -0
- package/dist/ui/chip.d.ts +110 -0
- package/dist/ui/code-block.d.ts +14 -0
- package/dist/ui/dialog.d.ts +111 -0
- package/dist/ui/divider.d.ts +164 -0
- package/dist/ui/drawer.d.ts +39 -0
- package/dist/ui/dropdown.d.ts +29 -0
- package/dist/ui/fab-menu.d.ts +204 -0
- package/dist/ui/fab.d.ts +162 -0
- package/dist/ui/icon-button.d.ts +131 -0
- package/dist/ui/icon.d.ts +88 -0
- package/dist/ui/loading-indicator.d.ts +42 -0
- package/dist/ui/navigation-rail.d.ts +29 -0
- package/dist/ui/progress-indicator/circular.d.ts +3 -0
- package/dist/ui/progress-indicator/hooks.d.ts +3 -0
- package/dist/ui/progress-indicator/index.d.ts +21 -0
- package/dist/ui/progress-indicator/linear-flat.d.ts +10 -0
- package/dist/ui/progress-indicator/linear-wavy.d.ts +18 -0
- package/dist/ui/progress-indicator/linear.d.ts +3 -0
- package/dist/ui/progress-indicator/types.d.ts +151 -0
- package/dist/ui/progress-indicator/utils.d.ts +3 -0
- package/dist/ui/radio-button.d.ts +106 -0
- package/dist/ui/ripple.d.ts +126 -0
- package/dist/ui/scroll-area.d.ts +27 -0
- package/dist/ui/shared/constants.d.ts +86 -0
- package/dist/ui/shared/touch-target.d.ts +38 -0
- package/dist/ui/snackbar/index.d.ts +6 -0
- package/dist/ui/snackbar/snackbar.d.ts +196 -0
- package/dist/ui/switch/index.d.ts +7 -0
- package/dist/ui/switch/switch.d.ts +30 -0
- package/dist/ui/switch/switch.stories.d.ts +48 -0
- package/dist/ui/switch/switch.tokens.d.ts +67 -0
- package/dist/ui/switch/switch.types.d.ts +59 -0
- package/dist/ui/tabs/index.d.ts +10 -0
- package/dist/ui/tabs/tab.d.ts +43 -0
- package/dist/ui/tabs/tabs-content.d.ts +36 -0
- package/dist/ui/tabs/tabs-list.d.ts +40 -0
- package/dist/ui/tabs/tabs.d.ts +60 -0
- package/dist/ui/tabs/tabs.tokens.d.ts +94 -0
- package/dist/ui/tabs/tabs.types.d.ts +172 -0
- package/dist/ui/text-field/index.d.ts +11 -0
- package/dist/ui/text-field/subcomponents/active-indicator.d.ts +24 -0
- package/dist/ui/text-field/subcomponents/floating-label.d.ts +43 -0
- package/dist/ui/text-field/subcomponents/leading-icon.d.ts +23 -0
- package/dist/ui/text-field/subcomponents/outline-container.d.ts +42 -0
- package/dist/ui/text-field/subcomponents/prefix-suffix.d.ts +24 -0
- package/dist/ui/text-field/subcomponents/supporting-text.d.ts +37 -0
- package/dist/ui/text-field/subcomponents/trailing-icon.d.ts +41 -0
- package/dist/ui/text-field/text-field.d.ts +49 -0
- package/dist/ui/text-field/text-field.tokens.d.ts +76 -0
- package/dist/ui/text-field/text-field.types.d.ts +126 -0
- package/dist/ui/theme-provider/index.d.ts +18 -0
- package/dist/ui/toc.d.ts +74 -0
- package/dist/ui/tooltip/index.d.ts +8 -0
- package/dist/ui/tooltip/plain-tooltip.d.ts +2 -0
- package/dist/ui/tooltip/rich-tooltip.d.ts +2 -0
- package/dist/ui/tooltip/tooltip-box.d.ts +2 -0
- package/dist/ui/tooltip/tooltip-caret-shape.d.ts +9 -0
- package/dist/ui/tooltip/tooltip.tokens.d.ts +26 -0
- package/dist/ui/tooltip/tooltip.types.d.ts +56 -0
- package/dist/ui/tooltip/use-tooltip-position.d.ts +8 -0
- package/dist/ui/tooltip/use-tooltip-state.d.ts +2 -0
- package/dist/ui/typography/index.d.ts +16 -0
- package/dist/ui/typography/type-scale-tokens.d.ts +162 -0
- package/dist/ui/typography/typography-key-tokens.d.ts +40 -0
- package/dist/ui/typography/typography-tokens.d.ts +220 -0
- package/dist/ui/typography/typography.d.ts +265 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useMediaQuery.ts","../src/hooks/useRipple.ts","../src/lib/material-symbols-preconnect.tsx","../src/lib/theme-utils.ts","../src/lib/utils.ts","../src/ui/badge.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/button.tsx","../src/ui/icon.tsx","../src/ui/button-group.tsx","../src/ui/card.tsx","../src/ui/checkbox.tsx","../src/ui/chip.tsx","../src/ui/scroll-area.tsx","../src/ui/code-block.tsx","../src/ui/icon-button.tsx","../src/ui/dialog.tsx","../src/ui/divider.tsx","../src/ui/drawer.tsx","../src/ui/dropdown.tsx","../src/ui/fab.tsx","../src/ui/fab-menu.tsx","../src/ui/navigation-rail.tsx","../src/ui/radio-button.tsx","../src/ui/snackbar/snackbar.tsx","../src/ui/switch/switch.tokens.ts","../src/ui/switch/switch.tsx","../src/ui/tabs/tabs.tsx","../src/ui/tabs/tabs.tokens.ts","../src/ui/tabs/tab.tsx","../src/ui/tabs/tabs-content.tsx","../src/ui/tabs/tabs-list.tsx","../src/ui/text-field/text-field.tokens.ts","../src/ui/text-field/subcomponents/active-indicator.tsx","../src/ui/text-field/subcomponents/floating-label.tsx","../src/ui/text-field/subcomponents/leading-icon.tsx","../src/ui/text-field/subcomponents/outline-container.tsx","../src/ui/text-field/subcomponents/prefix-suffix.tsx","../src/ui/text-field/subcomponents/supporting-text.tsx","../src/ui/text-field/subcomponents/trailing-icon.tsx","../src/ui/text-field/text-field.tsx","../src/ui/theme-provider/index.tsx","../src/ui/toc.tsx","../src/ui/tooltip/tooltip.tokens.ts","../src/ui/tooltip/tooltip-caret-shape.tsx","../src/ui/tooltip/plain-tooltip.tsx","../src/ui/tooltip/rich-tooltip.tsx","../src/ui/tooltip/use-tooltip-position.ts","../src/ui/tooltip/use-tooltip-state.ts","../src/ui/tooltip/tooltip-box.tsx","../src/ui/typography/type-scale-tokens.ts","../src/ui/typography/typography-key-tokens.ts","../src/ui/typography/typography-tokens.ts","../src/ui/typography/typography.tsx"],"names":["m","React","jsx","jsxs","React2","IndeterminateSvg","Fragment","DeterminateSvg","React3","LazyMotion","domMax","React4","React5","FlatLinearTrack","React6","WavyLinearTrack","React7","React8","React9","RippleItem","useReducedMotion","AnimatePresence","useRipple","React10","animate","_a","_b","useMotionValue","React11","React12","cva","React13","React14","CheckboxVisual","useMergedRef","React15","Root","React16","useState","useEffect","useCallback","SIZE_STYLES","React17","React18","React19","RadixDialog2","React20","motion","React21","SIZE_ICON","SIZE_TEXT_CLASS","React22","CloseIcon","React23","React24","MD3_FAST_EFFECTS","RadioVisual","RadioGroup","React26","Snackbar","React27","SwitchVisual","React28","React29","React30","React31","React32","ActiveIndicator","React33","FloatingLabel","React34","LeadingIcon","React35","OutlineContainer","React36","PrefixSuffix","React37","SupportingText","AnimatedIconSlot","React38","TrailingIcon","React39","createContext","useContext","useMemo","forwardRef","font","useLayoutEffect","clearTimeout","useRef","useId","cloneElement","Slot","React40","createPortal","TypographyKeyTokens"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * useMediaQuery — Responsive hook chuẩn SSR-safe\n *\n * Tránh hydration mismatch bằng cách khởi tạo với `false`.\n *\n * @example\n * ```tsx\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * ```\n */\nexport function useMediaQuery(query: string): boolean {\n\tconst [matches, setMatches] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst mql = window.matchMedia(query);\n\t\tconst handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n\t\tsetMatches(mql.matches);\n\t\tmql.addEventListener(\"change\", handler);\n\t\treturn () => mql.removeEventListener(\"change\", handler);\n\t}, [query]);\n\n\treturn matches;\n}\n","import { useCallback, useRef } from \"react\";\n\nexport interface RippleOptions {\n\t/** Thời gian hiệu ứng ripple (ms). Mặc định: 600 */\n\tduration?: number;\n\t/** Màu ripple. Mặc định: 'currentColor' */\n\tcolor?: string;\n\t/** Opacity. Mặc định: 0.12 (chuẩn MD3) */\n\topacity?: number;\n\t/** Tắt ripple (ví dụ khi disabled) */\n\tdisabled?: boolean;\n}\n\n/**\n * useRipple — Material Design 3 Expressive Ripple Effect\n *\n * Hook thuần DOM, không phụ thuộc thư viện animation ngoài.\n * Chú ý: Yêu cầu element có `position: relative` và `overflow: hidden`.\n *\n * @example\n * ```tsx\n * const { rippleRef, onPointerDown } = useRipple();\n * <button ref={rippleRef} onPointerDown={onPointerDown}>Click me</button>\n * ```\n */\nexport function useRipple<T extends HTMLElement = HTMLElement>(\n\toptions: RippleOptions = {},\n) {\n\tconst {\n\t\tduration = 600,\n\t\tcolor = \"currentColor\",\n\t\topacity = 0.12,\n\t\tdisabled = false,\n\t} = options;\n\tconst ref = useRef<T>(null);\n\n\tconst onPointerDown = useCallback(\n\t\t(event: React.PointerEvent<T>) => {\n\t\t\tif (disabled || !ref.current) return;\n\n\t\t\tconst el = ref.current;\n\t\t\tconst rect = el.getBoundingClientRect();\n\n\t\t\tconst size = Math.max(rect.width, rect.height) * 2;\n\t\t\tconst x = event.clientX - rect.left - size / 2;\n\t\t\tconst y = event.clientY - rect.top - size / 2;\n\n\t\t\tconst ripple = document.createElement(\"span\");\n\t\t\tripple.setAttribute(\"aria-hidden\", \"true\");\n\n\t\t\tObject.assign(ripple.style, {\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\twidth: `${size}px`,\n\t\t\t\theight: `${size}px`,\n\t\t\t\tleft: `${x}px`,\n\t\t\t\ttop: `${y}px`,\n\t\t\t\tbackground: color,\n\t\t\t\topacity: String(opacity),\n\t\t\t\ttransform: \"scale(0)\",\n\t\t\t\ttransition: `transform ${duration}ms cubic-bezier(0.2, 0, 0, 1), opacity ${duration * 0.6}ms ease-out`,\n\t\t\t});\n\n\t\t\tel.appendChild(ripple);\n\n\t\t\t// Frame sau để trigger animation\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tripple.style.transform = \"scale(1)\";\n\t\t\t});\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tripple.style.opacity = \"0\";\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (el.contains(ripple)) el.removeChild(ripple);\n\t\t\t\t}, duration * 0.6);\n\t\t\t\tel.removeEventListener(\"pointerup\", cleanup);\n\t\t\t\tel.removeEventListener(\"pointerleave\", cleanup);\n\t\t\t};\n\n\t\t\tel.addEventListener(\"pointerup\", cleanup, { once: true });\n\t\t\tel.addEventListener(\"pointerleave\", cleanup, { once: true });\n\t\t},\n\t\t[disabled, duration, color, opacity],\n\t);\n\n\treturn { rippleRef: ref, onPointerDown };\n}\n","/**\n * MaterialSymbolsPreconnect\n *\n * Inject preconnect resource hints cho Google Fonts CDN và <head>.\n * Đặt component này CÀNG SỚM CÀNG TỐT trong app tree, lý tưởng là\n * ngay trong <head> hoặc root layout.\n *\n * WHY THIS MATTERS:\n * Nếu @import url() nằm trong CSS file, browser phải:\n * 1. Parse HTML -> download JS bundle -> execute CSS -> gặp @import -> mới bắt đầu connect Google Fonts\n * Preconnect hints cho phép browser bắt đầu TCP handshake + TLS ngay từ bước 1,\n * tiết kiệm 100-500ms connection time tùy network.\n *\n * USAGE:\n * ```tsx\n * // app/layout.tsx (Next.js) hoặc index.html equivalent\n * import { MaterialSymbolsPreconnect } from '@bug-on/md3-react';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <head>\n * <MaterialSymbolsPreconnect />\n * </head>\n * <body>{children}</body>\n * </html>\n * );\n * }\n * ```\n *\n * NOTE: Chỉ dùng component này với CDN mode.\n * Với self-hosted fonts thì không cần preconnect đến external origin.\n */\nexport interface MaterialSymbolsPreconnectProps {\n\t/**\n\t * Mảng các biến thể font Material Symbols cần tải.\n\t * Chỉ nên chọn các biến thể mà ứng dụng thực sự sử dụng để tiết kiệm băng thông.\n\t * @default [\"outlined\"]\n\t */\n\tvariants?: Array<\"outlined\" | \"rounded\" | \"sharp\">;\n}\n\nexport function MaterialSymbolsPreconnect({\n\tvariants = [\"outlined\"],\n}: MaterialSymbolsPreconnectProps) {\n\treturn (\n\t\t<>\n\t\t\t{/* Preconnect cho CSS stylesheet */}\n\t\t\t<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n\t\t\t{/* Preconnect cho font files — crossorigin bắt buộc vì font download là CORS request */}\n\t\t\t<link\n\t\t\t\trel=\"preconnect\"\n\t\t\t\thref=\"https://fonts.gstatic.com\"\n\t\t\t\tcrossOrigin=\"anonymous\"\n\t\t\t/>\n\t\t\t{/* Load các biến thể được chọn.\n\t\t\t Sử dụng display=swap để tối ưu hóa hiệu năng (Lighthouse/Next.js recommendation).\n\t\t\t Lưu ý: Có thể gây ra hiện tượng chớp chữ (ligature flicker) trong tích tắc. */}\n\t\t\t{variants.includes(\"outlined\") && (\n\t\t\t\t<link\n\t\t\t\t\thref=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap\"\n\t\t\t\t\trel=\"stylesheet\"\n\t\t\t\t\tprecedence=\"default\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{variants.includes(\"rounded\") && (\n\t\t\t\t<link\n\t\t\t\t\thref=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap\"\n\t\t\t\t\trel=\"stylesheet\"\n\t\t\t\t\tprecedence=\"default\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{variants.includes(\"sharp\") && (\n\t\t\t\t<link\n\t\t\t\t\thref=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap\"\n\t\t\t\t\trel=\"stylesheet\"\n\t\t\t\t\tprecedence=\"default\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","import {\n\targbFromHex,\n\thexFromArgb,\n\tthemeFromSourceColor,\n} from \"@material/material-color-utilities\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nexport interface MD3ColorScheme {\n\tprimary: string;\n\tonPrimary: string;\n\tprimaryContainer: string;\n\tonPrimaryContainer: string;\n\tinversePrimary: string;\n\tprimaryFixed: string;\n\tprimaryFixedDim: string;\n\tonPrimaryFixed: string;\n\tonPrimaryFixedVariant: string;\n\n\tsecondary: string;\n\tonSecondary: string;\n\tsecondaryContainer: string;\n\tonSecondaryContainer: string;\n\tsecondaryFixed: string;\n\tsecondaryFixedDim: string;\n\tonSecondaryFixed: string;\n\tonSecondaryFixedVariant: string;\n\n\ttertiary: string;\n\tonTertiary: string;\n\ttertiaryContainer: string;\n\tonTertiaryContainer: string;\n\ttertiaryFixed: string;\n\ttertiaryFixedDim: string;\n\tonTertiaryFixed: string;\n\tonTertiaryFixedVariant: string;\n\n\terror: string;\n\tonError: string;\n\terrorContainer: string;\n\tonErrorContainer: string;\n\n\tsurface: string;\n\tonSurface: string;\n\tsurfaceVariant: string;\n\tonSurfaceVariant: string;\n\tsurfaceTint: string;\n\tsurfaceContainerLowest: string;\n\tsurfaceContainerLow: string;\n\tsurfaceContainer: string;\n\tsurfaceContainerHigh: string;\n\tsurfaceContainerHighest: string;\n\n\tinverseSurface: string;\n\tinverseOnSurface: string;\n\n\tbackground: string;\n\tonBackground: string;\n\n\toutline: string;\n\toutlineVariant: string;\n\n\tshadow: string;\n\tscrim: string;\n}\n\n/**\n * Generate a complete MD3 color scheme from a source color hex string.\n * Uses the HCT color space algorithm — same as Material You on Android.\n */\nexport function generateM3Theme(\n\tsourceColorHex: string,\n\tmode: ThemeMode = \"light\",\n): MD3ColorScheme {\n\tconst sourceColor = argbFromHex(sourceColorHex);\n\tconst theme = themeFromSourceColor(sourceColor);\n\n\tconst scheme = mode === \"light\" ? theme.schemes.light : theme.schemes.dark;\n\tconst palettes = theme.palettes;\n\n\tconst tone = (palette: (typeof palettes)[keyof typeof palettes], t: number) =>\n\t\thexFromArgb(palette.tone(t));\n\n\treturn {\n\t\tprimary: hexFromArgb(scheme.primary),\n\t\tonPrimary: hexFromArgb(scheme.onPrimary),\n\t\tprimaryContainer: hexFromArgb(scheme.primaryContainer),\n\t\tonPrimaryContainer: hexFromArgb(scheme.onPrimaryContainer),\n\t\tinversePrimary: hexFromArgb(scheme.inversePrimary),\n\t\tprimaryFixed: tone(palettes.primary, 90),\n\t\tprimaryFixedDim: tone(palettes.primary, 80),\n\t\tonPrimaryFixed: tone(palettes.primary, 10),\n\t\tonPrimaryFixedVariant: tone(palettes.primary, 30),\n\n\t\tsecondary: hexFromArgb(scheme.secondary),\n\t\tonSecondary: hexFromArgb(scheme.onSecondary),\n\t\tsecondaryContainer: hexFromArgb(scheme.secondaryContainer),\n\t\tonSecondaryContainer: hexFromArgb(scheme.onSecondaryContainer),\n\t\tsecondaryFixed: tone(palettes.secondary, 90),\n\t\tsecondaryFixedDim: tone(palettes.secondary, 80),\n\t\tonSecondaryFixed: tone(palettes.secondary, 10),\n\t\tonSecondaryFixedVariant: tone(palettes.secondary, 30),\n\n\t\ttertiary: hexFromArgb(scheme.tertiary),\n\t\tonTertiary: hexFromArgb(scheme.onTertiary),\n\t\ttertiaryContainer: hexFromArgb(scheme.tertiaryContainer),\n\t\tonTertiaryContainer: hexFromArgb(scheme.onTertiaryContainer),\n\t\ttertiaryFixed: tone(palettes.tertiary, 90),\n\t\ttertiaryFixedDim: tone(palettes.tertiary, 80),\n\t\tonTertiaryFixed: tone(palettes.tertiary, 10),\n\t\tonTertiaryFixedVariant: tone(palettes.tertiary, 30),\n\n\t\terror: hexFromArgb(scheme.error),\n\t\tonError: hexFromArgb(scheme.onError),\n\t\terrorContainer: hexFromArgb(scheme.errorContainer),\n\t\tonErrorContainer: hexFromArgb(scheme.onErrorContainer),\n\n\t\tsurface: hexFromArgb(scheme.surface),\n\t\tonSurface: hexFromArgb(scheme.onSurface),\n\t\tsurfaceVariant: hexFromArgb(scheme.surfaceVariant),\n\t\tonSurfaceVariant: hexFromArgb(scheme.onSurfaceVariant),\n\t\tsurfaceTint: hexFromArgb(scheme.primary),\n\t\t// Surface container roles from neutral palette tones\n\t\tsurfaceContainerLowest:\n\t\t\tmode === \"light\"\n\t\t\t\t? tone(palettes.neutral, 100)\n\t\t\t\t: tone(palettes.neutral, 4),\n\t\tsurfaceContainerLow:\n\t\t\tmode === \"light\"\n\t\t\t\t? tone(palettes.neutral, 96)\n\t\t\t\t: tone(palettes.neutral, 10),\n\t\tsurfaceContainer:\n\t\t\tmode === \"light\"\n\t\t\t\t? tone(palettes.neutral, 94)\n\t\t\t\t: tone(palettes.neutral, 12),\n\t\tsurfaceContainerHigh:\n\t\t\tmode === \"light\"\n\t\t\t\t? tone(palettes.neutral, 92)\n\t\t\t\t: tone(palettes.neutral, 17),\n\t\tsurfaceContainerHighest:\n\t\t\tmode === \"light\"\n\t\t\t\t? tone(palettes.neutral, 90)\n\t\t\t\t: tone(palettes.neutral, 22),\n\n\t\tinverseSurface: hexFromArgb(scheme.inverseSurface),\n\t\tinverseOnSurface: hexFromArgb(scheme.inverseOnSurface),\n\n\t\tbackground: hexFromArgb(scheme.background),\n\t\tonBackground: hexFromArgb(scheme.onBackground),\n\n\t\toutline: hexFromArgb(scheme.outline),\n\t\toutlineVariant: hexFromArgb(scheme.outlineVariant),\n\n\t\tshadow: hexFromArgb(scheme.shadow),\n\t\tscrim: hexFromArgb(scheme.scrim),\n\t};\n}\n\n/**\n * Apply an MD3 dynamic color scheme to the document root as CSS custom properties.\n * Sets both `--md-sys-color-*` tokens (used by components) and\n * `--color-m3-*` tokens (used by Tailwind arbitrary values in apps).\n *\n * Also sets `data-theme` attribute for dark mode CSS selectors.\n */\nexport function applyTheme(\n\tsourceColorHex: string,\n\tmode: ThemeMode = \"light\",\n\troot: HTMLElement = document.documentElement,\n): void {\n\tconst colors = generateM3Theme(sourceColorHex, mode);\n\n\tfor (const [key, value] of Object.entries(colors)) {\n\t\tconst kebabKey = key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n\t\troot.style.setProperty(`--md-sys-color-${kebabKey}`, value);\n\t\troot.style.setProperty(`--color-m3-${kebabKey}`, value);\n\t}\n\n\troot.setAttribute(\"data-theme\", mode);\n}\n","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 badge.tsx\n *\n * MD3 Expressive Badge component.\n *\n * - `Badge` → A small status indicator. Can be a dot (no content) or labeled (with content).\n * - `BadgedBox` → Positions a Badge at the top-trailing corner of an anchor element.\n *\n * @remarks\n * Token references (Kotlin source):\n * BadgeTokens — Size=6dp (→ 6px), LargeSize=16dp (→ 16px), Shape=CornerFull, Color=Error,\n * LargeLabelTextFont=LabelSmall, LargeLabelTextColor=OnError\n *\n * BadgedBox offsets:\n * - Small (dot): BadgeOffset = 6dp → translate(50%, -50%)\n * - Large (text): HOffset=12dp, VOffset=14dp → translate(35%, -35%)\n *\n * Architecture:\n * - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes\n * - Animation: Framer Motion (`LazyMotion` + `domMax`) spring mount/unmount\n * - A11y: `role=\"status\"` with `aria-label`, decorative dots use `aria-hidden=\"true\"`\n *\n * @see https://m3.material.io/components/badge/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Exclude onDrag-family event handlers that conflict between React's HTMLAttributes\n// and Framer Motion's MotionProps (different DragEvent signatures).\ntype SafeHTMLSpanAttrs = Omit<\n\tReact.HTMLAttributes<HTMLSpanElement>,\n\t| \"onDrag\"\n\t| \"onDragStart\"\n\t| \"onDragEnd\"\n\t| \"onDragEnter\"\n\t| \"onDragLeave\"\n\t| \"onDragOver\"\n\t| \"onDrop\"\n>;\n\nexport interface BadgeProps extends SafeHTMLSpanAttrs {\n\t/**\n\t * The content to display inside the badge.\n\t * - Omitted / undefined → renders as a small 6×6px dot (decorative).\n\t * - string | number → renders as a large badge (min 16px height) with label.\n\t *\n\t * Numbers exceeding `max` are displayed as `{max}+`.\n\t * Strings longer than 4 characters are truncated to 4.\n\t */\n\tchildren?: React.ReactNode;\n\n\t/**\n\t * Maximum numeric value to display before appending \"+\".\n\t * Only applies when `children` is a number.\n\t * @example max={99} + children={150} → \"99+\"\n\t */\n\tmax?: number;\n\n\t/**\n\t * Override the background (container) color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `error` token — `bg-m3-error`.\n\t */\n\tcontainerColor?: string;\n\n\t/**\n\t * Override the text/content color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `on-error` token — `text-m3-on-error`.\n\t */\n\tcontentColor?: string;\n}\n\nexport interface BadgedBoxProps {\n\t/**\n\t * The badge element to overlay on the anchor.\n\t * Typically a `<Badge />`.\n\t */\n\tbadge: React.ReactNode;\n\n\t/**\n\t * The anchor content that the badge is attached to.\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Additional className applied to the outer wrapper `span`.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Explicitly override size detection for badge positioning.\n\t * - `'small'` → BadgeOffset = 6dp → translate(50%, -50%)\n\t * - `'large'` → HOffset=12dp/VOffset=14dp → translate(35%, -35%)\n\t * When omitted, BadgedBox auto-detects by inspecting `badge` children prop.\n\t */\n\tbadgeSize?: \"small\" | \"large\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction formatBadgeLabel(children: React.ReactNode, max?: number): string {\n\tif (typeof children === \"number\") {\n\t\treturn max !== undefined && children > max ? `${max}+` : String(children);\n\t}\n\tif (typeof children === \"string\") {\n\t\tif (max !== undefined) {\n\t\t\tconst asNum = Number(children);\n\t\t\tif (!Number.isNaN(asNum) && asNum > max) return `${max}+`;\n\t\t}\n\t\treturn children.length > 4 ? children.slice(0, 4) : children;\n\t}\n\treturn \"\";\n}\n\nfunction detectBadgeHasContent(badge: React.ReactNode): boolean {\n\treturn (\n\t\tReact.isValidElement<{ children?: React.ReactNode }>(badge) &&\n\t\tbadge.props.children != null\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Badge\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst BadgeImpl = React.forwardRef<HTMLSpanElement, BadgeProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tmax,\n\t\t\tcontainerColor,\n\t\t\tcontentColor,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst hasContent = children != null;\n\t\tconst label = hasContent ? formatBadgeLabel(children, max) : \"\";\n\t\tconst reducedMotion = useReducedMotion();\n\t\tconst isDecorative = !hasContent && !ariaLabel;\n\n\t\tconst springTransition = reducedMotion\n\t\t\t? { duration: 0 }\n\t\t\t: { type: \"spring\" as const, stiffness: 500, damping: 30, mass: 0.8 };\n\n\t\tconst colorStyle: React.CSSProperties = {\n\t\t\t...(containerColor && { backgroundColor: containerColor }),\n\t\t\t...(contentColor && { color: contentColor }),\n\t\t\t...style,\n\t\t};\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.span\n\t\t\t\t\tref={ref}\n\t\t\t\t\trole={isDecorative ? undefined : \"status\"}\n\t\t\t\t\taria-hidden={isDecorative ? \"true\" : undefined}\n\t\t\t\t\taria-label={hasContent ? (ariaLabel ?? label) : ariaLabel}\n\t\t\t\t\tinitial={{ scale: 0, opacity: 0 }}\n\t\t\t\t\tanimate={{ scale: 1, opacity: 1 }}\n\t\t\t\t\texit={{ scale: 0, opacity: 0 }}\n\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-full ring-[1.5px] ring-m3-surface\",\n\t\t\t\t\t\t!containerColor && \"bg-m3-error\",\n\t\t\t\t\t\thasContent\n\t\t\t\t\t\t\t? cn(\n\t\t\t\t\t\t\t\t\t\"inline-flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\t\"min-w-4 h-4 px-1 text-[11px] font-medium leading-none\",\n\t\t\t\t\t\t\t\t\t!contentColor && \"text-m3-on-error\",\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: \"inline-block w-1.5 h-1.5\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={colorStyle}\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: spread safe subset of HTML attrs\n\t\t\t\t\t{...(props as any)}\n\t\t\t\t>\n\t\t\t\t\t{hasContent && label}\n\t\t\t\t</m.span>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nBadgeImpl.displayName = \"Badge\";\n\n/**\n * MD3 Expressive Badge — dynamic status indicator.\n *\n * @example\n * ```tsx\n * // Small dot badge (no content) — decorative\n * <Badge />\n *\n * // Large badge with number (truncated at max)\n * <Badge max={99}>150</Badge>\n * // → displays \"99+\"\n *\n * // Large badge with text label\n * <Badge>NEW</Badge>\n *\n * // Custom colors\n * <Badge containerColor=\"#6750A4\" contentColor=\"#FFFFFF\">3</Badge>\n * ```\n *\n * @see https://m3.material.io/components/badge/overview\n */\nexport const Badge = React.memo(BadgeImpl);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BadgedBox\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 BadgedBox — positions a Badge at the top-trailing corner of an anchor.\n *\n * Implements MD3 offset specs from Badge.kt:\n * - Small badge (dot): `BadgeOffset = 6dp` → translate(50%, -50%)\n * - Large badge (text): `BadgeWithContentHorizontalOffset = 12dp` / `VerticalOffset = 14dp`\n * → translate(35%, -35%)\n *\n * Auto-detects badge size by inspecting the badge element's children prop,\n * or accepts an explicit `badgeSize` override.\n *\n * @example\n * ```tsx\n * // Small dot on mail icon\n * <BadgedBox badge={<Badge />}>\n * <Icon name=\"mail\" />\n * </BadgedBox>\n *\n * // Count badge on notification icon\n * <BadgedBox badge={<Badge max={99}>{count}</Badge>}>\n * <Icon name=\"notifications\" />\n * </BadgedBox>\n * ```\n */\nexport function BadgedBox({\n\tbadge,\n\tchildren,\n\tclassName,\n\tbadgeSize,\n}: BadgedBoxProps) {\n\tconst isLarge = badgeSize\n\t\t? badgeSize === \"large\"\n\t\t: detectBadgeHasContent(badge);\n\n\tconst badgePositionClass = isLarge\n\t\t? \"translate-x-[35%] -translate-y-[35%]\"\n\t\t: \"translate-x-[50%] -translate-y-[50%]\";\n\n\treturn (\n\t\t<span className={cn(\"relative inline-flex\", className)}>\n\t\t\t{children}\n\t\t\t<span\n\t\t\t\tclassName={cn(\"absolute right-0 top-0\", badgePositionClass)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">{badge}</AnimatePresence>\n\t\t\t</span>\n\t\t</span>\n\t);\n}\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\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast critically-damped spring — used for border-radius morphing.\n *\n * - Duration: 200ms\n * - Bounce: 0 (no overshoot → prevents negative radius jitter)\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = {\n\ttype: \"spring\",\n\tbounce: 0,\n\tduration: 0.2,\n} as const;\n\n/**\n * Standard critically-damped spring — used for icon/content scale animations.\n *\n * - Duration: 300ms\n * - Bounce: 0 (no overshoot)\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = {\n\ttype: \"spring\",\n\tbounce: 0,\n\tduration: 0.3,\n} as const;\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 button.tsx\n *\n * MD3 Expressive Button component.\n *\n * Spec: https://m3.material.io/components/buttons/overview\n * Sizing (May 2025):\n * XS → h:32dp | px: 12dp | icon: 18dp | gap: 8dp\n * SM → h:40dp | px: 16dp | icon: 20dp | gap: 8dp\n * MD → h:56dp | px: 24dp | icon: 24dp | gap: 8dp\n * LG → h:96dp | px: 48dp | icon: 32dp | gap: 12dp\n * XL → h:136dp | px: 48dp | icon: 40dp | gap: 12dp\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport {\n\tAnimatePresence,\n\tanimate,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseMotionValue,\n} 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 { SPRING_TRANSITION, SPRING_TRANSITION_FAST } from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─── Design Tokens ────────────────────────────────────────────────────────────\n\n/**\n * Per-size layout styles.\n * Heights and paddings are taken directly from the MD3 Expressive spec (May 2025).\n */\nconst SIZE_STYLES: Record<string, React.CSSProperties> = {\n\txs: {\n\t\theight: \"2rem\",\n\t\tminWidth: \"4rem\",\n\t\tpaddingInline: \"0.75rem\",\n\t\tgap: \"0.5rem\",\n\t},\n\tsm: {\n\t\theight: \"2.5rem\",\n\t\tminWidth: \"5rem\",\n\t\tpaddingInline: \"1rem\",\n\t\tgap: \"0.5rem\",\n\t},\n\tmd: {\n\t\theight: \"3.5rem\",\n\t\tminWidth: \"7rem\",\n\t\tpaddingInline: \"1.5rem\",\n\t\tgap: \"0.5rem\",\n\t},\n\tlg: {\n\t\theight: \"6rem\",\n\t\tminWidth: \"11rem\",\n\t\tpaddingInline: \"3rem\",\n\t\tgap: \"0.75rem\",\n\t},\n\txl: {\n\t\theight: \"8.5rem\",\n\t\tminWidth: \"14rem\",\n\t\tpaddingInline: \"3rem\",\n\t\tgap: \"0.75rem\",\n\t},\n};\n\n/** Per-size label typography classes. */\nconst SIZE_TEXT_CLASS: Record<string, string> = {\n\txs: \"text-xs font-medium tracking-wide\",\n\tsm: \"text-sm font-medium tracking-wide\",\n\tmd: \"text-base font-medium tracking-wide\",\n\tlg: \"text-lg font-medium tracking-wide\",\n\txl: \"text-xl font-medium tracking-wide\",\n};\n\n/**\n * Per-size icon container Tailwind classes.\n * MD3 icon sizes: XS=18dp, SM=20dp, MD=24dp, LG=32dp, XL=40dp.\n */\nconst SIZE_ICON_CLASS: Record<string, string> = {\n\txs: \"size-[1.125rem]\",\n\tsm: \"size-5\",\n\tmd: \"size-6\",\n\tlg: \"size-8\",\n\txl: \"size-10\",\n};\n\n/**\n * Icon pixel-sizes for given button sizes.\n * MD3 icon sizes: XS=18, SM=20, MD=24, LG=32, XL=40.\n */\nconst SIZE_ICON_PX: Record<string, number> = {\n\txs: 18,\n\tsm: 20,\n\tmd: 24,\n\tlg: 32,\n\txl: 40,\n};\n\n// ─── Shape Morphing ────────────────────────────────────────────────────────────\n//\n// IMPORTANT: Do NOT use 9999 for the \"pill\" default radius.\n// CSS clips any border-radius > height/2 identically, so animating from\n// 9999 → small value creates a perceptual dead zone (nothing looks different\n// until the value drops below height/2). This makes the animation feel like\n// it snaps/jerks. Use exact half-height values instead for truly smooth morph.\n//\n// Size heights: xs=32dp, sm=40dp, md=56dp, lg=96dp, xl=136dp\n\n/** Per-size border radius values for a given shape state. */\ntype MorphRadius = { default: number; pressed: number };\n\n/**\n * Border-radius token map for the \"round\" (pill) shape variant.\n * Values equal `height / 2` for each size to ensure the pill stays perceptually\n * smooth during spring animation (no dead zone artefact).\n */\nconst ROUND_RADIUS: Record<string, MorphRadius> = {\n\txs: { default: 16, pressed: 8 },\n\tsm: { default: 20, pressed: 10 },\n\tmd: { default: 28, pressed: 16 },\n\tlg: { default: 48, pressed: 28 },\n\txl: { default: 68, pressed: 40 },\n};\n\n/**\n * Border-radius token map for the \"square\" (rounded-square) shape variant.\n * Pressed values compress inward following MD3 Expressive morphing spec.\n */\nconst SQUARE_RADIUS: Record<string, MorphRadius> = {\n\txs: { default: 4, pressed: 2 },\n\tsm: { default: 8, pressed: 4 },\n\tmd: { default: 16, pressed: 10 },\n\tlg: { default: 28, pressed: 20 },\n\txl: { default: 40, pressed: 28 },\n};\n\n// ─── Color Variants (CVA) ──────────────────────────────────────────────────────\n\nconst buttonColorVariants = cva(\n\t[\n\t\t\"relative w-fit shrink-0 inline-flex flex-row items-center justify-center\",\n\t\t\"whitespace-nowrap select-none cursor-pointer\",\n\t\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\"disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none\",\n\t],\n\t{\n\t\tvariants: {\n\t\t\tcolorStyle: {\n\t\t\t\televated: [\n\t\t\t\t\t\"bg-m3-surface-container-low text-m3-primary shadow-md\",\n\t\t\t\t\t\"hover:bg-m3-primary/8\",\n\t\t\t\t\t\"active:bg-m3-primary/12 active:shadow-sm\",\n\t\t\t\t\t\"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\",\n\t\t\t\t],\n\t\t\t\t// filled = default + toggle-selected state (routes here via effectiveColorStyle)\n\t\t\t\tfilled: [\n\t\t\t\t\t\"bg-m3-primary text-m3-on-primary\",\n\t\t\t\t\t\"hover:brightness-95\",\n\t\t\t\t\t\"active:brightness-90 active:shadow-none\",\n\t\t\t\t\t\"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\",\n\t\t\t\t],\n\t\t\t\ttonal: [\n\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\t\t\"hover:bg-m3-on-secondary-container/8\",\n\t\t\t\t\t\"active:bg-m3-on-secondary-container/12 active:shadow-none\",\n\t\t\t\t\t\"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\",\n\t\t\t\t],\n\t\t\t\toutlined: [\n\t\t\t\t\t\"bg-transparent border border-m3-outline text-m3-primary\",\n\t\t\t\t\t\"hover:bg-m3-primary/8\",\n\t\t\t\t\t\"active:bg-m3-primary/12\",\n\t\t\t\t\t\"disabled:border-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\",\n\t\t\t\t],\n\t\t\t\ttext: [\n\t\t\t\t\t\"bg-transparent text-m3-primary px-3\",\n\t\t\t\t\t\"hover:bg-m3-primary/8\",\n\t\t\t\t\t\"active:bg-m3-primary/12\",\n\t\t\t\t\t\"disabled:text-m3-on-surface/[0.38]\",\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { colorStyle: \"filled\" },\n\t},\n);\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n// Use HTMLMotionProps<\"button\"> as the base to avoid onDrag / event handler\n// conflicts between native React and Framer Motion's extended prop types.\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props shared between the standard and toggle button variants.\n *\n * @see {@link ButtonProps} for the complete discriminated union type.\n * @see https://m3.material.io/components/buttons/overview\n */\nexport interface BaseButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual style variant following MD3 color roles.\n\t * @default \"filled\"\n\t */\n\tcolorStyle?: \"elevated\" | \"filled\" | \"tonal\" | \"outlined\" | \"text\";\n\t/**\n\t * Color style applied when the toggle button is in the *selected* state.\n\t * Only meaningful when `variant=\"toggle\"`.\n\t * Falls back to `\"filled\"` when not specified.\n\t */\n\tselectedColorStyle?: \"elevated\" | \"filled\" | \"tonal\" | \"outlined\" | \"text\";\n\t/**\n\t * Button size following MD3 Expressive size scale.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container shape — controls border-radius morphing.\n\t * - `round`: pill shape (CornerFull), morphs to rounded-square when toggled.\n\t * - `square`: rounded-square, morphs to pill when toggled.\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * Optional leading or trailing icon node.\n\t * Size is automatically scaled to match the button's `size` prop.\n\t */\n\ticon?: React.ReactNode;\n\t/**\n\t * Position of the icon relative to the label text.\n\t * @default \"leading\"\n\t */\n\ticonPosition?: \"leading\" | \"trailing\";\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator\n\t * and prevents interaction.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Controls which loading spinner is shown while `loading={true}`.\n\t * - `loading-indicator`: MD3 Expressive morphing shape (default).\n\t * - `circular`: Classic circular spinner.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/**\n\t * When `true`, the Button renders its child element directly (using Radix Slot),\n\t * merging all button props (className, style, event handlers) onto it.\n\t * Useful for rendering a Next.js `<Link>` with Button styles.\n\t *\n\t * @example\n\t * ```tsx\n\t * <Button asChild size=\"lg\">\n\t * <Link href=\"/components\">Explore Components</Link>\n\t * </Button>\n\t * ```\n\t * @default false\n\t */\n\tasChild?: boolean;\n\t/** Button label — any React content, typically a string. */\n\tchildren: React.ReactNode;\n}\n\n/**\n * Complete `Button` props — discriminated union that enforces\n * `selected` is only valid for `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard button\n * <Button colorStyle=\"filled\" size=\"md\">Confirm</Button>\n *\n * // Toggle button (selected state required)\n * <Button variant=\"toggle\" selected={isActive} onClick={toggle}>Filter</Button>\n *\n * // With leading icon and loading state\n * <Button icon={<CheckIcon />} loading={isSubmitting}>Save</Button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/overview\n */\nexport type ButtonProps = BaseButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction toSentenceCase(text: string): string {\n\treturn text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n}\n\nfunction resolveLabel(\n\tchildren: React.ReactNode,\n\tasChild: boolean,\n): React.ReactNode {\n\tif (asChild) {\n\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\tchildren?: React.ReactNode;\n\t\t}>;\n\t\treturn child.props.children;\n\t}\n\treturn typeof children === \"string\" ? toSentenceCase(children) : children;\n}\n\n/** Framer Motion-specific props to strip before forwarding to a plain DOM element. */\nconst MOTION_PROP_KEYS = [\n\t\"animate\",\n\t\"exit\",\n\t\"initial\",\n\t\"transition\",\n\t\"variants\",\n\t\"whileHover\",\n\t\"whileTap\",\n\t\"whileFocus\",\n\t\"whileDrag\",\n\t\"whileInView\",\n\t\"onAnimationStart\",\n\t\"onAnimationComplete\",\n\t\"onUpdate\",\n\t\"onDragStart\",\n\t\"onDragEnd\",\n\t\"onDrag\",\n\t\"onDirectionLock\",\n\t\"onDragTransitionEnd\",\n\t\"layout\",\n\t\"layoutId\",\n\t\"onLayoutAnimationComplete\",\n] as const;\n\nfunction stripMotionProps(\n\tprops: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst result = { ...props };\n\tfor (const key of MOTION_PROP_KEYS) delete result[key];\n\treturn result;\n}\n\nfunction springAnimate(\n\tvalue: ReturnType<typeof useMotionValue<number>>,\n\tto: number,\n) {\n\tanimate(value, to, { ...SPRING_TRANSITION_FAST, type: \"spring\" });\n}\n\n// ─── Sub-components ────────────────────────────────────────────────────────────\n\ninterface LoadingSpinnerProps {\n\tsize: number;\n\tvariant: \"loading-indicator\" | \"circular\";\n}\n\nfunction LoadingSpinner({ size, variant }: LoadingSpinnerProps) {\n\tif (variant === \"loading-indicator\") {\n\t\treturn (\n\t\t\t<LoadingIndicator size={size} color=\"currentColor\" aria-label=\"Loading\" />\n\t\t);\n\t}\n\treturn (\n\t\t<ProgressIndicator\n\t\t\tvariant=\"circular\"\n\t\t\tsize={size}\n\t\t\tcolor=\"currentColor\"\n\t\t\ttrackColor=\"transparent\"\n\t\t\taria-label=\"Loading\"\n\t\t/>\n\t);\n}\n\ninterface AnimatedIconSlotProps {\n\ticonClass: string;\n\tchildren: React.ReactNode;\n\tariaHidden?: boolean;\n}\n\nfunction AnimatedIconSlot({\n\ticonClass,\n\tchildren,\n\tariaHidden,\n}: AnimatedIconSlotProps) {\n\treturn (\n\t\t<m.span\n\t\t\tinitial={{ width: 0, opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ width: \"auto\", opacity: 1, scale: 1 }}\n\t\t\texit={{ width: 0, opacity: 0, scale: 0.5 }}\n\t\t\ttransition={SPRING_TRANSITION}\n\t\t\taria-hidden={ariaHidden ? \"true\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full overflow-hidden\",\n\t\t\t\ticonClass,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</m.span>\n\t);\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nconst ButtonComponent = React.forwardRef<HTMLButtonElement, ButtonProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"filled\",\n\t\t\tselectedColorStyle,\n\t\t\tsize = \"sm\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\ticon,\n\t\t\ticonPosition = \"leading\",\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabelProp,\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 : false;\n\n\t\t// When toggle is selected, shape flips (round ↔ square).\n\t\tconst effectiveShape = isSelected\n\t\t\t? shape === \"round\"\n\t\t\t\t? \"square\"\n\t\t\t\t: \"round\"\n\t\t\t: shape;\n\n\t\t// effectiveColorStyle is the single source of truth for color.\n\t\t// Avoids CSS specificity battles between two bg-* classes.\n\t\tconst effectiveColorStyle =\n\t\t\tisToggle && isSelected ? (selectedColorStyle ?? \"filled\") : colorStyle;\n\n\t\tconst radiusMap = effectiveShape === \"round\" ? ROUND_RADIUS : SQUARE_RADIUS;\n\t\tconst { default: animateRadius } = radiusMap[size] ?? radiusMap.sm;\n\t\tconst { pressed: pressedRadius } = radiusMap[size] ?? radiusMap.sm;\n\n\t\tconst iconClass = SIZE_ICON_CLASS[size] ?? \"size-5\";\n\t\tconst mergedStyle = { ...SIZE_STYLES[size], ...style };\n\t\tconst labelText = React.useMemo(\n\t\t\t() => resolveLabel(children, asChild),\n\t\t\t[children, asChild],\n\t\t);\n\t\tconst computedAriaLabel =\n\t\t\tariaLabelProp || (typeof children === \"string\" ? children : undefined);\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// Shape morphing motion value for asChild mode.\n\t\t// Radix Slot clones the child, so Framer Motion loses DOM tracking.\n\t\t// Instead we subscribe to motionRadius.on(\"change\") and update style.borderRadius imperatively.\n\t\tconst motionRadius = useMotionValue(animateRadius);\n\t\tconst asChildRef = React.useRef<HTMLElement | null>(null);\n\n\t\t// Merge forwardRef + asChildRef into a single callback ref (Slot accepts only one ref).\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\tasChildRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node as HTMLButtonElement);\n\t\t\t\telse if (ref)\n\t\t\t\t\t(ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n\t\t\t\t\t\tnode as HTMLButtonElement;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\t// Keep DOM borderRadius synced with motionRadius.\n\t\tReact.useEffect(\n\t\t\t() =>\n\t\t\t\tmotionRadius.on(\"change\", (v) => {\n\t\t\t\t\tif (asChildRef.current)\n\t\t\t\t\t\tasChildRef.current.style.borderRadius = `${v}px`;\n\t\t\t\t}),\n\t\t\t[motionRadius],\n\t\t);\n\n\t\t// Animate to new target radius when toggle state or size changes.\n\t\tReact.useEffect(() => {\n\t\t\tspringAnimate(motionRadius, animateRadius);\n\t\t}, [animateRadius, motionRadius]);\n\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) return e.preventDefault();\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\tif (onClick && (e.key === \"Enter\" || e.key === \" \")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst buttonClassName = cn(\n\t\t\tbuttonColorVariants({ colorStyle: effectiveColorStyle }),\n\t\t\t// overflow-hidden clips Ripple to match the morphing border-radius\n\t\t\t\"overflow-hidden\",\n\t\t\tSIZE_TEXT_CLASS[size],\n\t\t\tneedsTouchTarget && \"relative\",\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Invisible touch-target expander (min 48×48dp) for small buttons */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t{/* MD3 Expressive Ripple layer */}\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t{(loading || (icon && iconPosition === \"leading\")) && (\n\t\t\t\t\t\t<AnimatedIconSlot iconClass={iconClass} ariaHidden={!loading}>\n\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t<LoadingSpinner\n\t\t\t\t\t\t\t\t\tsize={SIZE_ICON_PX[size] ?? 20}\n\t\t\t\t\t\t\t\t\tvariant={loadingVariant}\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\ticon\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatedIconSlot>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<m.span\n\t\t\t\t\tlayout=\"size\"\n\t\t\t\t\tclassName=\"inline-flex items-center gap-[inherit]\"\n\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t>\n\t\t\t\t\t{labelText}\n\t\t\t\t</m.span>\n\n\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t{icon && iconPosition === \"trailing\" && (\n\t\t\t\t\t\t<AnimatedIconSlot iconClass={iconClass} ariaHidden>\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</AnimatedIconSlot>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\t// asChild: render Slot with imperative motion value driving borderRadius.\n\t\t// Framer Motion works imperatively here because Radix Slot clones the child,\n\t\t// breaking Framer Motion's internal DOM tracking.\n\t\tif (asChild) {\n\t\t\tconst htmlProps = stripMotionProps(restProps as Record<string, unknown>);\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\tconst handleAsChildPointerDown = (e: React.PointerEvent<HTMLElement>) => {\n\t\t\t\tspringAnimate(motionRadius, pressedRadius);\n\t\t\t\t(onPointerDown as React.PointerEventHandler<HTMLElement>)?.(e);\n\t\t\t};\n\n\t\t\tconst handleAsChildPointerUp = () => {\n\t\t\t\tspringAnimate(motionRadius, animateRadius);\n\t\t\t};\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={mergedRef as React.Ref<HTMLButtonElement>}\n\t\t\t\t\t\taria-label={computedAriaLabel}\n\t\t\t\t\t\tonClick={handleClick as React.MouseEventHandler<HTMLElement>}\n\t\t\t\t\t\tonPointerDown={handleAsChildPointerDown}\n\t\t\t\t\t\tonPointerUp={handleAsChildPointerUp}\n\t\t\t\t\t\tonPointerLeave={handleAsChildPointerUp}\n\t\t\t\t\t\tonPointerCancel={handleAsChildPointerUp}\n\t\t\t\t\t\tonKeyDown={handleKeyDown as React.KeyboardEventHandler<HTMLElement>}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(mergedStyle as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={buttonClassName}\n\t\t\t\t\t\t{...htmlProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\t// Default: animated m.button\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={computedAriaLabel}\n\t\t\t\t\taria-busy={loading ? true : undefined}\n\t\t\t\t\taria-disabled={loading ? true : 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={mergedStyle}\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={buttonClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nButtonComponent.displayName = \"Button\";\n\n/**\n * MD3 Expressive Button component.\n *\n * Supports all five MD3 color styles, five sizes, shape morphing on toggle,\n * leading/trailing icons, and an animated loading state.\n *\n * @remarks\n * - `variant=\"toggle\"` requires `selected: boolean` — enforced by the type system.\n * - When `loading={true}`, the button is visually dimmed, pointer events are\n * blocked, and `aria-busy` is set for screen readers.\n * - Shape morphs smoothly between pill ↔ rounded-square when toggle state changes,\n * using a critically-damped spring (no overshoot artefacts).\n *\n * @example\n * ```tsx\n * // Standard filled button\n * <Button colorStyle=\"filled\" size=\"md\">Confirm</Button>\n *\n * // Button with icon\n * <Button icon={<CheckIcon />} loading={isSubmitting}>Save</Button>\n *\n * // Toggle button\n * <Button variant=\"toggle\" selected={isActive} onClick={toggle}>\n * Filter\n * </Button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/overview\n */\nexport const Button = React.memo(ButtonComponent);\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/md3-react/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/md3-react/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","import * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { ButtonProps } from \"./button\";\nimport { Icon } from \"./icon\";\n\n/**\n * Thuộc tính truyền vào cho thành phần nhóm nút (Button Group).\n */\nexport interface ButtonGroupProps\n\textends React.FieldsetHTMLAttributes<HTMLFieldSetElement> {\n\t/**\n\t * Cấu trúc hiển thị của nhóm nút:\n\t * - `standard`: Các nút cách xa và có khoảng cách độc lập với nhau (gap).\n\t * - `connected`: Các nút nối liền khung viền với nhau để tạo thành dạng Segmented Button.\n\t * @default \"standard\"\n\t */\n\tvariant?: \"standard\" | \"connected\";\n\t/**\n\t * Hướng sắp xếp của các nút trong nhóm.\n\t * @default \"horizontal\"\n\t */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/**\n\t * Đặt thành `true` nếu bạn muốn nhóm hiển thị dạng `standard` giãn đều lấp đầy toàn bộ khu vực chứa (container).\n\t * @default false\n\t */\n\tfullWidth?: boolean;\n\t/**\n\t * Áp dụng thống nhất chung một kích thước (`size`) cho tất cả các con trong nhóm (ghi đè kích thước lẻ từng nút).\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Bật/tắt hiệu ứng thu phóng độ rộng / khoảng đệm (Morphing Width) khi nhấn vào các nút (áp dụng cho nhóm `standard`).\n\t * @default true\n\t */\n\tmorphingWidth?: boolean;\n\t/**\n\t * Tự động hiển thị biểu tượng (icon) Check khi một nút trạng thái nằm trong nhóm được chỉ định là `selected={true}`.\n\t * @default false\n\t */\n\tshowCheck?: boolean;\n}\n\n// Bảng ánh xạ padding mặc định tương ứng với từng size trong button.tsx\nconst SIZE_PADDING_MAP: Record<string, string> = {\n\txs: \"0.75rem\",\n\tsm: \"1rem\",\n\tmd: \"1.5rem\",\n\tlg: \"3rem\",\n\txl: \"3rem\",\n};\n\n// Bảng ánh xạ Pill Radius (h/2) để animation mượt mà\nconst PILL_RADIUS_MAP: Record<string, number> = {\n\txs: 16,\n\tsm: 20,\n\tmd: 28,\n\tlg: 48,\n\txl: 68,\n};\n\n// ĐỒNG BỘ SPECS MD3: Bảng ánh xạ góc bo bên trong (Inner Radius) của Connected Group\nconst INNER_RADIUS_MAP: Record<string, number> = {\n\txs: 4,\n\tsm: 8,\n\tmd: 8,\n\tlg: 16,\n\txl: 20,\n};\n\n// Bảng ánh xạ Pressed Radius để morphing shape từ pill sang square\nconst PRESSED_RADIUS_MAP: Record<string, number> = {\n\txs: 8,\n\tsm: 10,\n\tmd: 16,\n\tlg: 28,\n\txl: 40,\n};\n\nconst ButtonGroupComponent = React.forwardRef<\n\tHTMLFieldSetElement,\n\tButtonGroupProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvariant = \"standard\",\n\t\t\torientation = \"horizontal\",\n\t\t\tfullWidth = false,\n\t\t\tsize,\n\t\t\tmorphingWidth = true,\n\t\t\tshowCheck = false,\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [pressedIndex, setPressedIndex] = React.useState<number | null>(null);\n\n\t\tconst childrenArray = React.useMemo(\n\t\t\t() => React.Children.toArray(children).filter(React.isValidElement),\n\t\t\t[children],\n\t\t);\n\t\tconst count = childrenArray.length;\n\n\t\tconst handlePointerLeaveAndUp = React.useCallback(() => {\n\t\t\tsetPressedIndex(null);\n\t\t}, []);\n\n\t\treturn (\n\t\t\t<fieldset\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex p-0 m-0 border-none max-w-full overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\torientation === \"vertical\" ? \"flex-col items-stretch\" : \"flex-row\",\n\t\t\t\t\t// SPECS: Standard = 8px (gap-2), Connected = chính xác 2px\n\t\t\t\t\tvariant === \"standard\" ? \"gap-2\" : \"gap-0.5\",\n\t\t\t\t\tfullWidth && (orientation === \"horizontal\" ? \"w-full\" : \"h-full\"),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonPointerLeave={handlePointerLeaveAndUp}\n\t\t\t\tonPointerUp={handlePointerLeaveAndUp}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{childrenArray.map((child, index) => {\n\t\t\t\t\tconst isFirst = index === 0;\n\t\t\t\t\tconst isLast = index === count - 1;\n\n\t\t\t\t\tconst element = child as React.ReactElement<ButtonProps>;\n\n\t\t\t\t\t// Lấy kích thước hiện tại để tính toán Specs\n\t\t\t\t\t// Ưu tiên prop size của Group, nếu không có thì lấy của nút con, mặc định là \"sm\"\n\t\t\t\t\tconst itemSize = size || element.props.size || \"sm\";\n\t\t\t\t\tconst basePx = SIZE_PADDING_MAP[itemSize] || \"1rem\";\n\t\t\t\t\tconst innerRadius = INNER_RADIUS_MAP[itemSize] || 8;\n\n\t\t\t\t\t// Inject style động\n\t\t\t\t\tconst dynamicStyle: React.CSSProperties = {\n\t\t\t\t\t\t...element.props.style,\n\t\t\t\t\t\t\"--m3-inner-rad\": `${innerRadius}px`,\n\t\t\t\t\t} as React.CSSProperties;\n\n\t\t\t\t\tlet motionPropsToOverride: Partial<ButtonProps> = {};\n\t\t\t\t\tlet explicitIcon = element.props.icon;\n\t\t\t\t\tconst isSelected = element.props.selected === true;\n\n\t\t\t\t\tif (showCheck && isSelected && !explicitIcon) {\n\t\t\t\t\t\texplicitIcon = <Icon name=\"check\" aria-hidden=\"true\" />;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 1. STANDARD GROUP: Xử lý hiệu ứng Morphing Width khi press\n\t\t\t\t\tif (\n\t\t\t\t\t\tvariant === \"standard\" &&\n\t\t\t\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\t\tmorphingWidth\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst isPressed = pressedIndex === index;\n\t\t\t\t\t\tconst isNeighbor =\n\t\t\t\t\t\t\tpressedIndex !== null && Math.abs(pressedIndex - index) === 1;\n\n\t\t\t\t\t\tif (fullWidth) {\n\t\t\t\t\t\t\tif (isPressed) {\n\t\t\t\t\t\t\t\tdynamicStyle.flex = \"1.15\";\n\t\t\t\t\t\t\t} else if (pressedIndex !== null) {\n\t\t\t\t\t\t\t\tdynamicStyle.flex = isNeighbor ? \"0.925\" : \"1\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdynamicStyle.flex = \"1\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdynamicStyle.transition = \"flex 0.3s cubic-bezier(0.2, 0, 0, 1)\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (isPressed) {\n\t\t\t\t\t\t\t\tdynamicStyle.paddingInline = `calc(${basePx} + 0.6rem)`;\n\t\t\t\t\t\t\t} else if (isNeighbor) {\n\t\t\t\t\t\t\t\tdynamicStyle.paddingInline = `calc(${basePx} - 0.3rem)`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdynamicStyle.paddingInline = basePx;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdynamicStyle.transition =\n\t\t\t\t\t\t\t\t\"padding 0.2s cubic-bezier(0.2, 0, 0, 1)\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst pressedRadius = PRESSED_RADIUS_MAP[itemSize] || 10;\n\n\t\t\t\t\t\tmotionPropsToOverride = {\n\t\t\t\t\t\t\twhileTap: {\n\t\t\t\t\t\t\t\tscale: 0.98,\n\t\t\t\t\t\t\t\tborderRadius: pressedRadius,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttransition: { type: \"spring\", stiffness: 400, damping: 25 },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// 2. CONNECTED GROUP: Xử lý trạng thái Selected và Border Radius\n\t\t\t\t\tlet connectedClasses = \"\";\n\t\t\t\t\tif (variant === \"connected\") {\n\t\t\t\t\t\t// Ưu tiên z-index khi selected/hover để đè viền lên nhau\n\t\t\t\t\t\tif (isSelected) {\n\t\t\t\t\t\t\tconnectedClasses = \"z-20\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst r = PILL_RADIUS_MAP[itemSize] || 20;\n\t\t\t\t\t\tconst i = innerRadius;\n\t\t\t\t\t\tlet tl = r,\n\t\t\t\t\t\t\ttr = r,\n\t\t\t\t\t\t\tbr = r,\n\t\t\t\t\t\t\tbl = r;\n\n\t\t\t\t\t\tif (!isSelected) {\n\t\t\t\t\t\t\tif (orientation === \"horizontal\") {\n\t\t\t\t\t\t\t\tif (isFirst && !isLast) {\n\t\t\t\t\t\t\t\t\ttl = r;\n\t\t\t\t\t\t\t\t\ttr = i;\n\t\t\t\t\t\t\t\t\tbr = i;\n\t\t\t\t\t\t\t\t\tbl = r;\n\t\t\t\t\t\t\t\t} else if (!isFirst && isLast) {\n\t\t\t\t\t\t\t\t\ttl = i;\n\t\t\t\t\t\t\t\t\ttr = r;\n\t\t\t\t\t\t\t\t\tbr = r;\n\t\t\t\t\t\t\t\t\tbl = i;\n\t\t\t\t\t\t\t\t} else if (!isFirst && !isLast) {\n\t\t\t\t\t\t\t\t\ttl = i;\n\t\t\t\t\t\t\t\t\ttr = i;\n\t\t\t\t\t\t\t\t\tbr = i;\n\t\t\t\t\t\t\t\t\tbl = i;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// vertical\n\t\t\t\t\t\t\t\tif (isFirst && !isLast) {\n\t\t\t\t\t\t\t\t\ttl = r;\n\t\t\t\t\t\t\t\t\ttr = r;\n\t\t\t\t\t\t\t\t\tbr = i;\n\t\t\t\t\t\t\t\t\tbl = i;\n\t\t\t\t\t\t\t\t} else if (!isFirst && isLast) {\n\t\t\t\t\t\t\t\t\ttl = i;\n\t\t\t\t\t\t\t\t\ttr = i;\n\t\t\t\t\t\t\t\t\tbr = r;\n\t\t\t\t\t\t\t\t\tbl = r;\n\t\t\t\t\t\t\t\t} else if (!isFirst && !isLast) {\n\t\t\t\t\t\t\t\t\ttl = i;\n\t\t\t\t\t\t\t\t\ttr = i;\n\t\t\t\t\t\t\t\t\tbr = i;\n\t\t\t\t\t\t\t\t\tbl = i;\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\n\t\t\t\t\t\t// Set inline style (fallback/SSR)\n\t\t\t\t\t\tdynamicStyle.borderTopLeftRadius = `${tl}px`;\n\t\t\t\t\t\tdynamicStyle.borderTopRightRadius = `${tr}px`;\n\t\t\t\t\t\tdynamicStyle.borderBottomRightRadius = `${br}px`;\n\t\t\t\t\t\tdynamicStyle.borderBottomLeftRadius = `${bl}px`;\n\n\t\t\t\t\t\t// Transition CSS thuần\n\t\t\t\t\t\tdynamicStyle.transition =\n\t\t\t\t\t\t\t\"border-top-left-radius 0.25s cubic-bezier(0.2, 0, 0, 1), border-top-right-radius 0.25s cubic-bezier(0.2, 0, 0, 1), border-bottom-right-radius 0.25s cubic-bezier(0.2, 0, 0, 1), border-bottom-left-radius 0.25s cubic-bezier(0.2, 0, 0, 1), padding 0.2s cubic-bezier(0.2, 0, 0, 1), flex 0.2s cubic-bezier(0.2, 0, 0, 1)\";\n\n\t\t\t\t\t\t// VÔ HIỆU HÓA Framer Motion borderRadius trên children Button bằng cách override explicit corners\n\t\t\t\t\t\tconst animateProps =\n\t\t\t\t\t\t\ttypeof element.props.animate === \"object\" &&\n\t\t\t\t\t\t\t!Array.isArray(element.props.animate)\n\t\t\t\t\t\t\t\t? element.props.animate\n\t\t\t\t\t\t\t\t: {};\n\t\t\t\t\t\tconst whileTapProps =\n\t\t\t\t\t\t\ttypeof element.props.whileTap === \"object\" &&\n\t\t\t\t\t\t\t!Array.isArray(element.props.whileTap)\n\t\t\t\t\t\t\t\t? element.props.whileTap\n\t\t\t\t\t\t\t\t: {};\n\n\t\t\t\t\t\t// Tính toán corners khi pressed: tất cả corners đều thu về innerRadius hoặc pressedRadius\n\t\t\t\t\t\t// Theo MD3, khi nhấn Segmented Button, nó nên morph về dạng vuông hơn.\n\t\t\t\t\t\tconst pr = INNER_RADIUS_MAP[itemSize] || 8;\n\n\t\t\t\t\t\tmotionPropsToOverride.animate = {\n\t\t\t\t\t\t\t...animateProps,\n\t\t\t\t\t\t\tborderRadius: undefined,\n\t\t\t\t\t\t\tborderTopLeftRadius: tl,\n\t\t\t\t\t\t\tborderTopRightRadius: tr,\n\t\t\t\t\t\t\tborderBottomRightRadius: br,\n\t\t\t\t\t\t\tborderBottomLeftRadius: bl,\n\t\t\t\t\t\t} as ButtonProps[\"animate\"];\n\t\t\t\t\t\tmotionPropsToOverride.whileTap = {\n\t\t\t\t\t\t\t...whileTapProps,\n\t\t\t\t\t\t\tborderRadius: undefined,\n\t\t\t\t\t\t\tborderTopLeftRadius: pr,\n\t\t\t\t\t\t\tborderTopRightRadius: pr,\n\t\t\t\t\t\t\tborderBottomRightRadius: pr,\n\t\t\t\t\t\t\tborderBottomLeftRadius: pr,\n\t\t\t\t\t\t} as ButtonProps[\"whileTap\"];\n\n\t\t\t\t\t\tmotionPropsToOverride.transition = {\n\t\t\t\t\t\t\ttype: \"spring\",\n\t\t\t\t\t\t\tbounce: 0,\n\t\t\t\t\t\t\tduration: 0.2,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn React.cloneElement(element, {\n\t\t\t\t\t\tkey: element.key ?? index,\n\t\t\t\t\t\ttabIndex: isFirst ? 0 : -1,\n\t\t\t\t\t\tsize: size || element.props.size, // Push size group down to children\n\t\t\t\t\t\ticon: explicitIcon, // Override icon if showCheck injected it\n\t\t\t\t\t\t// Automatically apply unselected/selected color semantics for connected group\n\t\t\t\t\t\t...(variant === \"connected\" && {\n\t\t\t\t\t\t\tcolorStyle: element.props.colorStyle || \"tonal\",\n\t\t\t\t\t\t\tselectedColorStyle: element.props.selectedColorStyle || \"filled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t\telement.props.className,\n\t\t\t\t\t\t\tconnectedClasses,\n\t\t\t\t\t\t\t\"focus-visible:z-10 hover:z-10 relative\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\tstyle: dynamicStyle,\n\t\t\t\t\t\tonPointerDown: (e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\t\t\t\tsetPressedIndex(index);\n\t\t\t\t\t\t\tif (element.props.onPointerDown) {\n\t\t\t\t\t\t\t\telement.props.onPointerDown(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...motionPropsToOverride,\n\t\t\t\t\t});\n\t\t\t\t})}\n\t\t\t</fieldset>\n\t\t);\n\t},\n);\n\nButtonGroupComponent.displayName = \"ButtonGroup\";\n\n/**\n * Component Nhóm Nút (Button Group) được sử dụng để gom nhóm nhiều nút có công năng tương tự lại với nhau.\n * Hỗ trợ tạo các bộ nút độc lập (Standard) hoặc khối liên kết liền mạch (Connected/Segmented Buttons).\n * Kế thừa cơ chế chuyển động kết hợp liền mạch của MD3 Expressive.\n *\n * @example\n * ```tsx\n * // Nhóm nút tiêu chuẩn rời rạc (Standard)\n * <ButtonGroup variant=\"standard\">\n * <Button>Lựa chọn 1</Button>\n * <Button>Lựa chọn 2</Button>\n * </ButtonGroup>\n *\n * // Nhóm nút liền khối (Connected Segmented Button)\n * <ButtonGroup variant=\"connected\" showCheck fullWidth>\n * <Button variant=\"toggle\" selected={view === \"day\"} onClick={() => setView(\"day\")}>Ngày</Button>\n * <Button variant=\"toggle\" selected={view === \"week\"} onClick={() => setView(\"week\")}>Tuần</Button>\n * <Button variant=\"toggle\" selected={view === \"month\"} onClick={() => setView(\"month\")}>Tháng</Button>\n * </ButtonGroup>\n * ```\n */\nexport const ButtonGroup = React.memo(ButtonGroupComponent);\n","/**\n * @file card.tsx\n *\n * Thẻ Card của bộ khung MD3 Expressive.\n *\n * Phân chia làm hai khía cạnh chức năng (cấu trúc tham khảo từ con ruột Android Card.kt):\n * - **Tĩnh Lặng (Static)** → đơn thuần mang thẻ `<div>`, yên tĩnh và không hề mảy may phản hồi có tương tác nào.\n * - **Có phản ứng (Interactive)** → được phù phép bằng `<motion.button>` hoặc `<motion.a>`, mang bùa Ripple vẫy sống cùng khả năng nhảy vọt elevation khi lướt lên.\n *\n * Nấc độ bóng Elevation levels (dịch từ các file mã ElevatedCardTokens / FilledCardTokens / OutlinedCardTokens / Elevation.kt):\n * - Level 0 = \"none\" (Bằng phẳng)\n * - Level 1 = box-shadow ~1dp (Hơi nhỉnh nổi nhẹ)\n * - Level 2 = box-shadow ~2dp (Bay lên cao xíu)\n *\n * @example\n * ```tsx\n * // Card tĩnh\n * <Card variant=\"elevated\">\n * <div className=\"p-4\">Nội dung thẻ Card nhẹ nhàng</div>\n * </Card>\n *\n * // Card button tương tác\n * <Card variant=\"filled\" onClick={() => alert('Đã nhấn!')}>\n * <div className=\"p-4\">Click vào đây em ei</div>\n * </Card>\n *\n * // Card làm thẻ Link a\n * <Card variant=\"outlined\" href=\"/home\">\n * <div className=\"p-4\">Click để chuyển trang</div>\n * </Card>\n * ```\n *\n * @see https://m3.material.io/components/cards/overview\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Ripple, useRippleState } from \"./ripple\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Elevation Shadows (from packages/tailwind/src/index.ts)\n// ─────────────────────────────────────────────────────────────────────────────\nconst SHADOW = {\n\tlevel0: \"none\",\n\tlevel1: \"0px 1px 2px 0px rgba(0,0,0,.3), 0px 1px 3px 1px rgba(0,0,0,.15)\",\n\tlevel2: \"0px 1px 2px 0px rgba(0,0,0,.3), 0px 2px 6px 2px rgba(0,0,0,.15)\",\n} as const;\n\n// Maps each variant to its elevation levels per interaction state.\n// Source: ElevatedCardTokens.kt, FilledCardTokens.kt, OutlinedCardTokens.kt\nconst VARIANT_ELEVATION = {\n\televated: {\n\t\trest: SHADOW.level1,\n\t\thover: SHADOW.level2,\n\t\tpressed: SHADOW.level1,\n\t\tdisabled: SHADOW.level1, // ElevatedCardTokens.DisabledContainerElevation = Level1\n\t},\n\tfilled: {\n\t\trest: SHADOW.level0,\n\t\thover: SHADOW.level1,\n\t\tpressed: SHADOW.level0,\n\t\tdisabled: SHADOW.level0,\n\t},\n\toutlined: {\n\t\trest: SHADOW.level0,\n\t\thover: SHADOW.level1,\n\t\tpressed: SHADOW.level0,\n\t\tdisabled: SHADOW.level0,\n\t},\n} as const;\n\ntype CardVariant = keyof typeof VARIANT_ELEVATION;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CVA – Variant base classes (token-aligned with MD3)\n// ─────────────────────────────────────────────────────────────────────────────\nconst cardVariants = cva(\n\t\"rounded-m3-lg flex flex-col relative overflow-hidden transition-colors duration-200\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\t// ElevatedCardTokens.ContainerColor = SurfaceContainerLow\n\t\t\t\televated: \"bg-m3-surface-container-low\",\n\t\t\t\t// FilledCardTokens.ContainerColor = SurfaceContainerHighest\n\t\t\t\tfilled: \"bg-m3-surface-container-highest\",\n\t\t\t\t// OutlinedCardTokens.ContainerColor = Surface, OutlineColor = OutlineVariant\n\t\t\t\toutlined: \"bg-m3-surface border border-m3-outline-variant\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { variant: \"elevated\" },\n\t},\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook: Card Elevation Animation\n// Mirrors animateElevation() from Elevation.kt.\n// Returns motion animation props for interactive boxShadow transitions.\n// ─────────────────────────────────────────────────────────────────────────────\nfunction useCardElevation(variant: CardVariant, disabled: boolean) {\n\tconst levels = VARIANT_ELEVATION[variant];\n\treturn {\n\t\tanimate: { boxShadow: disabled ? levels.disabled : levels.rest },\n\t\twhileHover: disabled ? undefined : { boxShadow: levels.hover },\n\t\twhileTap: disabled ? undefined : { boxShadow: levels.pressed },\n\t\twhileFocus: disabled ? undefined : { boxShadow: levels.hover },\n\t\ttransition: {\n\t\t\tboxShadow: {\n\t\t\t\t// Incoming: 120ms (from Elevation.kt DefaultIncomingSpec)\n\t\t\t\tduration: 0.12,\n\t\t\t\tease: [0.4, 0, 0.2, 1] as [number, number, number, number],\n\t\t\t},\n\t\t},\n\t};\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// Use HTMLMotionProps<\"button\"> as the base to avoid onDrag / event handler\n// conflicts between native React HTMLAttributes and Motion's extended prop types.\n// ─────────────────────────────────────────────────────────────────────────────\ntype MotionDivProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\nexport interface CardProps\n\textends MotionDivProps,\n\t\tVariantProps<typeof cardVariants> {\n\t/** Vô hiệu hóa tương tác và giảm opacity (MD3 disabled state). */\n\tdisabled?: boolean;\n\t/**\n\t * Buộc card trở thành interactive dù không có `onClick`.\n\t * Hữu ích khi card chứa các element con là interactive.\n\t */\n\tinteractive?: boolean;\n\t/**\n\t * Nếu có, card render thành thẻ `<a>`. Tự động kích hoạt interactive mode.\n\t * Ưu tiên dùng `href` thay vì `onClick` khi điều hướng trang.\n\t */\n\thref?: string;\n\t/** Target cho thẻ `<a>` (chỉ có hiệu lực khi `href` được cung cấp). */\n\ttarget?: React.AnchorHTMLAttributes<HTMLAnchorElement>[\"target\"];\n\t/** rel cho thẻ `<a>` (tự động thêm `noreferrer` khi `target=\"_blank\"`). */\n\trel?: string;\n\tchildren?: React.ReactNode;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\nconst CardImpl = React.forwardRef<HTMLElement, CardProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvariant = \"elevated\",\n\t\t\tdisabled = false,\n\t\t\tinteractive = false,\n\t\t\thref,\n\t\t\ttarget,\n\t\t\trel: relProp,\n\t\t\tonClick,\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst safeVariant = variant as CardVariant;\n\t\tconst isInteractive = !!onClick || !!href || interactive;\n\t\tconst elevationProps = useCardElevation(safeVariant, disabled);\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState();\n\n\t\tconst baseClass = cn(\n\t\t\tcardVariants({ variant }),\n\t\t\t// Disabled state:\n\t\t\t// - pointer-events-none → vô hiệu hóa tương tác hoàn toàn\n\t\t\t// - opacity-[0.38] → MD3 DisabledContainerOpacity\n\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\tclassName,\n\t\t);\n\n\t\t// MD3 State Layer (Hover: 8%, Focus: 10%, Pressed: 10%)\n\t\t// Áp dụng cho interactive elements, dùng absolute inset ::before\n\t\tconst interactiveClass = cn(\n\t\t\t// Xóa outline default, dùng state overlay & elevation của MD3 để biểu hiện focus\n\t\t\t\"focus-visible:outline-none focus:outline-none group\",\n\t\t\t// Layer overlay base pseudo-element\n\t\t\t\"before:absolute before:inset-0 before:pointer-events-none before:bg-m3-on-surface before:opacity-0 before:transition-opacity before:duration-200\",\n\t\t\t// Interactive states opacities\n\t\t\t\"hover:before:opacity-[0.08] focus-visible:before:opacity-[0.10] active:before:opacity-[0.10]\",\n\t\t\t// Outlined interactive card: đổi màu border sang m3-outline khi focus/press/hover\n\t\t\tvariant === \"outlined\" &&\n\t\t\t\t\"hover:border-m3-outline focus-visible:border-m3-outline active:border-m3-outline\",\n\t\t);\n\n\t\t// ── Static Card – không có interaction ─────────────────────────────────\n\t\tif (!isInteractive) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tref={ref as React.Ref<HTMLDivElement>}\n\t\t\t\t\tclassName={baseClass}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\t// ── Safe rel: tự động thêm \"noreferrer\" khi target=\"_blank\" ────────────\n\t\tconst safeRel = href\n\t\t\t? (relProp ?? (target === \"_blank\" ? \"noreferrer\" : undefined))\n\t\t\t: undefined;\n\n\t\t// ── Link Card ────────────────────────────────────────────────────────────\n\t\tif (href) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.a\n\t\t\t\t\t\tref={ref as React.Ref<HTMLAnchorElement>}\n\t\t\t\t\t\thref={disabled ? undefined : href}\n\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\trel={safeRel}\n\t\t\t\t\t\tclassName={cn(baseClass, interactiveClass)}\n\t\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t{...elevationProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</m.a>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\t// ── Interactive Button Card ──────────────────────────────────────────────\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 as React.Ref<HTMLButtonElement>}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tclassName={cn(baseClass, interactiveClass)}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t{...elevationProps}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t{children}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\nCardImpl.displayName = \"Card\";\n\nexport const Card = React.memo(CardImpl);\n","/**\n * @file checkbox.tsx\n * MD3 Expressive Checkbox — 2-state and tri-state support.\n * Spec: https://m3.material.io/components/checkbox/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Ripple, type RippleOrigin } from \"./ripple\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** MD3 Standard easing: checkmark draw and path morph. */\nconst MD3_STANDARD = [0.2, 0, 0, 1] as const;\n\n/** MD3 FastEffects easing: container fill (emphasizedAccelerate). */\nconst MD3_FAST_EFFECTS = [0.3, 0, 1, 1] as const;\n\n/**\n * SVG paths share the same command count (M→L→L) for Framer Motion d-morph.\n * viewBox: 18×18\n */\nconst CHECKMARK_PATH = \"M 4.5 9.5 L 7.5 12.5 L 13.5 5.5\";\nconst DASH_PATH = \"M 4.5 9 L 9 9 L 13.5 9\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Tri-state value: `\"unchecked\"` | `\"checked\"` | `\"indeterminate\"`.\n */\nexport type CheckboxState = \"unchecked\" | \"checked\" | \"indeterminate\";\n\n/**\n * Props for `Checkbox`. Supports boolean (`checked`/`onCheckedChange`)\n * and tri-state (`state`/`onStateChange`) modes.\n */\nexport interface CheckboxProps {\n\t/** Controlled checked value (2-state mode). */\n\tchecked?: boolean;\n\t/** Initial value for uncontrolled mode. @default false */\n\tdefaultChecked?: boolean;\n\t/** Forces indeterminate rendering regardless of `checked`. */\n\tindeterminate?: boolean;\n\t/** Fired on checked change (simple mode). Not called when disabled. */\n\tonCheckedChange?: (checked: boolean) => void;\n\n\t/** Controlled tri-state value. Takes priority over `checked`/`indeterminate`. */\n\tstate?: CheckboxState;\n\t/** Fired on tri-state change. Cycles: unchecked → checked → indeterminate. */\n\tonStateChange?: (state: CheckboxState) => void;\n\n\t/** Disables interaction and applies 0.38 opacity. */\n\tdisabled?: boolean;\n\t/** Error state — changes colors to `m3-error` and sets `aria-invalid`. */\n\terror?: boolean;\n\n\t/** Adjacent label text. Wraps checkbox + span in `<label>`. */\n\tlabel?: string;\n\t\"aria-label\"?: string;\n\t\"aria-labelledby\"?: string;\n\t\"aria-describedby\"?: string;\n\t\"aria-required\"?: boolean;\n\n\t/** Passed to the hidden `<input>` for form submission. */\n\tname?: string;\n\t/** Passed to the hidden `<input>` for form submission. */\n\tvalue?: string;\n\t/** ID for the hidden `<input>`. Auto-generated when `label` is set. */\n\tid?: string;\n\n\t/** Extra class names on the outermost wrapper. */\n\tclassName?: string;\n\t/** Ref pointing to the hidden `<input type=\"checkbox\">`. */\n\tref?: React.Ref<HTMLInputElement>;\n}\n\n/**\n * `TriStateCheckbox` props — requires `state` + `onStateChange`.\n */\nexport interface TriStateCheckboxProps\n\textends Omit<\n\t\tCheckboxProps,\n\t\t\"checked\" | \"defaultChecked\" | \"onCheckedChange\"\n\t> {\n\tstate: CheckboxState;\n\tonStateChange: (state: CheckboxState) => void;\n}\n\n// ─── State helpers ────────────────────────────────────────────────────────────\n\n/** Priority: `state` prop > `indeterminate` > `checked`. @internal */\nfunction resolveState(\n\tchecked?: boolean,\n\tindeterminate?: boolean,\n\tstate?: CheckboxState,\n): CheckboxState {\n\tif (state !== undefined) return state;\n\tif (indeterminate) return \"indeterminate\";\n\treturn checked ? \"checked\" : \"unchecked\";\n}\n\n/** Tri-state cycle: unchecked → checked → indeterminate → unchecked. */\nconst NEXT_STATE: Record<CheckboxState, CheckboxState> = {\n\tunchecked: \"checked\",\n\tchecked: \"indeterminate\",\n\tindeterminate: \"unchecked\",\n};\n\n// ─── Internal subcomponents ───────────────────────────────────────────────────\n\ninterface CheckboxVisualProps {\n\tisSelected: boolean;\n\tisIndeterminate: boolean;\n\tcontainerBg: string;\n\tcontainerBorderColor: string;\n\tcontainerBorderWidth: number;\n\ticonColor: string;\n\tsvgPath: string;\n\tpathLength: number;\n\tfillDuration: number;\n\tdrawDuration: number;\n\tmorphDuration: number;\n\tprefersReduced: boolean;\n}\n\n/** Animated 18×18dp checkbox box (container + SVG icon). @internal */\nconst CheckboxVisual = React.memo(function CheckboxVisual({\n\tisSelected,\n\tisIndeterminate,\n\tcontainerBg,\n\tcontainerBorderColor,\n\tcontainerBorderWidth,\n\ticonColor,\n\tsvgPath,\n\tpathLength,\n\tfillDuration,\n\tdrawDuration,\n\tmorphDuration,\n\tprefersReduced,\n}: CheckboxVisualProps) {\n\treturn (\n\t\t<m.div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"relative flex items-center justify-center w-4.5 h-4.5 rounded-sm overflow-hidden\"\n\t\t\tanimate={{\n\t\t\t\tbackgroundColor: containerBg,\n\t\t\t\tborderColor: containerBorderColor,\n\t\t\t\tborderWidth: containerBorderWidth,\n\t\t\t}}\n\t\t\ttransition={{\n\t\t\t\tbackgroundColor: {\n\t\t\t\t\tduration: fillDuration,\n\t\t\t\t\tease: isSelected ? MD3_FAST_EFFECTS : \"easeOut\",\n\t\t\t\t},\n\t\t\t\tborderColor: { duration: fillDuration, ease: \"easeOut\" },\n\t\t\t\tborderWidth: { duration: fillDuration, ease: \"easeOut\" },\n\t\t\t}}\n\t\t\tstyle={{ borderStyle: \"solid\" }}\n\t\t>\n\t\t\t<AnimatePresence>\n\t\t\t\t{isSelected && (\n\t\t\t\t\t<m.svg\n\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\tviewBox=\"0 0 18 18\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\twidth={18}\n\t\t\t\t\t\theight={18}\n\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: prefersReduced ? 0 : 0.1 }}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<m.path\n\t\t\t\t\t\t\td={svgPath}\n\t\t\t\t\t\t\tstroke={iconColor}\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\td: svgPath,\n\t\t\t\t\t\t\t\tpathLength: isIndeterminate ? 1 : pathLength,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\td: { duration: morphDuration, ease: MD3_STANDARD },\n\t\t\t\t\t\t\t\tpathLength: { duration: drawDuration, ease: MD3_STANDARD },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</m.svg>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</m.div>\n\t);\n});\n\n// ─── useMergedRef ─────────────────────────────────────────────────────────────\n\n/** Merges external + internal refs into a single callback ref. @internal */\nfunction useMergedRef<T>(\n\texternalRef: React.Ref<T> | undefined,\n\tinternalRef: React.RefObject<T | null>,\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\t(internalRef as React.MutableRefObject<T | null>).current = node;\n\t\t\tif (!externalRef) return;\n\t\t\tif (typeof externalRef === \"function\") {\n\t\t\t\texternalRef(node);\n\t\t\t} else {\n\t\t\t\t(externalRef as React.MutableRefObject<T | null>).current = node;\n\t\t\t}\n\t\t},\n\t\t[externalRef, internalRef],\n\t);\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nconst CheckboxComponent = React.forwardRef<HTMLInputElement, CheckboxProps>(\n\t(\n\t\t{\n\t\t\tchecked,\n\t\t\tdefaultChecked = false,\n\t\t\tindeterminate = false,\n\t\t\tonCheckedChange,\n\t\t\tstate: stateProp,\n\t\t\tonStateChange,\n\t\t\tdisabled = false,\n\t\t\terror = false,\n\t\t\tlabel,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-labelledby\": ariaLabelledby,\n\t\t\t\"aria-describedby\": ariaDescribedby,\n\t\t\t\"aria-required\": ariaRequired,\n\t\t\tname,\n\t\t\tvalue,\n\t\t\tid: idProp,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst generatedId = React.useId();\n\t\tconst inputId = idProp ?? (label ? `checkbox-${generatedId}` : undefined);\n\n\t\tconst [internalState, setInternalState] = React.useState<CheckboxState>(\n\t\t\t() => (defaultChecked ? \"checked\" : \"unchecked\"),\n\t\t);\n\n\t\t// `state` and `checked` determine controlled vs uncontrolled.\n\t\t// `indeterminate` is visual-only and always overrides.\n\t\tconst isControlled = stateProp !== undefined || checked !== undefined;\n\t\tconst baseState = isControlled\n\t\t\t? resolveState(checked, false, stateProp)\n\t\t\t: internalState;\n\t\tconst effectiveState: CheckboxState = indeterminate\n\t\t\t? \"indeterminate\"\n\t\t\t: baseState;\n\n\t\t// ── Ripple ──────────────────────────────────────────────────────────\n\t\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\t\tconst removeRipple = React.useCallback(\n\t\t\t(id: number) => setRipples((prev) => prev.filter((r) => r.id !== id)),\n\t\t\t[],\n\t\t);\n\n\t\tconst onPointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\t\tif (disabled) return;\n\t\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\t\t// Ripple origin offset by 4px to simulate a 40×40 state layer inside 48×48 touch target.\n\t\t\t\tconst x = e.clientX - rect.left - 4;\n\t\t\t\tconst y = e.clientY - rect.top - 4;\n\t\t\t\tconst rippleSize = Math.hypot(40, 40) * 2;\n\t\t\t\tsetRipples((prev) => [\n\t\t\t\t\t...prev,\n\t\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t\t]);\n\t\t\t},\n\t\t\t[disabled],\n\t\t);\n\n\t\t// ── Change handler ───────────────────────────────────────────────────\n\t\tconst handleChange = React.useCallback(\n\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\tif (disabled) return;\n\n\t\t\t\tif (stateProp !== undefined) {\n\t\t\t\t\tonStateChange?.(NEXT_STATE[effectiveState]);\n\t\t\t\t} else if (checked !== undefined) {\n\t\t\t\t\tonCheckedChange?.(e.target.checked);\n\t\t\t\t} else {\n\t\t\t\t\tconst next = NEXT_STATE[effectiveState];\n\t\t\t\t\tsetInternalState(next);\n\t\t\t\t\tif (next === \"indeterminate\") {\n\t\t\t\t\t\tonStateChange?.(next);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonCheckedChange?.(next === \"checked\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tdisabled,\n\t\t\t\tstateProp,\n\t\t\t\tchecked,\n\t\t\t\teffectiveState,\n\t\t\t\tonStateChange,\n\t\t\t\tonCheckedChange,\n\t\t\t],\n\t\t);\n\n\t\t// ── Sync indeterminate DOM property ──────────────────────────────────\n\t\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, inputRef);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (inputRef.current) {\n\t\t\t\tinputRef.current.indeterminate = effectiveState === \"indeterminate\";\n\t\t\t}\n\t\t}, [effectiveState]);\n\n\t\t// ── Derived visual state ─────────────────────────────────────────────\n\t\tconst isChecked = effectiveState === \"checked\";\n\t\tconst isIndeterminate = effectiveState === \"indeterminate\";\n\t\tconst isSelected = isChecked || isIndeterminate;\n\t\tconst ariaChecked = isIndeterminate ? (\"mixed\" as const) : isChecked;\n\n\t\t// ── Animation values ─────────────────────────────────────────────────\n\t\tconst accentColor = error\n\t\t\t? \"var(--color-m3-error)\"\n\t\t\t: \"var(--color-m3-primary)\";\n\t\tconst onAccentColor = error\n\t\t\t? \"var(--color-m3-on-error)\"\n\t\t\t: \"var(--color-m3-on-primary)\";\n\n\t\t// MD3 Outline color (on-surface with 38% opacity)\n\t\t// We use a CSS variable or a static RGBA to ensure Framer Motion can animate it.\n\t\t// Since color-mix is not animatable, we'll use the variable directly if it's a plain color,\n\t\t// or use a fallback. Better yet, we can use the style prop for static colors\n\t\t// and only animate opacity if needed, but here we want to animate the color itself.\n\t\tconst outlineColor = error\n\t\t\t? \"var(--color-m3-error)\"\n\t\t\t: \"rgba(0, 0, 0, 0.38)\"; // Standard fallback for on-surface 38%\n\n\t\tconst containerBg = isSelected ? accentColor : \"rgba(0, 0, 0, 0)\";\n\t\tconst containerBorderColor = isSelected ? \"rgba(0, 0, 0, 0)\" : outlineColor;\n\t\tconst containerBorderWidth = isSelected ? 0 : 2;\n\t\tconst iconColor = isSelected ? onAccentColor : \"rgba(0, 0, 0, 0)\";\n\n\t\tconst svgPath = isIndeterminate ? DASH_PATH : CHECKMARK_PATH;\n\t\tconst pathLength = isSelected ? 1 : 0;\n\n\t\tconst fillDuration = prefersReduced ? 0 : isSelected ? 0.15 : 0.1;\n\t\tconst drawDuration = prefersReduced ? 0 : isSelected ? 0.2 : 0.1;\n\t\tconst morphDuration = prefersReduced ? 0 : 0.2;\n\n\t\t// ── State layer classes ──────────────────────────────────────────────\n\t\tconst stateLayerBg = isSelected\n\t\t\t? error\n\t\t\t\t? \"before:bg-m3-error\"\n\t\t\t\t: \"before:bg-m3-primary\"\n\t\t\t: error\n\t\t\t\t? \"before:bg-m3-error\"\n\t\t\t\t: \"before:bg-m3-on-surface\";\n\n\t\tconst stateLayerClass = cn(\n\t\t\t\"before:absolute before:inset-0 before:rounded-full before:pointer-events-none\",\n\t\t\t\"before:transition-opacity before:duration-150 before:opacity-0\",\n\t\t\t\"group-hover/cbx:before:opacity-[0.08]\",\n\t\t\t\"group-focus-within/cbx:before:opacity-[0.10]\",\n\t\t\t\"group-active/cbx:before:opacity-[0.10]\",\n\t\t\tstateLayerBg,\n\t\t);\n\n\t\t// ── Shared visual props ──────────────────────────────────────────────\n\t\tconst visualProps: CheckboxVisualProps = {\n\t\t\tisSelected,\n\t\t\tisIndeterminate,\n\t\t\tcontainerBg,\n\t\t\tcontainerBorderColor,\n\t\t\tcontainerBorderWidth,\n\t\t\ticonColor,\n\t\t\tsvgPath,\n\t\t\tpathLength,\n\t\t\tfillDuration,\n\t\t\tdrawDuration,\n\t\t\tmorphDuration,\n\t\t\tprefersReduced,\n\t\t};\n\n\t\tconst touchTargetClass = cn(\n\t\t\t\"relative inline-flex items-center justify-center outline-none shrink-0\",\n\t\t\t\"w-12 h-12 group/cbx\",\n\t\t\tdisabled && \"pointer-events-none\",\n\t\t);\n\n\t\t// ── Render ───────────────────────────────────────────────────────────\n\t\tconst stateLayerAndRipple = (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute flex items-center justify-center w-10 h-10 m-auto inset-0 rounded-full overflow-hidden pointer-events-none\",\n\t\t\t\t\tstateLayerClass,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<Ripple\n\t\t\t\t\tripples={ripples}\n\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\n\t\tconst hiddenInput = (\n\t\t\t<input\n\t\t\t\tref={mergedRef}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tid={inputId}\n\t\t\t\tname={name}\n\t\t\t\tvalue={value}\n\t\t\t\tchecked={isChecked}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-checked={ariaChecked}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-labelledby={ariaLabelledby}\n\t\t\t\taria-describedby={ariaDescribedby}\n\t\t\t\taria-required={ariaRequired}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tclassName=\"sr-only\"\n\t\t\t/>\n\t\t);\n\n\t\tif (label) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"inline-flex items-center gap-2 cursor-pointer select-none\",\n\t\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\t\"cursor-not-allowed opacity-[0.38] pointer-events-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className={touchTargetClass} onPointerDown={onPointerDown}>\n\t\t\t\t\t\t\t{stateLayerAndRipple}\n\t\t\t\t\t\t\t{hiddenInput}\n\t\t\t\t\t\t\t<CheckboxVisual {...visualProps} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-sm leading-none text-m3-on-surface\">\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<label\n\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\tclassName={cn(touchTargetClass, \"cursor-pointer\", className)}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t>\n\t\t\t\t\t{stateLayerAndRipple}\n\t\t\t\t\t{hiddenInput}\n\t\t\t\t\t<CheckboxVisual {...visualProps} />\n\t\t\t\t</label>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nCheckboxComponent.displayName = \"Checkbox\";\n\n/**\n * MD3 Expressive Checkbox component.\n *\n * Supports 2-state and tri-state patterns. Fully animated per MD3 spec:\n * checkmark draw, indeterminate dash morph, container fill, state layer, and ripple.\n *\n * @example\n * ```tsx\n * <Checkbox checked={isChecked} onCheckedChange={setIsChecked} label=\"Accept terms\" />\n * <Checkbox state={parentState} onStateChange={setParentState} label=\"Select all\" />\n * <Checkbox error label=\"Required field\" aria-describedby=\"err-msg\" />\n * ```\n * @see https://m3.material.io/components/checkbox/overview\n */\nexport const Checkbox = React.memo(CheckboxComponent);\n\n// ─── TriStateCheckbox ─────────────────────────────────────────────────────────\n\nconst TriStateCheckboxComponent = React.forwardRef<\n\tHTMLInputElement,\n\tTriStateCheckboxProps\n>(({ state, onStateChange, ...rest }, ref) => (\n\t<Checkbox ref={ref} state={state} onStateChange={onStateChange} {...rest} />\n));\n\nTriStateCheckboxComponent.displayName = \"TriStateCheckbox\";\n\n/**\n * MD3 Expressive Tri-State Checkbox.\n *\n * Convenience wrapper around `Checkbox` that enforces `state` + `onStateChange`.\n * Ideal for parent-child selection patterns.\n *\n * @example\n * ```tsx\n * <TriStateCheckbox state={parentState} onStateChange={setParentState} label=\"Select all\" />\n * ```\n */\nexport const TriStateCheckbox = React.memo(TriStateCheckboxComponent);\n","/**\n * @file chip.tsx\n *\n * MD3 Expressive Chip component — 4 variants.\n *\n * - `assist` → Triggered actions spanning multiple apps. Flat (bordered) or Elevated.\n * - `filter` → Toggleable selections. Animated checkmark on select.\n * - `input` → Entities/tags with optional avatar and a dedicated remove button.\n * - `suggestion` → Contextual dynamic recommendations. Flat (bordered) or Elevated.\n *\n * @remarks\n * Token references (Kotlin source):\n * AssistChipTokens, FilterChipTokens, InputChipTokens, SuggestionChipTokens\n *\n * Architecture:\n * - Styling: `cva` + `cn` (clsx/tailwind-merge)\n * - Animation: Framer Motion (`LazyMotion` + `domMax`) for animated checkmark\n * - Ripple: `Ripple` + `useRippleState` from `./ripple.tsx`\n * - A11y: `role=\"checkbox\"` (filter), `role=\"button\"` (others); full keyboard support\n *\n * @see https://m3.material.io/components/chips/overview\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Ripple, useRippleState } from \"./ripple\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Icons\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Animated checkmark icon for selected Filter chips.\n * @internal\n */\nfunction CheckIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth={18}\n\t\t\theight={18}\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2.5}\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t>\n\t\t\t<polyline points=\"20 6 9 17 4 12\" />\n\t\t</svg>\n\t);\n}\n\n/**\n * Close (×) icon for the trailing remove button on Input chips.\n * @internal\n */\nfunction CloseIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth={18}\n\t\t\theight={18}\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth={2.5}\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t>\n\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t\t</svg>\n\t);\n}\n\n// CVA Variants\n// Token mapping references (Kotlin source):\n// - FlatOutlineColor (all variants): border-m3-outline-variant\n// - FlatSelectedContainerColor: bg-m3-secondary-container\n// - SelectedLabelTextColor: text-m3-on-secondary-container\n// - ElevatedContainerColor: bg-m3-surface-container-low\n\nconst chipVariants = cva(\n\t[\n\t\t// Base layout\n\t\t\"inline-flex items-center h-8 rounded-lg\",\n\t\t// Typography: LabelLarge\n\t\t\"text-sm font-medium leading-none\",\n\t\t// Interaction\n\t\t\"relative overflow-hidden cursor-pointer select-none\",\n\t\t\"transition-all duration-200 ease-in-out\",\n\t\t// Remove browser default focus; use MD3 focus ring\n\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n\t\t\"focus-visible:ring-m3-secondary\",\n\t\t// Expressive scale feedback (MD3 \"bouncy\" press)\n\t\t\"active:scale-[0.98]\",\n\t\t// MD3 State Layer (pseudo-element overlay)\n\t\t// Use inset-[-1px] to ensure the state layer covers the 1px border perfectly\n\t\t\"before:absolute before:inset-[-1px] before:pointer-events-none before:rounded-lg\",\n\t\t\"before:transition-opacity before:duration-200 before:opacity-0\",\n\t\t\"hover:before:opacity-[0.08] focus-visible:before:opacity-[0.10] active:before:opacity-[0.10]\",\n\t].join(\" \"),\n\t{\n\t\tvariants: {\n\t\t\t/**\n\t\t\t * Chip variant controlling default colors and border behavior.\n\t\t\t * Selected/elevated state overrides are applied via `cn()` at runtime.\n\t\t\t */\n\t\t\tvariant: {\n\t\t\t\t/**\n\t\t\t\t * Assist chip – FlatOutlineColor: outline-variant, LabelTextColor: on-surface\n\t\t\t\t * Leading icon color: primary (AssistChipTokens.IconColor)\n\t\t\t\t */\n\t\t\t\tassist:\n\t\t\t\t\t\"border border-m3-outline-variant text-m3-on-surface before:bg-m3-on-surface\",\n\t\t\t\t/**\n\t\t\t\t * Filter chip (unselected) – FlatUnselectedOutlineColor: outline-variant\n\t\t\t\t * UnselectedLabelTextColor: on-surface-variant\n\t\t\t\t */\n\t\t\t\tfilter:\n\t\t\t\t\t\"border border-m3-outline-variant text-m3-on-surface-variant before:bg-m3-on-surface-variant\",\n\t\t\t\t/**\n\t\t\t\t * Input chip (unselected) – UnselectedOutlineColor: outline-variant\n\t\t\t\t * UnselectedLabelTextColor: on-surface-variant\n\t\t\t\t */\n\t\t\t\tinput:\n\t\t\t\t\t\"border border-m3-outline-variant text-m3-on-surface-variant before:bg-m3-on-surface-variant\",\n\t\t\t\t/**\n\t\t\t\t * Suggestion chip – FlatOutlineColor: outline-variant\n\t\t\t\t * LabelTextColor: on-surface-variant (SuggestionChipTokens)\n\t\t\t\t */\n\t\t\t\tsuggestion:\n\t\t\t\t\t\"border border-m3-outline-variant text-m3-on-surface-variant before:bg-m3-on-surface-variant\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { variant: \"assist\" },\n\t},\n);\n\nexport interface ChipProps\n\textends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n\t/**\n\t * Chip variant.\n\t * - `assist` → Smart/automated actions. Flat by default, can be elevated.\n\t * - `filter` → Toggleable tag/filter. Shows animated checkmark when selected.\n\t * - `input` → Entity representation (tag, contact). Has optional avatar + remove button.\n\t * - `suggestion` → Contextual suggestions. Like assist, flat by default, can be elevated.\n\t * @default 'assist'\n\t */\n\tvariant?: VariantProps<typeof chipVariants>[\"variant\"];\n\n\t/**\n\t * Renders with elevation shadow (Level 1) and fills background with `surface-container-low`.\n\t * Applicable to `assist`, `filter` (unselected), and `suggestion` variants.\n\t * Source: AssistChipTokens.ElevatedContainerColor / SuggestionChipTokens.ElevatedContainerColor\n\t */\n\televated?: boolean;\n\n\t/**\n\t * Toggle/selection state.\n\t * - `filter`: selected → bg `secondary-container`, animated checkmark appears.\n\t * - `input`: selected → bg `secondary-container`.\n\t * Used for `role=\"checkbox\"` (filter) / `aria-pressed` (input).\n\t */\n\tselected?: boolean;\n\n\t/**\n\t * Disables the chip. Applies:\n\t * - `pointer-events-none` – no mouse/touch interaction\n\t * - `opacity-[0.38]` – DisabledLabelTextOpacity (0.38) per MD3 tokens\n\t * - `aria-disabled=\"true\"`\n\t * - `tabIndex={-1}`\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * Visible label. Required. Can be a string or ReactNode.\n\t */\n\tlabel: React.ReactNode;\n\n\t/**\n\t * Optional leading icon element (18×18px recommended).\n\t * For `filter` chips with `selected=true`, this is replaced by an animated checkmark.\n\t * For `assist`/`suggestion`: icon color → `primary`\n\t * For `input` (unselected): icon color → `on-surface-variant`\n\t */\n\tleadingIcon?: React.ReactNode;\n\n\t/**\n\t * Optional trailing icon element (18×18px recommended).\n\t * Color: `on-surface-variant` (unselected) / `on-secondary-container` (selected).\n\t */\n\ttrailingIcon?: React.ReactNode;\n\n\t/**\n\t * Avatar element for `input` chips. Takes priority over `leadingIcon`.\n\t * Rendered as a 24×24px circle (InputChipTokens: AvatarSize = 24.dp, AvatarShape = CornerFull).\n\t */\n\tavatar?: React.ReactNode;\n\n\t/**\n\t * Callback when the trailing remove (×) button is activated on `input` chips.\n\t * When provided, a dedicated tabbable close button with `aria-label=\"Remove {label}\"` is rendered.\n\t */\n\tonRemove?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nconst ChipImpl = React.forwardRef<HTMLButtonElement, ChipProps>(\n\t(\n\t\t{\n\t\t\tvariant = \"assist\",\n\t\t\televated = false,\n\t\t\tselected = false,\n\t\t\tdisabled = false,\n\t\t\tlabel,\n\t\t\tleadingIcon,\n\t\t\ttrailingIcon,\n\t\t\tavatar,\n\t\t\tonRemove,\n\t\t\tclassName,\n\t\t\tonClick,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst isFilter = variant === \"filter\";\n\t\tconst isInput = variant === \"input\";\n\n\t\t/**\n\t\t * For input chips, avatar takes priority over leadingIcon.\n\t\t * Source: leadingContent() in Chip.kt – \"An avatar takes precedence\"\n\t\t */\n\t\tconst resolvedLeadingIcon = isInput && avatar ? avatar : leadingIcon;\n\n\t\t/**\n\t\t * Filter chip: when selected, show animated checkmark.\n\t\t * If a leadingIcon is provided, the checkmark replaces it when selected.\n\t\t * Source: Chip.kt – AnimatedVisibility with expandHorizontally + fadeIn\n\t\t */\n\t\tconst showCheckmark = isFilter && selected;\n\n\t\t/** Trailing slot: custom trailingIcon OR the remove button for input chips */\n\t\tconst hasTrailingContent = !!trailingIcon || !!onRemove;\n\n\t\t/**\n\t\t * Leading slot: filter chips always have a potential leading slot\n\t\t * (checkmark or leadingIcon). Otherwise depends on resolvedLeadingIcon.\n\t\t */\n\t\tconst hasLeadingContent = isFilter || !!resolvedLeadingIcon;\n\n\t\t// Source: AssistChipDefaults.ContentPadding / inputChipPadding in Chip.kt\n\t\t// No icons: px-4 | Input: px-3\n\t\t// Leading only: pl-2 pr-4 | Input: pl-1 pr-3\n\t\t// Trailing only: pl-4 pr-2 | Input: pl-3 pr-2\n\t\t// Both: px-2 | Input: pl-1 pr-2\n\t\tconst paddingClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcn(\n\t\t\t\t\t!isInput && !hasLeadingContent && !hasTrailingContent && \"px-4\",\n\t\t\t\t\t!isInput && hasLeadingContent && !hasTrailingContent && \"pl-2 pr-4\",\n\t\t\t\t\t!isInput && !hasLeadingContent && hasTrailingContent && \"pl-4 pr-2\",\n\t\t\t\t\t!isInput && hasLeadingContent && hasTrailingContent && \"px-2\",\n\t\t\t\t\tisInput && !hasLeadingContent && !hasTrailingContent && \"px-3\",\n\t\t\t\t\tisInput && hasLeadingContent && !hasTrailingContent && \"pl-1 pr-3\",\n\t\t\t\t\tisInput && !hasLeadingContent && hasTrailingContent && \"pl-3 pr-2\",\n\t\t\t\t\tisInput && hasLeadingContent && hasTrailingContent && \"pl-1 pr-2\",\n\t\t\t\t),\n\t\t\t[isInput, hasLeadingContent, hasTrailingContent],\n\t\t);\n\n\t\t// Selected / elevated / disabled state overrides.\n\t\t// Source: MD3 tokens — DisabledLabelTextOpacity=0.38, FlatDisabledOutlineOpacity=0.12\n\t\tconst stateClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcn(\n\t\t\t\t\t(isFilter || isInput) &&\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container border-none before:bg-m3-on-secondary-container\",\n\t\t\t\t\televated &&\n\t\t\t\t\t\t!selected &&\n\t\t\t\t\t\t\"bg-m3-surface-container-low border-none elevation-1\",\n\t\t\t\t\televated && isFilter && selected && \"elevation-1\",\n\t\t\t\t\tdisabled && \"opacity-[0.38] pointer-events-none cursor-not-allowed\",\n\t\t\t\t\tdisabled && !selected && \"border-m3-outline-variant/[.12]\",\n\t\t\t\t\tdisabled &&\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\"bg-m3-on-surface/[.12] text-m3-on-surface border-none\",\n\t\t\t\t),\n\t\t\t[isFilter, isInput, selected, elevated, disabled],\n\t\t);\n\n\t\t// Leading icon color tokens:\n\t\t// assist/suggestion → Primary | filter unselected → Primary\n\t\t// filter selected → OnSecondaryContainer | input unselected → OnSurfaceVariant | input selected → Primary\n\t\tconst leadingIconColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcn(\n\t\t\t\t\t(variant === \"assist\" || variant === \"suggestion\") &&\n\t\t\t\t\t\t\"text-m3-primary\",\n\t\t\t\t\tisFilter && !selected && \"text-m3-primary\",\n\t\t\t\t\tisFilter && selected && \"text-m3-on-secondary-container\",\n\t\t\t\t\tisInput && !selected && \"text-m3-on-surface-variant\",\n\t\t\t\t\tisInput && selected && \"text-m3-primary\",\n\t\t\t\t),\n\t\t\t[variant, isFilter, isInput, selected],\n\t\t);\n\n\t\tconst isCompound = !!onRemove;\n\t\tconst Root = (isCompound ? \"div\" : \"button\") as React.ElementType;\n\n\t\t// Composed class for the root container\n\t\tconst containerClass = cn(\n\t\t\tchipVariants({ variant }),\n\t\t\t!isCompound && paddingClass,\n\t\t\t!isCompound && \"gap-2\",\n\t\t\tstateClass,\n\t\t\t// When compound, the root div handles the overall shape but not the main interaction\n\t\t\t// We disable the root's state layer (hover/focus) to avoid the 1px gap issue\n\t\t\tisCompound &&\n\t\t\t\t\"items-stretch cursor-default active:scale-100 before:opacity-0 gap-0\",\n\t\t\tclassName,\n\t\t);\n\n\t\t/** Main hit area content (Leading Icon + Label) */\n\t\tconst mainContent = (\n\t\t\t<>\n\t\t\t\t<AnimatePresence initial={false} mode=\"wait\">\n\t\t\t\t\t{isFilter ? (\n\t\t\t\t\t\tshowCheckmark ? (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"checkmark\"\n\t\t\t\t\t\t\t\tinitial={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\tanimate={{ width: 18, opacity: 1 }}\n\t\t\t\t\t\t\t\texit={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\twidth: { duration: 0.2, ease: [0.2, 0, 0, 1] },\n\t\t\t\t\t\t\t\t\topacity: { duration: 0.15, ease: \"easeOut\" },\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 overflow-hidden\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<CheckIcon />\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t) : resolvedLeadingIcon ? (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"leading-icon\"\n\t\t\t\t\t\t\t\tinitial={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\tanimate={{ width: 18, opacity: 1 }}\n\t\t\t\t\t\t\t\texit={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\twidth: { duration: 0.2, ease: [0.2, 0, 0, 1] },\n\t\t\t\t\t\t\t\t\topacity: { duration: 0.15, ease: \"easeOut\" },\n\t\t\t\t\t\t\t\t}}\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 overflow-hidden [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\t\tleadingIconColorClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{ fontSize: 18 }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{resolvedLeadingIcon}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t) : null\n\t\t\t\t\t) : resolvedLeadingIcon ? (\n\t\t\t\t\t\tisInput && avatar ? (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey=\"avatar\"\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 w-6 h-6 rounded-full overflow-hidden\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{resolvedLeadingIcon}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey=\"leading-icon\"\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 w-4.5 h-4.5 [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\t\tleadingIconColorClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{ fontSize: 18 }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{resolvedLeadingIcon}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t) : null}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<span className=\"whitespace-nowrap\">{label}</span>\n\t\t\t</>\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<Root\n\t\t\t\t\tref={(!isCompound ? ref : undefined) as React.Ref<HTMLButtonElement>}\n\t\t\t\t\ttype={!isCompound ? \"button\" : undefined}\n\t\t\t\t\t// Filter chips act as checkboxes; Input chips can be buttons/toggleable; others buttons\n\t\t\t\t\t// Source: Material Design 3 Accessibility\n\t\t\t\t\t{...(isFilter\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\trole: \"checkbox\" as React.AriaRole,\n\t\t\t\t\t\t\t\t\"aria-checked\": selected,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: isInput && !isCompound && selected\n\t\t\t\t\t\t\t? { role: \"button\", \"aria-pressed\": true }\n\t\t\t\t\t\t\t: isCompound\n\t\t\t\t\t\t\t\t? { role: \"group\" }\n\t\t\t\t\t\t\t\t: { role: \"button\" })}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\ttabIndex={isCompound ? -1 : disabled ? -1 : 0}\n\t\t\t\t\tdisabled={!isCompound ? disabled : undefined}\n\t\t\t\t\tonClick={!isCompound ? onClick : undefined}\n\t\t\t\t\tonPointerDown={!isCompound ? onPointerDown : undefined}\n\t\t\t\t\tclassName={containerClass}\n\t\t\t\t\t// Filter out props that shouldn't be on a div if isCompound\n\t\t\t\t\t{...(isCompound ? {} : props)}\n\t\t\t\t>\n\t\t\t\t\t{/* State Ripple layer */}\n\t\t\t\t\t{!isCompound && (\n\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Main action area: if compound, this is a nested button for a11y & avoids nesting buttons */}\n\t\t\t\t\t{isCompound ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonClick={onClick}\n\t\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center h-full grow focus:outline-none appearance-none bg-transparent border-none\",\n\t\t\t\t\t\t\t\t\"text-inherit font-inherit cursor-pointer\",\n\t\t\t\t\t\t\t\t// Move padding here; keep horizontal padding but remove trailing to fit next to X\n\t\t\t\t\t\t\t\tpaddingClass,\n\t\t\t\t\t\t\t\t\"gap-2\",\n\t\t\t\t\t\t\t\t\"pr-0\",\n\t\t\t\t\t\t\t\t// Re-apply focus ring to internal button instead of root div\n\t\t\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-secondary focus-visible:ring-inset\",\n\t\t\t\t\t\t\t\t\"rounded-l-[7px] rounded-r-none\",\n\t\t\t\t\t\t\t\t// State layer for main area\n\t\t\t\t\t\t\t\t\"relative overflow-hidden\",\n\t\t\t\t\t\t\t\t\"before:absolute before:-inset-px before:pointer-events-none before:bg-current\",\n\t\t\t\t\t\t\t\t\"before:transition-opacity before:duration-200 before:opacity-0 before:rounded-l-[7px]\",\n\t\t\t\t\t\t\t\t\"hover:before:opacity-[0.08] focus-visible:before:opacity-[0.10] active:before:opacity-[0.10]\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t{mainContent}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tmainContent\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Trailing slot */}\n\t\t\t\t\t{hasTrailingContent && (\n\t\t\t\t\t\t<span className=\"flex items-center justify-center shrink-0\">\n\t\t\t\t\t\t\t{onRemove ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\ttypeof label === \"string\" ? `Remove ${label}` : \"Remove\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tonRemove(e);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonPointerDown={(e: React.PointerEvent<HTMLButtonElement>) =>\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center w-8.5 h-full\", // 18px icon + 8px left + 8px right padding\n\t\t\t\t\t\t\t\t\t\t\"cursor-pointer focus-visible:outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"transition-all duration-150\",\n\t\t\t\t\t\t\t\t\t\t\"relative overflow-hidden rounded-r-[7px] rounded-l-none\",\n\t\t\t\t\t\t\t\t\t\t\"before:absolute before:-inset-px before:pointer-events-none before:bg-current\",\n\t\t\t\t\t\t\t\t\t\t\"before:transition-opacity before:duration-200 before:opacity-0 before:rounded-r-[7px]\",\n\t\t\t\t\t\t\t\t\t\t\"hover:before:opacity-[0.08] active:before:opacity-[0.12]\",\n\t\t\t\t\t\t\t\t\t\t// TrailingIcon color tokens\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\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<CloseIcon />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : trailingIcon ? (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center w-4.5 h-4.5 [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ fontSize: 18 }}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{trailingIcon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</Root>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nChipImpl.displayName = \"Chip\";\n\n/**\n * MD3 Expressive Chip — 4-variant interactive tag component.\n *\n * @remarks\n * - `filter` chips accept `selected` and render an animated checkmark.\n * - `input` chips accept `onRemove` to render a compound close button.\n * - `elevated` is supported on `assist`, `filter` (unselected), and `suggestion`.\n * - Fully accessible: `role=\"checkbox\"` for filter, `role=\"group\"` for compound chips.\n *\n * @example\n * ```tsx\n * // Assist chip\n * <Chip variant=\"assist\" label=\"Share\" onClick={share} />\n *\n * // Filter chip\n * <Chip variant=\"filter\" label=\"Unread\" selected={showUnread} onClick={toggle} />\n *\n * // Input chip with remove\n * <Chip variant=\"input\" label=\"React\" onRemove={() => removeTag(\"React\")} />\n * ```\n *\n * @see https://m3.material.io/components/chips/overview\n */\nexport const Chip = React.memo(ChipImpl);\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}\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\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst radixType: RadixScrollAreaType = type === \"none\" ? \"always\" : type;\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\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)}\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={type === \"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={type === \"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","\"use client\";\n\nimport { createElement, useCallback, useEffect, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Icon } from \"./icon\";\nimport { ScrollArea } from \"./scroll-area\";\n\nconst COPY_RESET_DELAY = 2000;\n\nexport interface CodeBlockProps {\n\t/** Raw code string to display and copy. */\n\tcode: string;\n\t/** Language label in the header (presentational only). @default \"React\" */\n\tlanguage?: string;\n\t/** Additional CSS classes for the outer wrapper. */\n\tclassName?: string;\n\t/**\n\t * Pre-highlighted HTML from Shiki SSR.\n\t * Use `codeToHtml` with `themes: { light, dark }` for dual-theme support.\n\t */\n\thtml?: string;\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction CopyButton({\n\tcopied,\n\tonCopy,\n}: {\n\tcopied: boolean;\n\tonCopy: () => void;\n}) {\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onCopy}\n\t\t\ttitle=\"Copy code\"\n\t\t\taria-label={copied ? \"Code copied\" : \"Copy code\"}\n\t\t\tcolorStyle=\"text\"\n\t\t\tclassName=\"h-8 px-2 gap-1.5\"\n\t\t>\n\t\t\t{copied ? (\n\t\t\t\t<>\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname=\"check\"\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tclassName=\"text-m3-primary\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"text-[10px] font-bold uppercase tracking-wider text-m3-primary\">\n\t\t\t\t\t\tCopied!\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname=\"content_copy\"\n\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\tclassName=\"text-m3-on-surface-variant\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"text-[10px] font-bold uppercase tracking-wider text-m3-on-surface-variant\">\n\t\t\t\t\t\tCopy\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Button>\n\t);\n}\n\n/** Mappings for HTML attributes to React props */\nconst ATTR_MAP: Record<string, string> = {\n\tclass: \"className\",\n\ttabindex: \"tabIndex\",\n\treadonly: \"readOnly\",\n\tmaxlength: \"maxLength\",\n\tautocomplete: \"autoComplete\",\n\tautofocus: \"autoFocus\",\n\tcontenteditable: \"contentEditable\",\n\tspellcheck: \"spellCheck\",\n};\n\nfunction parseStyle(styleStr: string): React.CSSProperties {\n\tconst styleObj: Record<string, string> = {};\n\tfor (const s of styleStr.split(\";\")) {\n\t\tconst part = s.trim();\n\t\tif (!part) continue;\n\t\tconst colonIndex = part.indexOf(\":\");\n\t\tif (colonIndex === -1) continue;\n\n\t\tconst k = part.slice(0, colonIndex).trim();\n\t\tconst v = part.slice(colonIndex + 1).trim();\n\n\t\tif (k.startsWith(\"--\")) {\n\t\t\t// CSS variables must be passed as-is\n\t\t\tstyleObj[k] = v;\n\t\t} else {\n\t\t\t// Standard properties should be camelCased for React\n\t\t\tconst key = k.replace(/-./g, (x) => x[1].toUpperCase());\n\t\t\tstyleObj[key] = v;\n\t\t}\n\t}\n\treturn styleObj as React.CSSProperties;\n}\n\nfunction mapDomToReact(node: Node, key: string | number): React.ReactNode {\n\tif (node.nodeType === Node.TEXT_NODE) {\n\t\treturn node.textContent;\n\t}\n\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\tconst el = node as Element;\n\t\tconst tagName = el.tagName.toLowerCase();\n\t\tconst props: Record<string, unknown> = { key };\n\n\t\tfor (const attr of Array.from(el.attributes)) {\n\t\t\tconst propName = ATTR_MAP[attr.name] || attr.name;\n\t\t\tif (propName === \"style\") {\n\t\t\t\tprops.style = parseStyle(attr.value);\n\t\t\t} else {\n\t\t\t\tprops[propName] = attr.value;\n\t\t\t}\n\t\t}\n\n\t\treturn createElement(\n\t\t\ttagName,\n\t\t\tprops,\n\t\t\tArray.from(el.childNodes).map((child, i) => mapDomToReact(child, i)),\n\t\t);\n\t}\n\treturn null;\n}\n\nfunction CodeContent({ html, code }: { html?: string; code: string }) {\n\tconst [parsedContent, setParsedContent] = useState<React.ReactNode>(null);\n\n\tuseEffect(() => {\n\t\tif (html) {\n\t\t\tconst parser = new DOMParser();\n\t\t\tconst doc = parser.parseFromString(html, \"text/html\");\n\t\t\tconst content = Array.from(doc.body.childNodes).map((node, i) =>\n\t\t\t\tmapDomToReact(node, i),\n\t\t\t);\n\t\t\tsetParsedContent(content);\n\t\t}\n\t}, [html]);\n\n\tif (html) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-sm font-mono\",\n\t\t\t\t\t\"[&>pre]:bg-transparent! [&>pre]:p-0! [&>pre]:m-0!\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{parsedContent}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<pre className=\"text-sm font-mono text-m3-on-surface whitespace-pre\">\n\t\t\t{code}\n\t\t</pre>\n\t);\n}\n\n// ─── CodeBlock ────────────────────────────────────────────────────────────────\n\nexport function CodeBlock({\n\tcode,\n\tlanguage = \"React\",\n\tclassName,\n\thtml,\n}: CodeBlockProps) {\n\tconst [copied, setCopied] = useState(false);\n\n\tconst handleCopy = useCallback(async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(code);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), COPY_RESET_DELAY);\n\t\t} catch {\n\t\t\t// Clipboard API unavailable — fail silently\n\t\t}\n\t}, [code]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-m3-lg overflow-hidden max-w-full\",\n\t\t\t\t\"bg-m3-surface-container-lowest border border-m3-outline-variant/60\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-4 py-2 flex justify-between items-center\",\n\t\t\t\t\t\"bg-m3-surface-container-low border-b border-m3-outline-variant/60\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"text-xs font-mono text-m3-on-surface-variant\">\n\t\t\t\t\t{language}\n\t\t\t\t</span>\n\t\t\t\t<CopyButton copied={copied} onCopy={handleCopy} />\n\t\t\t</div>\n\n\t\t\t<ScrollArea\n\t\t\t\ttype=\"hover\"\n\t\t\t\torientation=\"both\"\n\t\t\t\tclassName=\"max-h-120 flex-col w-full min-w-0\"\n\t\t\t>\n\t\t\t\t<div className=\"p-4 min-w-0 w-full\">\n\t\t\t\t\t<CodeContent html={html} code={code} />\n\t\t\t\t</div>\n\t\t\t</ScrollArea>\n\t\t</div>\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/** 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\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 iconPx = sizeIcon.px;\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\ticonClass,\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={iconPx}\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={iconPx}\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\ticonClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{ fontSize: iconPx }}\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","/**\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, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { IconButton } from \"./icon-button\";\nimport { ScrollArea } from \"./scroll-area\";\n\n// ─── MD3 Spring Config (Expressive) ──────────────────────────────────────────\nconst MD3_SPRING = {\n\ttype: \"spring\" as const,\n\tstiffness: 400,\n\tdamping: 30,\n\tmass: 1,\n};\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<motion.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<motion.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</motion.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<motion.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</motion.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 divider.tsx\n *\n * MD3 Expressive Divider component.\n *\n * - `Divider` → A thin line that groups content in lists and layouts.\n *\n * @remarks\n * Token references (Kotlin source — DividerTokens.kt v0_117):\n * Color = ColorSchemeKeyTokens.OutlineVariant → bg-m3-outline-variant / text-m3-outline-variant\n * Thickness = 1.0.dp → h-px (flat horizontal) | w-px (flat vertical) | strokeWidth={1} (wavy SVG)\n *\n * Variants:\n * - \"full-bleed\" → spans full width, no indent\n * - \"inset\" → leading indent (16dp standard / 72dp after-icon via insetStart)\n * - \"middle-inset\" → 16dp indent both sides\n * - \"subheader\" → same as full-bleed (label provided externally)\n *\n * Shapes:\n * - \"flat\" → straight 1px line rendered as <m.div> (default)\n * - \"wavy\" → sinusoidal SVG wave via <m.svg> + buildWavePath helper (horizontal only)\n *\n * Architecture:\n * - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes only\n * - Animation: Framer Motion LazyMotion/domMax, scaleX/scaleY spring entrance\n * - Wavy: SVG path generated by pure-JS `buildWavePath()` (cubic Bézier sine approx)\n * Uses ResizeObserver (via useContainerWidth) to measure container width so\n * the path has precise bounds and leading/trailing ends are properly rounded.\n * - A11y: role=\"separator\", aria-orientation, aria-hidden when decorative\n *\n * @see https://m3.material.io/components/divider/overview\n */\n\nimport { domMax, LazyMotion, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useContainerWidth, useMergedRef } from \"./progress-indicator/hooks\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Exclude onDrag-family event handlers that conflict between React's HTMLAttributes\n// and Framer Motion's MotionProps (different DragEvent signatures).\ntype SafeHTMLDivAttrs = Omit<\n\tReact.HTMLAttributes<HTMLDivElement>,\n\t| \"onDrag\"\n\t| \"onDragStart\"\n\t| \"onDragEnd\"\n\t| \"onDragEnter\"\n\t| \"onDragLeave\"\n\t| \"onDragOver\"\n\t| \"onDrop\"\n>;\n\nexport interface DividerProps extends SafeHTMLDivAttrs {\n\t/**\n\t * Visual variant controlling indentation.\n\t * - \"full-bleed\" → no indent, spans full container width/height (default)\n\t * - \"inset\" → leading indent only (use `insetStart` to control amount)\n\t * - \"middle-inset\" → 16px indent on both sides\n\t * - \"subheader\" → alias for full-bleed, used before section labels\n\t * @default \"full-bleed\"\n\t */\n\tvariant?: \"full-bleed\" | \"inset\" | \"middle-inset\" | \"subheader\";\n\n\t/**\n\t * Orientation of the divider line.\n\t * - \"horizontal\" → renders as `h-px w-full` bar (default)\n\t * - \"vertical\" → renders as `w-px h-full` column\n\t * Note: `shape=\"wavy\"` is not supported with orientation=\"vertical\".\n\t * @default \"horizontal\"\n\t */\n\torientation?: \"horizontal\" | \"vertical\";\n\n\t/**\n\t * Shape of the divider line.\n\t * - \"flat\" → straight 1px line rendered as `<div>` (default)\n\t * - \"wavy\" → sinusoidal SVG wave (horizontal orientation only)\n\t *\n\t * When `shape=\"wavy\"` and `orientation=\"vertical\"`, silently falls back to\n\t * `shape=\"flat\"` and emits a `console.warn`.\n\t * @default \"flat\"\n\t */\n\tshape?: \"flat\" | \"wavy\";\n\n\t/**\n\t * Leading inset size for the \"inset\" variant.\n\t * - \"standard\" → 16px (`ml-4`)\n\t * - \"icon\" → 72px (`ml-[72px]`) — use when list items have leading icons/avatars\n\t * Only applies when `variant=\"inset\"`.\n\t * @default \"standard\"\n\t */\n\tinsetStart?: \"standard\" | \"icon\";\n\n\t/**\n\t * Wavy shape visual parameters. Only applies when `shape=\"wavy\"`.\n\t * All values are in pixels.\n\t */\n\twaveConfig?: {\n\t\t/**\n\t\t * Peak displacement from the center line.\n\t\t * @default 2\n\t\t */\n\t\tamplitude?: number;\n\t\t/**\n\t\t * Pixels per full sine cycle.\n\t\t * @default 32\n\t\t */\n\t\twavelength?: number;\n\t\t/**\n\t\t * Thickness of the wave stroke in pixels.\n\t\t * @default 1\n\t\t */\n\t\tstrokeWidth?: number;\n\t};\n\n\t/**\n\t * When true, marks the divider as decorative (`aria-hidden=\"true\"`).\n\t * Use when the divider is purely visual with no semantic meaning.\n\t * @default false\n\t */\n\tdecorative?: boolean;\n\n\t/**\n\t * When true, plays an entrance animation (scaleX/scaleY from 0→1).\n\t * Automatically disabled when user prefers reduced motion.\n\t * @default true\n\t */\n\tanimate?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generates an SVG path `d` string for a sinusoidal wave between two X bounds.\n * Uses cubic Bézier approximation of a sine curve for smooth rendering.\n * The error vs. a true sine is < 0.2%.\n *\n * Each half-cycle alternates between crest (+amplitude) and trough (-amplitude).\n * Control points are placed at 1/3 and 2/3 of each half-cycle for accuracy.\n *\n * @param startX - X coordinate where the path begins (e.g. capWidth = strokeWidth/2)\n * @param endX - X coordinate where the path ends (e.g. containerWidth - capWidth)\n * @param amplitude - Peak displacement from center line (px). Default: 2\n * @param wavelength - Pixels per full sine cycle. Default: 32\n * @param yCenter - Y coordinate of the wave center line. Default: 4\n * @returns SVG path `d` attribute string, or \"\" when startX >= endX\n *\n * @example\n * buildWavePath(0.5, 499.5, 2, 32, 4)\n * // → \"M 0.5,4 C 11.17,... 500,4 ...\"\n */\nexport function buildWavePath(\n\tstartX: number,\n\tendX: number,\n\tamplitude = 2,\n\twavelength = 32,\n\tyCenter = 4,\n): string {\n\tif (startX >= endX) return \"\";\n\n\tconst halfCycle = wavelength / 2;\n\tconst numHalfCycles = Math.ceil((endX - startX) / halfCycle);\n\n\t// MD3 precise bezier approximation: offset multiplier (4/3) lets control points\n\t// visually reach exactly the given amplitude.\n\tconst cpDistanceY = amplitude * (4 / 3);\n\n\tlet d = `M ${startX},${yCenter}`;\n\n\tfor (let i = 0; i < numHalfCycles; i++) {\n\t\tconst x0 = startX + i * halfCycle;\n\t\tconst x1 = Math.min(startX + (i + 1) * halfCycle, endX);\n\t\t// Alternate crest and trough\n\t\tconst peak = i % 2 === 0 ? yCenter - cpDistanceY : yCenter + cpDistanceY;\n\t\t// 1/3 and 2/3 ratio for smoother sine approximation (Google MD3 style)\n\t\tconst segLen = x1 - x0;\n\t\tconst cp1x = x0 + segLen / 3;\n\t\tconst cp2x = x1 - segLen / 3;\n\t\td += ` C ${cp1x},${peak} ${cp2x},${peak} ${x1},${yCenter}`;\n\t}\n\n\treturn d;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DividerImpl = React.forwardRef<HTMLDivElement, DividerProps>(\n\t(\n\t\t{\n\t\t\tvariant = \"full-bleed\",\n\t\t\torientation = \"horizontal\",\n\t\t\tshape = \"flat\",\n\t\t\tinsetStart = \"standard\",\n\t\t\twaveConfig,\n\t\t\tdecorative = false,\n\t\t\tanimate = true,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst reducedMotion = useReducedMotion();\n\t\tconst shouldAnimate = animate && !reducedMotion;\n\n\t\t// Wavy is only supported for horizontal orientation\n\t\tconst effectiveShape =\n\t\t\tshape === \"wavy\" && orientation === \"vertical\" ? \"flat\" : shape;\n\n\t\tif (shape === \"wavy\" && orientation === \"vertical\") {\n\t\t\tconsole.warn(\n\t\t\t\t\"[Divider] shape='wavy' is not supported with orientation='vertical'. Falling back to shape='flat'.\",\n\t\t\t);\n\t\t}\n\n\t\t// Container width measurement — needed for direct SVG path rendering so\n\t\t// leading/trailing ends land at exact bounds (enabling rounded caps).\n\t\tconst [containerRef, containerWidth] = useContainerWidth();\n\n\t\t// ── A11y attrs ──────────────────────────────────────────────────────────\n\t\tconst a11yProps = decorative\n\t\t\t? { \"aria-hidden\": \"true\" as const }\n\t\t\t: {\n\t\t\t\t\trole: \"separator\" as const,\n\t\t\t\t\t\"aria-orientation\": orientation,\n\t\t\t\t};\n\n\t\t// ── Ref Merging ────────────────────────────────────────────────────────\n\t\t// We need to merge the internal containerRef (for ResizeObserver) with\n\t\t// the user-provided external ref.\n\t\tconst mergedRef = useMergedRef(containerRef, ref);\n\n\t\t// ── Inset class mapping (all static) ────────────────────────────────────\n\t\tconst isHorizontal = orientation === \"horizontal\";\n\t\tconst insetClass = cn(\n\t\t\tvariant === \"inset\" &&\n\t\t\t\tisHorizontal &&\n\t\t\t\tinsetStart === \"standard\" &&\n\t\t\t\t\"ml-4\",\n\t\t\tvariant === \"inset\" &&\n\t\t\t\tisHorizontal &&\n\t\t\t\tinsetStart === \"icon\" &&\n\t\t\t\t\"ml-[72px]\",\n\t\t\tvariant === \"inset\" && !isHorizontal && \"mt-4\",\n\t\t\tvariant === \"middle-inset\" && isHorizontal && \"mx-4\",\n\t\t\tvariant === \"middle-inset\" && !isHorizontal && \"my-4\",\n\t\t);\n\n\t\t// ── Spring transition ────────────────────────────────────────────────────\n\t\tconst springTransition = shouldAnimate\n\t\t\t? ({ type: \"spring\", stiffness: 300, damping: 30, mass: 0.6 } as const)\n\t\t\t: ({ duration: 0 } as const);\n\n\t\t// ── Wavy amplitude / wavelength / thickness ───────────────────────────\n\t\tconst amplitude = waveConfig?.amplitude ?? 2;\n\t\tconst wavelength = waveConfig?.wavelength ?? 32;\n\t\tconst strokeWidth = waveConfig?.strokeWidth ?? 1;\n\n\t\t// ────────────────────────────────────────────────────────────────────────\n\t\t// RENDER: Wavy\n\t\t// ────────────────────────────────────────────────────────────────────────\n\t\tif (effectiveShape === \"wavy\") {\n\t\t\t// Canvas explicitly accommodates the curve's exact bounding box.\n\t\t\tconst canvasHeight = Math.ceil(amplitude * 2 + strokeWidth);\n\t\t\tconst yCenter = canvasHeight / 2;\n\n\t\t\t// Half stroke-width inset so rounded caps are not clipped by the SVG edge.\n\t\t\tconst capWidth = strokeWidth / 2;\n\t\t\tconst pathStartX = capWidth;\n\t\t\tconst pathEndX = Math.max(capWidth, containerWidth - capWidth);\n\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"block shrink-0 overflow-hidden\",\n\t\t\t\t\t\tisHorizontal ? \"w-full\" : \"h-full self-stretch\",\n\t\t\t\t\t\tinsetClass,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: `${canvasHeight}px`, ...style }}\n\t\t\t\t\t{...a11yProps}\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: spread safe HTMLDiv attrs\n\t\t\t\t\t{...(props as any)}\n\t\t\t\t>\n\t\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\tclassName=\"text-m3-outline-variant block\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{ overflow: \"visible\", transformOrigin: \"left center\" }}\n\t\t\t\t\t\t\tinitial={shouldAnimate ? { scaleX: 0, opacity: 0 } : undefined}\n\t\t\t\t\t\t\tanimate={shouldAnimate ? { scaleX: 1, opacity: 1 } : undefined}\n\t\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{containerWidth > 0 && (\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\td={buildWavePath(\n\t\t\t\t\t\t\t\t\t\tpathStartX,\n\t\t\t\t\t\t\t\t\t\tpathEndX,\n\t\t\t\t\t\t\t\t\t\tamplitude,\n\t\t\t\t\t\t\t\t\t\twavelength,\n\t\t\t\t\t\t\t\t\t\tyCenter,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\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</LazyMotion>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\t// ────────────────────────────────────────────────────────────────────────\n\t\t// RENDER: Flat\n\t\t// ────────────────────────────────────────────────────────────────────────\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"block shrink-0 bg-m3-outline-variant\",\n\t\t\t\t\t\tisHorizontal ? \"h-px w-full\" : \"w-px h-full self-stretch\",\n\t\t\t\t\t\tinsetClass,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...(isHorizontal\n\t\t\t\t\t\t\t? { transformOrigin: \"left\" }\n\t\t\t\t\t\t\t: { transformOrigin: \"top\" }),\n\t\t\t\t\t\t...style,\n\t\t\t\t\t}}\n\t\t\t\t\tinitial={\n\t\t\t\t\t\tshouldAnimate\n\t\t\t\t\t\t\t? isHorizontal\n\t\t\t\t\t\t\t\t? { scaleX: 0 }\n\t\t\t\t\t\t\t\t: { scaleY: 0 }\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tanimate={\n\t\t\t\t\t\tshouldAnimate\n\t\t\t\t\t\t\t? isHorizontal\n\t\t\t\t\t\t\t\t? { scaleX: 1 }\n\t\t\t\t\t\t\t\t: { scaleY: 1 }\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t{...a11yProps}\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: spread safe HTMLDiv attrs\n\t\t\t\t\t{...(props as any)}\n\t\t\t\t/>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nDividerImpl.displayName = \"Divider\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public export\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive Divider — a thin line that groups content in lists and layouts.\n *\n * Supports four layout variants (full-bleed, inset, middle-inset, subheader),\n * two orientations (horizontal, vertical), and two shape modes (flat, wavy).\n *\n * The wavy shape renders a sinusoidal SVG wave and is only supported with\n * `orientation=\"horizontal\"`.\n *\n * @example\n * ```tsx\n * // Default flat full-bleed horizontal divider\n * <Divider />\n *\n * // Inset after icon list items\n * <Divider variant=\"inset\" insetStart=\"icon\" />\n *\n * // Vertical separator between panes\n * <Divider orientation=\"vertical\" />\n *\n * // Wavy expressive divider\n * <Divider shape=\"wavy\" />\n *\n * // Wavy with custom wave config\n * <Divider shape=\"wavy\" waveConfig={{ amplitude: 5, wavelength: 24 }} />\n *\n * // Decorative (no a11y semantics)\n * <Divider decorative />\n *\n * // No entrance animation\n * <Divider animate={false} />\n *\n * // Middle-inset wavy divider\n * <Divider variant=\"middle-inset\" shape=\"wavy\" />\n * ```\n *\n * @see https://m3.material.io/components/divider/overview\n */\nexport const Divider = React.memo(DividerImpl);\n","import * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\n\n// ─── MD3 Expressive Drawer Animation ─────────────────────────────────────────\n// Slide từ dưới lên, spring physics giống Google Material's \"Emphasized\" easing\nconst MD3_DRAWER_SPRING = {\n\ttype: \"spring\" as const,\n\tstiffness: 350,\n\tdamping: 35,\n\tmass: 0.9,\n};\n\nconst MD3_DRAWER_ANIM = {\n\tinitial: { y: \"100%\", opacity: 0.6 },\n\tanimate: {\n\t\ty: 0,\n\t\topacity: 1,\n\t\ttransition: MD3_DRAWER_SPRING,\n\t},\n\texit: {\n\t\ty: \"100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.22, ease: \"easeIn\" as const },\n\t},\n};\n\nconst MD3_SCRIM_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.18, ease: \"easeIn\" as const } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface DrawerProps {\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tchildren: React.ReactNode;\n}\n\nexport interface DrawerContentProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Content>,\n\t\t\"asChild\"\n\t> {\n\t/** Chiều cao tối đa (vh). Mặc định 90vh */\n\tmaxHeight?: string;\n\t/** Ẩn drag handle */\n\thideHandle?: boolean;\n\t/** Ẩn nút đóng */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\nconst Drawer = ({ open, onOpenChange, children }: DrawerProps) => (\n\t<RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t{children}\n\t</RadixDialog.Root>\n);\nDrawer.displayName = \"Drawer\";\n\nconst DrawerTrigger = RadixDialog.Trigger;\nDrawerTrigger.displayName = \"DrawerTrigger\";\n\nconst DrawerClose = RadixDialog.Close;\n\n// ─── Portal wrapper với AnimatePresence ───────────────────────────────────────\nconst DrawerPortal = ({\n\topen,\n\tchildren,\n}: {\n\topen?: boolean;\n\tchildren: React.ReactNode;\n}) => (\n\t<RadixDialog.Portal forceMount>\n\t\t<AnimatePresence mode=\"wait\">{open && children}</AnimatePresence>\n\t</RadixDialog.Portal>\n);\n\n// ─── Scrim overlay ────────────────────────────────────────────────────────────\nconst DrawerOverlay = 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<motion.div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"fixed inset-0 z-50 bg-black/40\", className)}\n\t\t\t{...MD3_SCRIM_ANIM}\n\t\t/>\n\t</RadixDialog.Overlay>\n));\nDrawerOverlay.displayName = \"DrawerOverlay\";\n\n// ─── Content ─────────────────────────────────────────────────────────────────\nconst DrawerContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDrawerContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\tmaxHeight = \"90vh\",\n\t\t\thideHandle = false,\n\t\t\thideCloseButton = false,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<RadixDialog.Content ref={ref} asChild {...props}>\n\t\t\t<motion.div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// MD3 Bottom Sheet shape: chỉ bo góc trên\n\t\t\t\t\t\"fixed bottom-0 left-0 right-0 z-50\",\n\t\t\t\t\t\"rounded-t-[28px] bg-m3-surface-container-low\",\n\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t// focus-visible ring — a11y\n\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ maxHeight, ...style }}\n\t\t\t\t{...MD3_DRAWER_ANIM}\n\t\t\t>\n\t\t\t\t{/* Drag handle — decorative hint */}\n\t\t\t\t{!hideHandle && (\n\t\t\t\t\t<div\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mx-auto mt-3 h-1 w-9 rounded-full bg-m3-on-surface-variant/40 shrink-0\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Close button */}\n\t\t\t\t{!hideCloseButton && (\n\t\t\t\t\t<RadixDialog.Close\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute right-4 top-3 rounded-full p-2\",\n\t\t\t\t\t\t\t\"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8\",\n\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\t\t\t\t\"transition-colors duration-200\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-label=\"Đóng bảng điều khiển\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close\" size={20} aria-hidden=\"true\" />\n\t\t\t\t\t</RadixDialog.Close>\n\t\t\t\t)}\n\n\t\t\t\t{/* Scrollable content area */}\n\t\t\t\t<div className=\"flex-1 overflow-y-auto overscroll-contain p-6\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</RadixDialog.Content>\n\t),\n);\nDrawerContent.displayName = \"DrawerContent\";\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\nconst DrawerHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-1 mb-4\", className)} {...props} />\n);\nDrawerHeader.displayName = \"DrawerHeader\";\n\nconst DrawerFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-2 mt-4\", className)} {...props} />\n);\nDrawerFooter.displayName = \"DrawerFooter\";\n\nconst DrawerTitle = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Title>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Title\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"text-[22px] leading-7 font-medium text-m3-on-surface\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDrawerTitle.displayName = \"DrawerTitle\";\n\nconst DrawerDescription = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Description>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-sm text-m3-on-surface-variant leading-5\", className)}\n\t\t{...props}\n\t/>\n));\nDrawerDescription.displayName = \"DrawerDescription\";\n\nexport {\n\tDrawer,\n\tDrawerClose,\n\tDrawerContent,\n\tDrawerDescription,\n\tDrawerFooter,\n\tDrawerHeader,\n\tDrawerOverlay,\n\tDrawerPortal,\n\tDrawerTitle,\n\tDrawerTrigger,\n};\n\n// ─── Usage:\n// <Drawer open={open} onOpenChange={setOpen}>\n// <DrawerTrigger asChild><Button>Mở Drawer</Button></DrawerTrigger>\n// <DrawerPortal open={open}>\n// <DrawerOverlay />\n// <DrawerContent maxHeight=\"80vh\">\n// <DrawerHeader>\n// <DrawerTitle>Chi tiết đơn hàng</DrawerTitle>\n// <DrawerDescription>Xem thông tin đơn hàng #1234</DrawerDescription>\n// </DrawerHeader>\n// <p>Nội dung drawer...</p>\n// <DrawerFooter>\n// <Button colorStyle=\"filled\" className=\"w-full\">Xác nhận</Button>\n// </DrawerFooter>\n// </DrawerContent>\n// </DrawerPortal>\n// </Drawer>\n","import * as RadixDropdown from \"@radix-ui/react-dropdown-menu\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\n\n// ─── MD3 Dropdown Animation ───────────────────────────────────────────────────\nconst MD3_MENU_ANIM = {\n\tinitial: { opacity: 0, scale: 0.96, y: -6 },\n\tanimate: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ty: 0,\n\t\ttransition: {\n\t\t\ttype: \"spring\" as const,\n\t\t\tstiffness: 380,\n\t\t\tdamping: 30,\n\t\t\tmass: 0.8,\n\t\t},\n\t},\n\texit: { opacity: 0, scale: 0.97, y: -4, transition: { duration: 0.12 } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport type DropdownMenuProps = React.ComponentPropsWithoutRef<\n\ttypeof RadixDropdown.Root\n>;\nexport type DropdownMenuTriggerProps = React.ComponentPropsWithoutRef<\n\ttypeof RadixDropdown.Trigger\n>;\n\n// ─── Root (re-export) ─────────────────────────────────────────────────────────\nconst DropdownMenu = RadixDropdown.Root;\nDropdownMenu.displayName = \"DropdownMenu\";\n\nconst DropdownMenuTrigger = RadixDropdown.Trigger;\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\nconst DropdownMenuGroup = RadixDropdown.Group;\nconst DropdownMenuPortal = RadixDropdown.Portal;\nconst DropdownMenuSub = RadixDropdown.Sub;\nconst DropdownMenuRadioGroup = RadixDropdown.RadioGroup;\n\n// ─── Content panel ────────────────────────────────────────────────────────────\nconst DropdownMenuContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.Content>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.Content>\n>(({ className, sideOffset = 6, children, ...props }, ref) => (\n\t<RadixDropdown.Portal>\n\t\t<AnimatePresence>\n\t\t\t<RadixDropdown.Content\n\t\t\t\tref={ref}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tasChild\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"z-50 min-w-32 overflow-hidden\",\n\t\t\t\t\t\t\"rounded-xl bg-m3-surface-container p-1\",\n\t\t\t\t\t\t\"shadow-md\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-m3-primary\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...MD3_MENU_ANIM}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.div>\n\t\t\t</RadixDropdown.Content>\n\t\t</AnimatePresence>\n\t</RadixDropdown.Portal>\n));\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n// ─── Sub-menu Content ─────────────────────────────────────────────────────────\nconst DropdownMenuSubContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.SubContent>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.SubContent>\n>(({ className, ...props }, ref) => (\n\t<RadixDropdown.SubContent\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"z-50 min-w-32 overflow-hidden\",\n\t\t\t\"rounded-xl bg-m3-surface-container p-1 shadow-md\",\n\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n\t\t\t\"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n\t\t\t\"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n\t\t\t\"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\n\t\t\t\"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\n// ─── Item ─────────────────────────────────────────────────────────────────────\nconst DropdownMenuItem = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.Item>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.Item> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, ...props }, ref) => (\n\t<RadixDropdown.Item\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t// MD3 State Layer behavior\n\t\t\t\"relative flex cursor-pointer select-none items-center gap-2\",\n\t\t\t\"rounded-lg px-3 py-2 text-sm text-m3-on-surface\",\n\t\t\t\"outline-none transition-colors duration-150\",\n\t\t\t\"hover:bg-m3-on-surface/8\",\n\t\t\t\"focus:bg-m3-on-surface/12\",\n\t\t\t\"data-disabled:pointer-events-none data-disabled:opacity-38\",\n\t\t\t\"focus-visible:ring-0\", // Radix gốc handle ring internally\n\t\t\tinset && \"pl-8\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\n// ─── Checkbox Item ────────────────────────────────────────────────────────────\nconst DropdownMenuCheckboxItem = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.CheckboxItem>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n\t<RadixDropdown.CheckboxItem\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"relative flex cursor-pointer select-none items-center gap-2\",\n\t\t\t\"rounded-lg py-2 pl-8 pr-3 text-sm text-m3-on-surface\",\n\t\t\t\"outline-none transition-colors duration-150\",\n\t\t\t\"hover:bg-m3-on-surface/8 focus:bg-m3-on-surface/12\",\n\t\t\t\"data-disabled:pointer-events-none data-disabled:opacity-38\",\n\t\t\tclassName,\n\t\t)}\n\t\tchecked={checked}\n\t\t{...props}\n\t>\n\t\t<span className=\"absolute left-2 flex h-4 w-4 items-center justify-center\">\n\t\t\t<RadixDropdown.ItemIndicator>\n\t\t\t\t<Icon name=\"check\" size={16} aria-hidden=\"true\" />\n\t\t\t</RadixDropdown.ItemIndicator>\n\t\t</span>\n\t\t{children}\n\t</RadixDropdown.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\";\n\n// ─── Radio Item ───────────────────────────────────────────────────────────────\nconst DropdownMenuRadioItem = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.RadioItem>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.RadioItem>\n>(({ className, children, ...props }, ref) => (\n\t<RadixDropdown.RadioItem\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"relative flex cursor-pointer select-none items-center gap-2\",\n\t\t\t\"rounded-lg py-2 pl-8 pr-3 text-sm text-m3-on-surface\",\n\t\t\t\"outline-none transition-colors duration-150\",\n\t\t\t\"hover:bg-m3-on-surface/8 focus:bg-m3-on-surface/12\",\n\t\t\t\"data-disabled:pointer-events-none data-disabled:opacity-38\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<span className=\"absolute left-2 flex h-4 w-4 items-center justify-center\">\n\t\t\t<RadixDropdown.ItemIndicator>\n\t\t\t\t<Icon name=\"circle\" fill={1} size={8} aria-hidden=\"true\" />\n\t\t\t</RadixDropdown.ItemIndicator>\n\t\t</span>\n\t\t{children}\n\t</RadixDropdown.RadioItem>\n));\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\n\n// ─── Separator ────────────────────────────────────────────────────────────────\nconst DropdownMenuSeparator = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.Separator>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.Separator>\n>(({ className, ...props }, ref) => (\n\t<RadixDropdown.Separator\n\t\tref={ref}\n\t\tclassName={cn(\"my-1 h-px bg-m3-outline-variant\", className)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\n\n// ─── Label ────────────────────────────────────────────────────────────────────\nconst DropdownMenuLabel = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.Label>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.Label> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, ...props }, ref) => (\n\t<RadixDropdown.Label\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"px-3 py-1.5 text-xs font-medium text-m3-on-surface-variant uppercase tracking-wider\",\n\t\t\tinset && \"pl-8\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\n\n// ─── Sub Trigger ──────────────────────────────────────────────────────────────\nconst DropdownMenuSubTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDropdown.SubTrigger>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDropdown.SubTrigger> & {\n\t\tinset?: boolean;\n\t}\n>(({ className, inset, children, ...props }, ref) => (\n\t<RadixDropdown.SubTrigger\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"flex cursor-default select-none items-center gap-2\",\n\t\t\t\"rounded-lg px-3 py-2 text-sm text-m3-on-surface\",\n\t\t\t\"outline-none transition-colors duration-150\",\n\t\t\t\"hover:bg-m3-on-surface/8 focus:bg-m3-on-surface/12\",\n\t\t\t\"data-[state=open]:bg-m3-on-surface/8\",\n\t\t\tinset && \"pl-8\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t{children}\n\t\t<Icon\n\t\t\tname=\"chevron_right\"\n\t\t\tsize={16}\n\t\t\tclassName=\"ml-auto\"\n\t\t\taria-hidden=\"true\"\n\t\t/>\n\t</RadixDropdown.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\n\n// ─── Shortcut ─────────────────────────────────────────────────────────────────\nconst DropdownMenuShortcut = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n\t<span\n\t\tclassName={cn(\n\t\t\t\"ml-auto text-xs tracking-widest text-m3-on-surface-variant\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuPortal,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubContent,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuTrigger,\n};\n","/**\n * @file fab.tsx\n *\n * MD3 Expressive Floating Action Button (FAB).\n *\n * Supports four sizes, an extended variant with animated label reveal,\n * shape morphing, a `lowered` elevation variant, and an optional\n * `FABPosition` container for absolute positioning within a layout.\n *\n * @see https://m3.material.io/components/floating-action-button/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 layout classes for the FAB container.\n * MD3 sizes: SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n * Extended FABs use `w-full` + `px-*` via the caller.\n * @internal\n */\nconst SIZE_STYLES: Record<string, string> = {\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 * MD3 icon sizes: SM=24dp, MD=24dp, LG=32dp, XL=40dp.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\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 * Per-size label typography classes used in the extended variant.\n * @internal\n */\nconst SIZE_TEXT_CLASS: Record<string, string> = {\n\tsm: \"text-sm font-medium\",\n\tmd: \"text-base font-medium\",\n\tlg: \"text-xl font-semibold\",\n\txl: \"text-2xl font-semibold\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n//\n// IMPORTANT: Use exact height/2 values for \"round\" radii to avoid the dead-zone\n// artefact: CSS clips any radius > height/2 identically, so animating from\n// 9999 → small value produces a jump/snap at the threshold.\n// Heights: SM=40dp, MD=56dp, LG=96dp, XL=136dp\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size border-radius tokens for all interaction / selection states.\n *\n * - `default`: idle pill radius (height / 2).\n * - `pressed`: compressed on `whileTap`.\n * - `extended`: radius for the extended (label-visible) state.\n * - `extended_pressed`: compressed extended state on `whileTap`.\n *\n * @internal\n */\nconst MORPH_RADIUS: Record<\n\tstring,\n\t{\n\t\tdefault: number;\n\t\tpressed: number;\n\t\textended: number;\n\t\textended_pressed: number;\n\t}\n> = {\n\tsm: { default: 12, pressed: 8, extended: 12, extended_pressed: 8 },\n\tmd: { default: 16, pressed: 10, extended: 16, extended_pressed: 10 },\n\tlg: { default: 28, pressed: 20, extended: 28, extended_pressed: 20 },\n\txl: { default: 40, pressed: 28, extended: 40, extended_pressed: 28 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Roles\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role Tailwind class map for each FAB color variant.\n * @internal\n */\nconst COLOR_CLASSES: Record<\n\tstring,\n\t{ bg: string; text: string; shadow: string }\n> = {\n\tprimary: {\n\t\tbg: \"bg-m3-primary-container\",\n\t\ttext: \"text-m3-on-primary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\tsecondary: {\n\t\tbg: \"bg-m3-secondary-container\",\n\t\ttext: \"text-m3-on-secondary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\ttertiary: {\n\t\tbg: \"bg-m3-tertiary-container\",\n\t\ttext: \"text-m3-on-tertiary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\tsurface: {\n\t\tbg: \"bg-m3-surface-container-high\",\n\t\ttext: \"text-m3-primary\",\n\t\tshadow: \"shadow-md\",\n\t},\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Tham số Props dùng cho component thao tác nổi `FAB`.\n *\n * @remarks\n * - Đảm bảo rằng đối với loại FAB chỉ show ra mỗi con Icon mà không có nhãn hiển thị (icon-only), bắt buộc phải có thuộc tính `aria-label` nhằm phục vụ (accessibility).\n * - Ở hình thể mở rộng (khi `extended={true}`), phần nội dung truyền vào `children` chính là chuỗi Text được thể hiện cùng nút, và nó sẽ khiến nút button có label mặc định nên bạn có thể chém bớt tham số `aria-label`.\n * - Thuộc tính cờ `lowered` (chìm) giúp giáng cấp hiệu ứng tạo bóng Shadow của thẻ, rải mảng cái shadow theo phong thái MD3 \"lowered\" FAB;\n * sử dụng khi nút FAB này vốn bị bọc bên trong bề mặt chìm đè lên component gì khác mà vốn tụi nó đã nhún ở mực sâu (Ví dụ Bottom App Bar) để thiết lập Hierarchy hài hoà.\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport interface FABProps extends MotionButtonProps {\n\t/**\n\t * Icon đại diện render — thông thường là truyền thẻ component Icon.\n\t * Sẽ được tráo đổi thành Spinner tự động quay khi giá trị `loading={true}`.\n\t */\n\ticon: React.ReactNode;\n\t/**\n\t * Kích thước hiển thị FAB. Tuân chuẩn.\n\t * - `sm`: Small (40dp) — Được khuyên dùng cho các không gian kín/trong lòng Content.\n\t * - `md`: Regular (56dp) — Action thứ yếu hoặc tiêu điểm màn hình. (Phần đông người dùng xài).\n\t * - `lg`: Large (96dp) — Trọng tâm thao tác quan trọng lớn nhát.\n\t * - `xl`: Extra-large (136dp) — Gây tiếng vang, dạng Spotlight cực bùng nổ của app.\n\t * @default \"md\"\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container vai trò hệ thống tông màu MD3 dùng phết nền.\n\t * @default \"primary\"\n\t */\n\tcolorStyle?: \"primary\" | \"secondary\" | \"tertiary\" | \"surface\";\n\t/**\n\t * Kích hoạt khi giá trị được đổi là `true`, sẽ diễn tả Animation bung chữ kèm theo độ dãn hình dài cho cái FAB.\n\t * Chiều rộng tự cơi nới để thích ứng chuỗi `children`.\n\t * @default false\n\t */\n\textended?: boolean;\n\t/**\n\t * Nơi đón lấy chữ được render cùng khi `extended={true}` bật lên.\n\t * Khuyến nghị là Text string thuần.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Nhấn `true`, thì rút lại shadow đi một cấp xuống độ nổi nông cạn.\n\t * Mảng bám ở Bottom bar hay Top bar Surface để ránh rườm rà.\n\t * @default false\n\t */\n\tlowered?: boolean;\n\t/**\n\t * Nhấp chuột sang `true`, đổi Icon thành cối xay Spinner chờ kết quả. Đồng loạt chặn click tương tác.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Có 2 chuẩn hình của Loading chờ.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/**\n\t * Hiện thẻ FAB lên layout không (Kiểm soát bằng motion scale Entrance/Exit).\n\t * @default true\n\t */\n\tvisible?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABPosition — Layout Wrapper\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Interface cho component bọc thẻ `FABPosition` — Gắn lớp absolute position nhét cục FAB vào một góc cố định của góc nào đó tại trình duyệt/bề mặt render.\n *\n * @see {@link FABPosition}\n */\nexport interface FABPositionProps {\n\t/**\n\t * Góc để niêm chặt nút FAB.\n\t * @default \"bottom-right\"\n\t */\n\tposition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\t/** Kẹp một nùi element. Mong chờ thả Node `<FAB>` vào đây.*/\n\tchildren: React.ReactNode;\n\t/** CSS Class hỗ trợ chỉnh override */\n\tclassName?: string;\n}\n\nconst POSITION_CLASS: Record<string, string> = {\n\t\"bottom-right\": \"bottom-4 right-4 sm:bottom-6 sm:right-6\",\n\t\"bottom-left\": \"bottom-4 left-4 sm:bottom-6 sm:left-6\",\n\t\"top-right\": \"top-4 right-4 sm:top-6 sm:right-6\",\n\t\"top-left\": \"top-4 left-4 sm:top-6 sm:left-6\",\n};\n\n/**\n * Element bao bọc thẻ định vị Absolute cho component `<FAB>`.\n *\n * Component dùng để cắm phao Neo cái FAB vào sát ở góc của screen kèm theo một cái offset space theo responsive an toàn mà lại trơn chu nhạy nhẽo.\n * Nhưng có quy tắc gốc đó là phần tử bao bọc cha mẹ của nó PHẢI có thẻ tag css `position: relative` (hoặc ở cấp tổ tiêm của trang nào đó phải đẻ gốc rễ ra posisition).\n *\n * @example\n * ```tsx\n * <div className=\"relative min-h-screen\">\n * // Cái nút sẽ xà xuống dưới cùng bên lề Trái\n * <FABPosition position=\"bottom-left\">\n * <FAB icon={<Icon name=\"edit\" />} aria-label=\"Compose New Mail\" />\n * </FABPosition>\n * </div>\n * ```\n *\n * @see {@link FAB}\n * @see https://m3.material.io/components/floating-action-button/guidelines\n */\nexport function FABPosition({\n\tposition = \"bottom-right\",\n\tchildren,\n\tclassName,\n}: FABPositionProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute z-10\",\n\t\t\t\tPOSITION_CLASS[position] ?? POSITION_CLASS[\"bottom-right\"],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FAB Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst FABComponent = React.forwardRef<HTMLButtonElement, FABProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\ticon,\n\t\t\tsize = \"md\",\n\t\t\tcolorStyle = \"primary\",\n\t\t\textended = false,\n\t\t\tchildren,\n\t\t\tlowered = false,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\tvisible = true,\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 colors = COLOR_CLASSES[colorStyle] ?? COLOR_CLASSES.primary;\n\t\tconst radiusConfig = MORPH_RADIUS[size] ?? MORPH_RADIUS.md;\n\n\t\tconst animateRadius = extended\n\t\t\t? radiusConfig.extended\n\t\t\t: radiusConfig.default;\n\t\tconst pressedRadius = extended\n\t\t\t? radiusConfig.extended_pressed\n\t\t\t: radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.md;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst iconPx = sizeIcon.px;\n\n\t\t// xs/sm share the SM token; only MD FAB (40dp) needs the touch target\n\t\tconst needsTouchTarget = 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\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<AnimatePresence>\n\t\t\t\t\t{visible && (\n\t\t\t\t\t\t<m.button\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tariaLabel ||\n\t\t\t\t\t\t\t\t(typeof children === \"string\" ? children : undefined)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t\t\t// ── Entrance / Exit (FAB visibility) ────────────────\n\t\t\t\t\t\t\tinitial={{ scale: 0.5, opacity: 0, borderRadius: animateRadius }}\n\t\t\t\t\t\t\tanimate={{ scale: 1, opacity: 1, borderRadius: animateRadius }}\n\t\t\t\t\t\t\texit={{ scale: 0.5, opacity: 0 }}\n\t\t\t\t\t\t\t// ── Shape Morphing (extended toggle) ────────────────\n\t\t\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tborderRadius: SPRING_TRANSITION_FAST,\n\t\t\t\t\t\t\t\tscale: SPRING_TRANSITION,\n\t\t\t\t\t\t\t\topacity: { duration: 0.25, ease: \"easeOut\" },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\t\t\t\t\"transition-[box-shadow,opacity,filter] duration-200\",\n\t\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\t\t\t\t\t\"disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none\",\n\t\t\t\t\t\t\t\tcolors.bg,\n\t\t\t\t\t\t\t\tcolors.text,\n\t\t\t\t\t\t\t\tlowered ? \"shadow-sm\" : colors.shadow,\n\t\t\t\t\t\t\t\tSIZE_STYLES[size] ?? \"h-14 w-14\",\n\t\t\t\t\t\t\t\textended && \"w-auto px-6\",\n\t\t\t\t\t\t\t\tSIZE_TEXT_CLASS[size],\n\t\t\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{...restProps}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t\t\t{/* Icon / Loading swap */}\n\t\t\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\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\t\t\ticonClass,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\t\t\tsize={iconPx}\n\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={iconPx}\n\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full\",\n\t\t\t\t\t\t\t\t\t\t\ticonClass,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t{/* Extended label — animates in/out with the `extended` prop */}\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{extended && children && (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"label\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ width: \"auto\", opacity: 1 }}\n\t\t\t\t\t\t\t\t\t\texit={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\tclassName=\"overflow-hidden whitespace-nowrap ml-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t</m.button>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nFABComponent.displayName = \"FAB\";\n\n/**\n * Action nổi chính theo phong cách MD3 Expressive Floating Action Button (FAB).\n *\n * Phơi nhiễm các action tạo nhịp điệu kích hoạt cho người sử dụng với đủ bộ trang hoàn trọn kích thước Size (SM->XL),\n * mang nhiều màu sắc Color role khác biệt, cung cấp một sức nén cho Label để kéo toẹt cái ống dài ra (gọi là Dạng Mở Rộng - Extended) tạo nên hành động sinh động,\n * Trạng thái load/nhấp hiện xuất cùng animation thu scale thoát cảnh bắt mắt đầy nghệ thuật.\n *\n * @remarks\n * - Chỉ định bắt buộc `aria-label` cho những mẫu icon bị đơn côi trơ trọi (icon-only FABs).\n * - Trường hợp xài mode Mở Rộng qua việc truyền hàm `extended={true}`, nút FAB này tự ngộ nhận thân thế, lấy `children` dùng làm Aria label luôn hễ như `children` đó đang chứa text string.\n * Khi ấy bạn tha hồ cắt bỏ thuộc tính `aria-label` ra.\n * - Lúc cho biến mất (`visible={false}`), bộ nút tung chiêu lùi về sau làm quả rút bóng thoát Scale-out qua effect spring uyển chuyển.\n * - Sài kèm `FABPosition` bao đùm nó lại nếu bạn muốn xích nó cố định ngấm chân sâu góc màn hình hiển thị.\n *\n * @example\n * ```tsx\n * // FAB cơ bản, nhỏ xinh, chỉ hiện icon.\n * <FAB icon={<Icon name=\"search\" />} aria-label=\"Nhấn tìm kiếm\" size=\"sm\" />\n *\n * // Dịch sang dòng Extended có dòng caption chữ dài thòn\n * const [isOpen, setOpen] = React.useState(false);\n * <FAB\n * icon={<Icon name=\"edit\" />}\n * extended={isOpen}\n * onClick={() => setOpen(!isOpen)}\n * >\n * Viết tâm thư\n * </FAB>\n *\n * // FAB to lớn nhất dùng trạng thái chờ load Submit lên Server\n * <FAB\n * icon={<Icon name=\"upload\" />}\n * size=\"lg\"\n * loading={isUploading}\n * colorStyle=\"secondary\"\n * aria-label=\"Upload Files lên mây xanh\"\n * />\n *\n * // Cố định dưới chân tay phải\n * <FABPosition position=\"bottom-right\">\n * <FAB icon={<Icon name=\"add\" />} aria-label=\"Dấu Cộng sinh nảy\" />\n * </FABPosition>\n * ```\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport const FAB = React.memo(FABComponent);\n","/**\n * @file fab-menu.tsx\n *\n * Component FAB Menu theo phong cách MD3 Expressive.\n *\n * Cung cấp một Floating Action Button (FAB) dạng toggle để mở một danh sách các hành động có hiệu ứng stagger (xếp tầng).\n * Tuân thủ mô hình FloatingActionButtonMenu của MD3 với sự hỗ trợ tiếp cận (accessibility) đầy đủ\n * (điều hướng bàn phím, quản lý focus, các vai trò ARIA).\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport { SPRING_TRANSITION, SPRING_TRANSITION_FAST } from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens — MD3 FAB Menu Spec\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SPRING_NORMAL = { stiffness: 700, damping: 40 } as const;\nconst SPRING_REDUCED = { stiffness: 10000, damping: 100 } as const;\nconst FOCUS_DELAY_MS = 50;\n\nconst TOGGLE_FAB_COLORS: Record<\n\tstring,\n\t{\n\t\tcontainerBg: string;\n\t\tcontainerText: string;\n\t\tcheckedBg: string;\n\t\tcheckedText: string;\n\t}\n> = {\n\tprimary: {\n\t\tcontainerBg: \"bg-m3-primary-container\",\n\t\tcontainerText: \"text-m3-on-primary-container\",\n\t\tcheckedBg: \"bg-m3-primary\",\n\t\tcheckedText: \"text-m3-on-primary\",\n\t},\n\tsecondary: {\n\t\tcontainerBg: \"bg-m3-secondary-container\",\n\t\tcontainerText: \"text-m3-on-secondary-container\",\n\t\tcheckedBg: \"bg-m3-secondary\",\n\t\tcheckedText: \"text-m3-on-secondary\",\n\t},\n\ttertiary: {\n\t\tcontainerBg: \"bg-m3-tertiary-container\",\n\t\tcontainerText: \"text-m3-on-tertiary-container\",\n\t\tcheckedBg: \"bg-m3-tertiary\",\n\t\tcheckedText: \"text-m3-on-tertiary\",\n\t},\n};\n\n/**\n * Size tokens for ToggleFAB.\n *\n * MD3 Kotlin reference:\n * - Baseline: 56dp, cornerRadius 16dp → 28dp (fully round)\n * - Medium: ~80dp (FabMediumTokens.ContainerHeight), cornerRadius 20dp → 40dp\n * - Large: 96dp, cornerRadius 28dp → 48dp\n * @internal\n */\nconst TOGGLE_FAB_SIZES: Record<\n\tstring,\n\t{\n\t\tsizeClass: string;\n\t\tinitialRadius: number;\n\t\tfinalRadius: number;\n\t}\n> = {\n\tbaseline: { sizeClass: \"h-14 w-14\", initialRadius: 16, finalRadius: 28 },\n\tmedium: { sizeClass: \"h-20 w-20\", initialRadius: 20, finalRadius: 40 },\n\tlarge: { sizeClass: \"h-24 w-24\", initialRadius: 28, finalRadius: 48 },\n};\n\nconst MENU_ITEM_STYLES = {\n\tpadding: \"ps-4 pe-6\",\n\tgap: \"gap-3\",\n\tsize: \"h-14 min-w-14\",\n\tcornerRadius: 999,\n} as const;\n\nconst MENU_ITEM_COLORS: Record<string, { bg: string; text: string }> = {\n\tprimary: {\n\t\tbg: \"bg-m3-primary-container\",\n\t\ttext: \"text-m3-on-primary-container\",\n\t},\n\tsecondary: {\n\t\tbg: \"bg-m3-secondary-container\",\n\t\ttext: \"text-m3-on-secondary-container\",\n\t},\n\ttertiary: {\n\t\tbg: \"bg-m3-tertiary-container\",\n\t\ttext: \"text-m3-on-tertiary-container\",\n\t},\n};\n\nconst ALIGNMENT_CONTAINER_CLASSES: Record<string, string> = {\n\tend: \"items-end bottom-4 right-4 sm:bottom-6 sm:right-6\",\n\tstart: \"items-start bottom-4 left-4 sm:bottom-6 sm:left-6\",\n\tcenter: \"items-center bottom-4 left-1/2 -translate-x-1/2 sm:bottom-6\",\n};\n\nconst ALIGNMENT_ITEMS_CLASSES: Record<string, string> = {\n\tend: \"items-end\",\n\tstart: \"items-start\",\n\tcenter: \"items-center\",\n};\n\nconst ALIGNMENT_TRANSFORM_ORIGIN: Record<string, string> = {\n\tend: \"right\",\n\tstart: \"left\",\n\tcenter: \"bottom\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Định dạng dữ liệu cho từng hành động (item) trong biểu mẫu menu của FAB.\n *\n * Nếu bỏ qua thuộc tính `label`, item sẽ render dạng ô vuông chỉ có icon.\n */\nexport interface FABMenuItemData {\n\t/** Một ID duy nhất để dùng cho key react và quản lý focus. */\n\tid: string;\n\t/** Label hiển thị cạnh icon (tuỳ chọn). Không thêm thuộc tính này nếu muốn hiển thị chỉ có icon (icon-only). */\n\tlabel?: string;\n\t/** Node của Icon — thường là một component SVG Icon duy nhất. */\n\ticon: React.ReactNode;\n\t/** Gọi hàm ngay lập tức khi item được kích hoạt (click hoặc nhấn Enter/Phím cách). */\n\tonClick: () => void;\n\t/**\n\t * Khi `true`, vô hiệu hoá item về mặt hình thức lẫn tương tác rẽ nhánh.\n\t * Vẫn dùng `aria-disabled` thay vì HTML `disabled` nhằm giữ nó lấy được focus phục vụ cho accessibility.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/** Thêm CSS classes bổ sung dùng cho wrapper chính của item. */\n\tclassName?: string;\n}\n\n/**\n * Các props điều khiển Component chính `FABMenu`.\n *\n * @remarks\n * FABMenu quản lý vòng đời trạng thái mở/đóng menu (open/close), quản lý focus, điều khiển phím,\n * và điều hướng hiệu ứng chuyển động. Trạng thái `expanded` được truyền từ ngoài (controlled state),\n * do đó bạn có thể quản lý qua react state, hoặc dùng router hay business logic khác.\n */\nexport interface FABMenuProps {\n\t/** FAB Menu có đang mở (mở rộng)/hiển thị hay không. */\n\texpanded: boolean;\n\t/** Hàm handler kích hoạt khi Toggle FAB được người dùng tương tác, hoặc khi dismiss backdrop. */\n\tonToggle: (expanded: boolean) => void;\n\t/** Danh sách các action items (Spec MD3 đề nghị 2-6 item là hoàn hảo). */\n\titems: FABMenuItemData[];\n\t/**\n\t * Vai trò màu (color role container) MD3 cho cái nút FAB lẫn các menu items.\n\t * @default \"primary\"\n\t */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/**\n\t * Kích cỡ khởi tạo cho cái ToggleFAB (FAB biến hình thành cục đóng dấu X khi nó expanded).\n\t * @default \"baseline\"\n\t */\n\tfabSize?: \"baseline\" | \"medium\" | \"large\";\n\t/**\n\t * Căn lề của danh sách menu items tương quan với cái Toggle FAB.\n\t * - `\"end\"`: Các items dồn hết theo lề phía tay phải (trailing edge, default cực hữu hiệu đối với RTL design).\n\t * - `\"start\"`: Các items dồn hết dọc theo lề trái.\n\t * - `\"center\"`: Các item sẽ được căn ra giữa chiều dọc, căn giữa tâm khối với cái FAB.\n\t * @default \"end\"\n\t */\n\talignment?: \"start\" | \"end\" | \"center\";\n\t/** Thuộc tính cho CSS component root để đè. */\n\tclassName?: string;\n\t/**\n\t * Nếu `true`, khi menu đang hiện ra, click chuột ra phía sau (màn xám mờ backdrop) để đóng menu.\n\t * @default true\n\t */\n\tcloseOnBackdropClick?: boolean;\n\t/**\n\t * Nếu `true`, focus sẽ tự động chạy xuống item CUỐI (sát bên trên cái nút FAB) khi menu vừa loé mờ ra.\n\t * Nếu `false`, focus sẽ bay lên item ĐẦU TIÊN của danh sách (cao nhất trên màn hình).\n\t * @default true\n\t */\n\tfocusLast?: boolean;\n\t/** Bắt buộc truyền `aria-label` cho ToggleFAB để đáp ứng Accessibility. */\n\t\"aria-label\"?: string;\n}\n\n/**\n * Props thuộc component `ToggleFAB` đứng độc lập.\n */\nexport interface ToggleFABProps {\n\t/** Nút có đang trong trạng thái được kích hoạt check (expanded). */\n\texpanded: boolean;\n\t/** Gọi khi xảy ra sự kiện Toggle nút. */\n\tonToggle: (expanded: boolean) => void;\n\t/**\n\t * Function sinh Icon - nhận về tiến độ `progress` trong khoảng `0` -> `1` (Từ Chưa Expanded -> Đã Expanded)\n\t * Dùng cho các hiệu ứng morphing Icon khi animtion render (VD: Từ Cộng thành Đóng).\n\t *\n\t * @example\n\t * ```tsx\n\t * icon={(progress) => progress > 0.5 ? <Icon name=\"close\" /> : <Icon name=\"add\" />}\n\t * ```\n\t */\n\ticon: (progress: number) => React.ReactNode;\n\t/** Vai trò màu container chuẩn MD3. @default \"primary\" */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/** Kích thước của cục FAB ban đầu (Sau khi nhấn sẽ thu tròn). @default \"baseline\" */\n\tfabSize?: \"baseline\" | \"medium\" | \"large\";\n\t/** CSS Class linh tinh bổ sung thêm. */\n\tclassName?: string;\n\t/** Thuộc tính đọc thẻ accessibility. Bắt buộc có. */\n\t\"aria-label\"?: string;\n\t/** Kiểm soát giá trị của ID để link với menu qua aria-controls. */\n\t\"aria-controls\"?: string;\n\t/** Trỏ id component. */\n\tid?: string;\n}\n\n/**\n * Props thuộc component một món item đơn lẻ `FABMenuItem`.\n */\nexport interface FABMenuItemProps {\n\t/** Node của icon hiện. */\n\ticon: React.ReactNode;\n\t/** Tên nhãn mô tả kế bên icon cho item này. Hoặc ẩn nó đi nếu không mong đợi. */\n\tlabel?: string;\n\t/** Hàm bắn ra khi item được kích. */\n\tonClick: () => void;\n\t/** Vô hiệu hóa hành vi tương tác item mà vẫn cho phép bàn phím tab bấm dính lấy focus. @default false */\n\tdisabled?: boolean;\n\t/** Container tông màu. @default \"primary\" */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/** Custom CSS className. */\n\tclassName?: string;\n\t/** Số index liệt kê trong mảng dùng tính render delay (Dành cho animation cấu trúc `custom`). */\n\tindex?: number;\n\t/** Tổng danh sách items có mảng. */\n\ttotalItems?: number;\n\t/** Giá trị logic `tabIndex` dùng điều khiển thao tác phím Tab thủ công. */\n\ttabIndex?: number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Animation Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ITEM_SPRING = { type: \"spring\" as const, stiffness: 700, damping: 25 };\n\nconst MENU_CONTAINER_VARIANTS = {\n\topen: { transition: { staggerChildren: 0.033, staggerDirection: 1 } },\n\tclosed: { transition: { staggerChildren: 0.02, staggerDirection: -1 } },\n} as const;\n\nconst MENU_ITEM_VARIANTS = {\n\topen: { scaleX: 1, opacity: 1, transition: ITEM_SPRING },\n\tclosed: { scaleX: 0, opacity: 0, transition: ITEM_SPRING },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Icon Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction AddIcon() {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t>\n\t\t\t<title>Add</title>\n\t\t\t<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n\t\t</svg>\n\t);\n}\n\nfunction CloseIcon() {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t>\n\t\t\t<title>Close</title>\n\t\t\t<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n\t\t</svg>\n\t);\n}\n\nfunction defaultFabIcon(progress: number) {\n\treturn progress > 0.5 ? <CloseIcon /> : <AddIcon />;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ToggleFAB Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ToggleFABComponent = React.forwardRef<HTMLButtonElement, ToggleFABProps>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\tonToggle,\n\t\t\ticon,\n\t\t\tcolorVariant = \"primary\",\n\t\t\tfabSize = \"baseline\",\n\t\t\tclassName,\n\t\t\tid,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-controls\": ariaControls,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst prefersReduced = useReducedMotion();\n\t\tconst colors = TOGGLE_FAB_COLORS[colorVariant] ?? TOGGLE_FAB_COLORS.primary;\n\t\tconst sizeTokens = TOGGLE_FAB_SIZES[fabSize] ?? TOGGLE_FAB_SIZES.baseline;\n\n\t\tconst springConfig = prefersReduced ? SPRING_REDUCED : SPRING_NORMAL;\n\t\tconst checkedProgress = useSpring(expanded ? 1 : 0, springConfig);\n\n\t\tReact.useEffect(() => {\n\t\t\tcheckedProgress.set(expanded ? 1 : 0);\n\t\t}, [expanded, checkedProgress]);\n\n\t\tconst borderRadius = useTransform(\n\t\t\tcheckedProgress,\n\t\t\t[0, 1],\n\t\t\t[`${sizeTokens.initialRadius}px`, `${sizeTokens.finalRadius}px`],\n\t\t);\n\n\t\tconst [iconProgress, setIconProgress] = React.useState(expanded ? 1 : 0);\n\n\t\tReact.useEffect(() => {\n\t\t\treturn checkedProgress.on(\"change\", setIconProgress);\n\t\t}, [checkedProgress]);\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState();\n\n\t\tconst handleClick = React.useCallback(() => {\n\t\t\tonToggle(!expanded);\n\t\t}, [expanded, onToggle]);\n\n\t\treturn (\n\t\t\t<m.button\n\t\t\t\tref={ref}\n\t\t\t\tid={id}\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={expanded}\n\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\taria-label={ariaLabel ?? (expanded ? \"Close menu\" : \"Open menu\")}\n\t\t\t\taria-controls={ariaControls}\n\t\t\t\tdata-expanded={expanded ? \"true\" : \"false\"}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\tstyle={{ borderRadius }}\n\t\t\t\tanimate={{\n\t\t\t\t\tboxShadow: expanded\n\t\t\t\t\t\t? \"0 4px 8px 3px rgba(0,0,0,0.15), 0 1px 3px rgba(0,0,0,0.3)\"\n\t\t\t\t\t\t: \"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)\",\n\t\t\t\t}}\n\t\t\t\twhileTap={{ scale: 0.95, transition: SPRING_TRANSITION_FAST }}\n\t\t\t\ttransition={{ boxShadow: SPRING_TRANSITION }}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\t\"transition-colors duration-200\",\n\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\t\tsizeTokens.sizeClass,\n\t\t\t\t\texpanded ? colors.checkedBg : colors.containerBg,\n\t\t\t\t\texpanded ? colors.checkedText : colors.containerText,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TouchTarget />\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"relative z-10 flex items-center justify-center size-6 pointer-events-none\"\n\t\t\t\t>\n\t\t\t\t\t{icon(iconProgress)}\n\t\t\t\t</span>\n\t\t\t</m.button>\n\t\t);\n\t},\n);\n\nToggleFABComponent.displayName = \"ToggleFAB\";\n\n/**\n * Nút Toggle FAB (Biến hình) có thể được dùng độc lập đứng một mình (standalone) hoặc kết nối để kích hoạt mở cả nùi Menu ở dưới con `FABMenu`.\n *\n * Sức ép hiệu ứng kích thước khung nền sẽ chuyển từ vuôn/vát cạnh sang hình tròn hẵn (square → circle), chuyển biến cả màu sắc\n * khi mà cờ `expanded` chuyển tiếp từ false sang → true.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n * <ToggleFAB\n * expanded={open}\n * onToggle={setOpen}\n * colorVariant=\"primary\"\n * aria-label=\"Toggle actions\"\n * icon={(progress) => progress > 0.5 ? <Icon name=\"close\" /> : <Icon name=\"add\" />}\n * />\n * ```\n */\nexport const ToggleFAB = React.memo(ToggleFABComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABMenuItem Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Một item thực hiện một loại hành động duy nhất trong `FABMenu`.\n *\n * Render hình dạng viên thuốc bao quanh icon cùng với label diễn giải.\n * Khi `label` bỏ trống, nó sẽ render thành một cục thẻ gạch ốp màu vuông vức chứa chữ mỗi cái icon.\n * Component chứa gợn sóng MD3 Ripple cùng 48dp chuẩn vùng target đụng diện chuẩn WCAG 2.5.5 cho cảm ứng.\n *\n * @remarks\n * Những thành phần khi bị tắt (vô hiệu tương tác) thì chỉ được dùng role `aria-disabled=\"true\"` ở lớp div bề mặt thay vì lấy\n * thuộc tính gốc `disabled` của HTML. Nhờ đó, item tuy xám mờ không bấm được phím chuột vẫn sẽ có khả năng focus qua vòng đời tab phím bàn phím\n * (quy chuẩn chặt chẽ của Material Design 3).\n */\nexport function FABMenuItem({\n\ticon,\n\tlabel,\n\tonClick,\n\tdisabled = false,\n\tcolorVariant = \"primary\",\n\tclassName,\n\ttabIndex = 0,\n}: FABMenuItemProps) {\n\tconst colors = MENU_ITEM_COLORS[colorVariant] ?? MENU_ITEM_COLORS.primary;\n\n\tconst { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n\n\tconst handleClick = React.useCallback(\n\t\t(e: React.MouseEvent<HTMLDivElement>) => {\n\t\t\tif (disabled) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClick();\n\t\t},\n\t\t[disabled, onClick],\n\t);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonClick();\n\t\t\t}\n\t\t},\n\t\t[disabled, onClick],\n\t);\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"menuitem\"\n\t\t\ttabIndex={tabIndex}\n\t\t\taria-disabled={disabled ? \"true\" : undefined}\n\t\t\tdata-disabled={disabled ? \"true\" : undefined}\n\t\t\tonClick={handleClick}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tvariants={MENU_ITEM_VARIANTS}\n\t\t\tstyle={{\n\t\t\t\ttransformOrigin: \"right\",\n\t\t\t\tborderRadius: `${MENU_ITEM_STYLES.cornerRadius}px`,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative inline-flex flex-row items-center\",\n\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\"whitespace-nowrap\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-1\",\n\t\t\t\tMENU_ITEM_STYLES.size,\n\t\t\t\tMENU_ITEM_STYLES.gap,\n\t\t\t\tlabel ? MENU_ITEM_STYLES.padding : \"px-4\",\n\t\t\t\t!label && \"justify-center\",\n\t\t\t\tcolors.bg,\n\t\t\t\tcolors.text,\n\t\t\t\tdisabled && \"opacity-[0.38] pointer-events-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<TouchTarget />\n\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName=\"relative z-10 flex items-center justify-center size-6 shrink-0 [&>svg]:w-full [&>svg]:h-full pointer-events-none\"\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t{label && (\n\t\t\t\t<span className=\"relative z-10 text-base font-medium leading-none pointer-events-none\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</m.div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABMenu Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive FAB Menu.\n *\n * Bộ mở rộng Floating Action Button. Khi tương tác bật vào toggle-button (FAB con lai), sẽ trút ra mớ tác vụ menu ở xếp dọc (hoặc lan ra) từ trên đè ngược xuống trên nó.\n *\n * Accessibility thực thi chuẩn MD3 toàn phần:\n * - thẻ `role=\"menu\"` trang bị cho thẻ hộp div làm luống container\n * - trang bị thẻ `role=\"menuitem\"` trên mảng items thành phần con\n * - Lifecycle Focus cho trải nghiệm hoàn mỹ: Mở phím bật -> Focus thẳng lên item cao/thấp đầu/cuối cùng menu; Đóng tắt menu -> Focus trả về ngược lại ToggleFAB\n * - Tính năng Bàn Phím: Lách Escape nhấn tắt nhắm, Nhấn phím hướng lên-xuống(ArrowUp/Down) để di chuyển, Móc Tab(hoặc là Shift+Tab) nhảy lăng quăng qua các item.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * const items = [\n * { id: 'share', icon: <Icon name=\"share\" />, label: 'Chia sẻ', onClick: () => console.log('Share') },\n * { id: 'edit', icon: <Icon name=\"edit\" />, label: 'Chỉnh sửa', onClick: () => console.log('Edit') },\n * { id: 'delete', icon: <Icon name=\"delete\" />, label: 'Xóa bớt', disabled: true, onClick: () => {} }\n * ];\n *\n * <FABMenu\n * expanded={open}\n * onToggle={setOpen}\n * aria-label=\"Các công cụ thao tác nhanh\"\n * alignment=\"center\"\n * colorVariant=\"tertiary\"\n * items={items}\n * />\n * ```\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport function FABMenu({\n\texpanded,\n\tonToggle,\n\titems,\n\tcolorVariant = \"primary\",\n\tfabSize = \"baseline\",\n\talignment = \"end\",\n\tclassName,\n\tcloseOnBackdropClick = true,\n\tfocusLast = true,\n\t\"aria-label\": ariaLabel,\n}: FABMenuProps) {\n\tconst fabId = React.useId();\n\tconst menuId = React.useId();\n\tconst toggleRef = React.useRef<HTMLButtonElement>(null);\n\tconst itemRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n\tconst [focusedIndex, setFocusedIndex] = React.useState<number>(-1);\n\n\tconst reversedItems = React.useMemo(() => [...items].reverse(), [items]);\n\n\tconst focusItem = React.useCallback((index: number) => {\n\t\tconst clampedIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(index, itemRefs.current.length - 1),\n\t\t);\n\t\tsetFocusedIndex(clampedIndex);\n\t\titemRefs.current[clampedIndex]?.focus();\n\t}, []);\n\n\t// Track whether menu was previously open so we only return focus\n\t// to the toggle button after a user-initiated close, not on initial mount.\n\tconst wasExpandedRef = React.useRef(false);\n\n\tReact.useEffect(() => {\n\t\tif (expanded) {\n\t\t\twasExpandedRef.current = true;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tfocusItem(focusLast ? items.length - 1 : 0);\n\t\t\t}, FOCUS_DELAY_MS);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\n\t\tif (wasExpandedRef.current) {\n\t\t\ttoggleRef.current?.focus();\n\t\t}\n\t\twasExpandedRef.current = false;\n\t\tsetFocusedIndex(-1);\n\t}, [expanded, focusLast, items.length, focusItem]);\n\n\tconst handleMenuKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (!expanded) return;\n\n\t\t\tconst lastIndex = items.length - 1;\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonToggle(false);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfocusItem(focusedIndex <= 0 ? lastIndex : focusedIndex - 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfocusItem(focusedIndex >= lastIndex ? 0 : focusedIndex + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"Tab\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tfocusItem(focusedIndex <= 0 ? lastIndex : focusedIndex - 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfocusItem(focusedIndex >= lastIndex ? 0 : focusedIndex + 1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[expanded, focusedIndex, items.length, focusItem, onToggle],\n\t);\n\n\treturn (\n\t\t<LazyMotion features={domMax} strict>\n\t\t\t{expanded && closeOnBackdropClick && (\n\t\t\t\t<div\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"fixed inset-0 z-40\"\n\t\t\t\t\tonClick={() => onToggle(false)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: FAB menu container needs div, not fieldset — this is not a form group */}\n\t\t\t<div\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label={ariaLabel ?? \"Actions menu\"}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed z-50 flex flex-col gap-2\",\n\t\t\t\t\tALIGNMENT_CONTAINER_CLASSES[alignment],\n\t\t\t\t\t\"*:shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonKeyDown={handleMenuKeyDown}\n\t\t\t>\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{expanded && (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid={menuId}\n\t\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\t\taria-labelledby={fabId}\n\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\tvariants={MENU_CONTAINER_VARIANTS}\n\t\t\t\t\t\t\tinitial=\"closed\"\n\t\t\t\t\t\t\tanimate=\"open\"\n\t\t\t\t\t\t\texit=\"closed\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-col-reverse gap-2\",\n\t\t\t\t\t\t\t\tALIGNMENT_ITEMS_CLASSES[alignment],\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{reversedItems.map((item, reversedIndex) => {\n\t\t\t\t\t\t\t\tconst originalIndex = items.length - 1 - reversedIndex;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\t\tvariants={MENU_ITEM_VARIANTS}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\t\tALIGNMENT_TRANSFORM_ORIGIN[alignment] ?? \"right\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\titemRefs.current[originalIndex] = el;\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<FABMenuItem\n\t\t\t\t\t\t\t\t\t\t\ticon={item.icon}\n\t\t\t\t\t\t\t\t\t\t\tlabel={item.label}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!item.disabled) {\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.onClick();\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggle(false);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\t\t\t\t\t\t\tclassName={item.className}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={expanded ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</m.div>\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.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<ToggleFAB\n\t\t\t\t\tref={toggleRef}\n\t\t\t\t\tid={fabId}\n\t\t\t\t\texpanded={expanded}\n\t\t\t\t\tonToggle={onToggle}\n\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\tfabSize={fabSize}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabel ?? (expanded ? \"Close actions menu\" : \"Open actions menu\")\n\t\t\t\t\t}\n\t\t\t\t\taria-controls={menuId}\n\t\t\t\t\ticon={defaultFabIcon}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</LazyMotion>\n\t);\n}\n","import { cva } from \"class-variance-authority\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport { SPRING_TRANSITION } from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types & Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type NavigationRailVariant = \"collapsed\" | \"expanded\" | \"modal\";\nexport type NavigationRailLabelVisibility = \"labeled\" | \"auto\" | \"unlabeled\";\n\nexport interface NavigationRailItemProps {\n\tselected: boolean;\n\ticon: React.ReactNode;\n\tlabel?: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tbadge?: React.ReactNode;\n\t\"aria-label\"?: string;\n\tclassName?: string;\n}\n\nexport interface NavigationRailProps {\n\tvariant?: NavigationRailVariant;\n\tlabelVisibility?: NavigationRailLabelVisibility;\n\theader?: React.ReactNode;\n\tfab?: React.ReactNode;\n\tfooter?: React.ReactNode;\n\tnarrow?: boolean;\n\topen?: boolean;\n\txr?: boolean | \"contained\" | \"spatialized\";\n\tonClose?: () => void;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nconst NavigationRailContext = React.createContext<{\n\tvariant: NavigationRailVariant;\n\tlabelVisibility: NavigationRailLabelVisibility;\n\txr: boolean;\n}>({ variant: \"collapsed\", labelVisibility: \"labeled\", xr: false });\n\nconst MD3_MODAL_TRANSITION = {\n\ttype: \"tween\",\n\tease: [0.05, 0.7, 0.1, 1],\n\tduration: 0.3,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CVA Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst railContainerVariants = cva(\n\t\"flex flex-col overflow-y-auto overflow-x-hidden select-none transition-colors duration-300\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tcollapsed: \"items-center\",\n\t\t\t\texpanded: \"items-start\",\n\t\t\t\tmodal:\n\t\t\t\t\t\"bg-m3-surface shadow-lg rounded-r-[var(--m3-shape-corner-large)]\",\n\t\t\t},\n\t\t\tnarrow: {\n\t\t\t\ttrue: \"w-20\",\n\t\t\t\tfalse: \"w-24\",\n\t\t\t},\n\t\t\txr: {\n\t\t\t\ttrue: \"h-fit py-5 rounded-[48px] shadow-xl bg-m3-surface border border-white/5\",\n\t\t\t\tfalse: \"h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none\",\n\t\t\t},\n\t\t},\n\t\tcompoundVariants: [\n\t\t\t{ variant: \"expanded\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t\t{ variant: \"modal\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t],\n\t\tdefaultVariants: {\n\t\t\tvariant: \"collapsed\",\n\t\t\tnarrow: false,\n\t\t\txr: false,\n\t\t},\n\t},\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction cloneIconWithFill(\n\ticon: React.ReactNode,\n\tselected: boolean,\n): React.ReactNode {\n\tif (!React.isValidElement(icon)) return icon;\n\tif ((icon.type as unknown) === Icon) {\n\t\treturn React.cloneElement(\n\t\t\ticon as React.ReactElement<{ fill?: 0 | 1; animateFill?: boolean }>,\n\t\t\t{ fill: selected ? 1 : 0, animateFill: true },\n\t\t);\n\t}\n\treturn icon;\n}\n\nfunction getMenuItems(container: HTMLElement): HTMLElement[] {\n\treturn Array.from(\n\t\tcontainer.querySelectorAll<HTMLElement>(\n\t\t\t'[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n\t\t),\n\t);\n}\n\nfunction setFocusedItem(items: HTMLElement[], index: number) {\n\tfor (const item of items) item.tabIndex = -1;\n\tconst target = items[index];\n\tif (target) {\n\t\ttarget.tabIndex = 0;\n\t\ttarget.focus();\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem Sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ActivePillProps {\n\tlayoutId: string;\n\tdisableInitial?: boolean;\n}\n\nfunction ActivePill({ layoutId, disableInitial = false }: ActivePillProps) {\n\treturn (\n\t\t<m.div\n\t\t\tlayoutId={layoutId}\n\t\t\tclassName=\"absolute inset-0 bg-m3-secondary-container pointer-events-none\"\n\t\t\tstyle={{ borderRadius: 9999, zIndex: 0 }}\n\t\t\tinitial={disableInitial ? false : { opacity: 0 }}\n\t\t\tanimate={{ opacity: 1 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={SPRING_TRANSITION}\n\t\t/>\n\t);\n}\n\nfunction HoverStateLayer() {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] transition-opacity duration-200 pointer-events-none z-0\" />\n\t);\n}\n\ninterface RippleLayerProps {\n\tripples: ReturnType<typeof useRippleState>[\"ripples\"];\n\tonRippleDone: ReturnType<typeof useRippleState>[\"removeRipple\"];\n}\n\nfunction RippleLayer({ ripples, onRippleDone }: RippleLayerProps) {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0\">\n\t\t\t<Ripple ripples={ripples} onRippleDone={onRippleDone} />\n\t\t</div>\n\t);\n}\n\ninterface IconContainerProps {\n\tselected: boolean;\n\tbadge?: React.ReactNode;\n\tchildren: React.ReactNode;\n}\n\nfunction IconContainer({ selected, badge, children }: IconContainerProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center size-6 transition-colors duration-200\",\n\t\t\t\tselected\n\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{badge && (\n\t\t\t\t<span className=\"absolute -top-1 -right-1 flex min-w-3 h-3 items-center justify-center rounded-full bg-m3-error px-1 text-[10px] font-medium leading-none tracking-normal text-m3-on-error ring-[1.5px] ring-m3-surface\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationRailItemComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tNavigationRailItemProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\ticon,\n\t\t\tlabel,\n\t\t\tonClick,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { variant, labelVisibility } = React.useContext(\n\t\t\tNavigationRailContext,\n\t\t);\n\t\tconst isExpanded = variant === \"expanded\" || variant === \"modal\";\n\t\tconst isModal = variant === \"modal\";\n\t\tconst enableLayout = !isModal;\n\n\t\tconst activePillId = `rail-pill-${React.useId()}`;\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst showLabel =\n\t\t\tisExpanded ||\n\t\t\tlabelVisibility === \"labeled\" ||\n\t\t\t(labelVisibility === \"auto\" && selected);\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.();\n\t\t\t},\n\t\t\t[disabled, onClick],\n\t\t);\n\n\t\tconst filledIcon = cloneIconWithFill(icon, selected);\n\n\t\tconst labelInitial = isModal\n\t\t\t? false\n\t\t\t: { opacity: 0, x: isExpanded ? -12 : 0, y: isExpanded ? 0 : -8 };\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t\t}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"group relative flex cursor-pointer transition-colors duration-200 outline-none select-none\",\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2 rounded-full\",\n\t\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t? \"w-full flex-row items-center px-3 h-14\"\n\t\t\t\t\t\t\t: \"w-full flex-col justify-center h-14\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t>\n\t\t\t\t\t{/* Pill container - adapts layout for expanded vs collapsed */}\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex z-10\",\n\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t? \"flex-row items-center w-fit h-14 px-4 gap-x-3 rounded-full\"\n\t\t\t\t\t\t\t\t: \"flex-col items-center justify-center w-full gap-y-1 rounded-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t\t<ActivePill\n\t\t\t\t\t\t\t\t\t\tlayoutId={activePillId}\n\t\t\t\t\t\t\t\t\t\tdisableInitial={isModal}\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</AnimatePresence>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Icon pill - collapsed mode */}\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\tisExpanded ? \"size-6\" : \"h-8 w-14 mx-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{selected && <ActivePill layoutId={activePillId} />}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\tclassName=\"relative z-10 flex size-6 items-center justify-center text-current\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</m.div>\n\n\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t\t{showLabel && label && (\n\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\tkey=\"rail-label\"\n\t\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\t\tinitial={labelInitial}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, transition: { duration: 0.1 } }}\n\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"z-10 transition-colors duration-200 whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-surface\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t\t\t\t? \"text-sm font-medium tracking-wide text-left\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-xs font-medium tracking-wide\",\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{label}\n\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</m.div>\n\n\t\t\t\t\t<TouchTarget />\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailItemComponent.displayName = \"NavigationRailItem\";\nexport const NavigationRailItem = React.memo(NavigationRailItemComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRail Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction useRoving(navRef: React.RefObject<HTMLElement | null>) {\n\tReact.useEffect(() => {\n\t\tif (!navRef.current) return;\n\t\tconst items = getMenuItems(navRef.current);\n\t\tconst selected = items.find(\n\t\t\t(el) => el.getAttribute(\"aria-current\") === \"page\",\n\t\t);\n\n\t\tfor (const item of items) item.tabIndex = -1;\n\t\tconst firstFocusable = selected ?? items[0];\n\t\tif (firstFocusable) firstFocusable.tabIndex = 0;\n\t}, [navRef]);\n\n\treturn React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLElement>) => {\n\t\t\tif (!navRef.current) return;\n\t\t\tconst items = getMenuItems(navRef.current);\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n\t\t\tconst keyMap: Record<string, () => number> = {\n\t\t\t\tArrowDown: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowRight: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowUp: () => (currentIndex > 0 ? currentIndex - 1 : items.length - 1),\n\t\t\t\tArrowLeft: () =>\n\t\t\t\t\tcurrentIndex > 0 ? currentIndex - 1 : items.length - 1,\n\t\t\t\tHome: () => 0,\n\t\t\t\tEnd: () => items.length - 1,\n\t\t\t};\n\n\t\t\tconst getNextIndex = keyMap[e.key];\n\n\t\t\tif (getNextIndex) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetFocusedItem(items, getNextIndex());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(e.key === \" \" || e.key === \"Enter\") &&\n\t\t\t\titems.includes(document.activeElement as HTMLElement)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\t(document.activeElement as HTMLElement).click();\n\t\t\t}\n\t\t},\n\t\t[navRef],\n\t);\n}\n\nconst NavigationRailComponent = React.forwardRef<\n\tHTMLElement,\n\tNavigationRailProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"collapsed\",\n\t\t\tlabelVisibility = \"labeled\",\n\t\t\theader,\n\t\t\tfab,\n\t\t\tfooter,\n\t\t\tnarrow = false,\n\t\t\topen = false,\n\t\t\txr = false,\n\t\t\tonClose,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isModal = variant === \"modal\";\n\t\tconst isXr = xr === true || xr === \"contained\" || xr === \"spatialized\";\n\t\tconst xrMode = xr === \"spatialized\" ? \"spatialized\" : \"contained\";\n\t\tconst isSpatial = isXr && xrMode === \"spatialized\";\n\t\tconst applyAnimation = !isXr || !isSpatial;\n\n\t\tconst navRef = React.useRef<HTMLElement>(null);\n\t\tconst handleKeyDown = useRoving(navRef);\n\n\t\tconst setRefs = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\tnavRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\tconst navBaseClasses = cn(\n\t\t\trailContainerVariants({ variant, narrow, xr: isXr }),\n\t\t);\n\t\tconst modalPositioning = isModal ? \"fixed left-0 top-0 z-[100]\" : \"\";\n\n\t\tconst navHeaderSpacing = (() => {\n\t\t\tif (!isXr) return \"mb-6 min-h-10\";\n\t\t\tif (xrMode === \"contained\") return fab ? \"mb-10\" : \"mb-5\";\n\t\t\treturn \"mb-5\";\n\t\t})();\n\n\t\tconst navElement = (\n\t\t\t<m.nav\n\t\t\t\tkey=\"md3-nav-rail\"\n\t\t\t\tlayout={!isModal}\n\t\t\t\tref={isSpatial ? undefined : setRefs}\n\t\t\t\trole=\"navigation\"\n\t\t\t\taria-label=\"Main navigation\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tnavBaseClasses,\n\t\t\t\t\t!isSpatial && modalPositioning,\n\t\t\t\t\t!isSpatial && isModal && applyAnimation && \"will-change-transform\",\n\t\t\t\t\t!isSpatial && className,\n\t\t\t\t)}\n\t\t\t\tstyle={isSpatial ? undefined : style}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tinitial={isModal && applyAnimation ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal && applyAnimation ? { x: 0 } : false}\n\t\t\t\texit={isModal && applyAnimation ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{(header || (fab && !isSpatial)) && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full flex-col items-center justify-start shrink-0 empty:hidden\",\n\t\t\t\t\t\t\tnavHeaderSpacing,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{header}\n\t\t\t\t\t\t{header && fab && !isSpatial && (\n\t\t\t\t\t\t\t<div className={isXr ? \"h-1\" : \"h-4\"} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!isSpatial && fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\trole=\"menubar\"\n\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\tclassName=\"flex flex-col flex-1 w-full gap-y-5\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\n\t\t\t\t{footer && (\n\t\t\t\t\t<div className=\"flex w-full flex-col items-center justify-end mt-auto shrink-0 pt-4 empty:hidden\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</m.nav>\n\t\t);\n\n\t\tconst spatialFabSize = narrow\n\t\t\t? \"size-20 rounded-[40px]\"\n\t\t\t: \"size-24 rounded-[48px]\";\n\n\t\tconst spatialWrapper = (\n\t\t\t<m.div\n\t\t\t\tkey=\"md3-nav-wrapper\"\n\t\t\t\tref={setRefs}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col items-center gap-y-5 pointer-events-none\",\n\t\t\t\t\tmodalPositioning,\n\t\t\t\t\t\"m-6\",\n\t\t\t\t\tisModal && \"will-change-transform\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={style}\n\t\t\t\tinitial={isModal ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal ? { x: 0 } : false}\n\t\t\t\texit={isModal ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{fab && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center pointer-events-auto\",\n\t\t\t\t\t\t\tspatialFabSize,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{React.cloneElement(\n\t\t\t\t\tnavElement as React.ReactElement<{ className?: string }>,\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: cn(navBaseClasses, \"pointer-events-auto\"),\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t</m.div>\n\t\t);\n\n\t\tconst finalNavElement = isSpatial ? spatialWrapper : navElement;\n\n\t\tconst contextValue = { variant, labelVisibility, xr: isXr };\n\n\t\tif (isModal) {\n\t\t\tif (typeof document === \"undefined\") return null;\n\n\t\t\treturn createPortal(\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t{open && (\n\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\tkey=\"md3-nav-backdrop\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"linear\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"fixed inset-0 bg-black/40 z-40 will-change-[opacity]\"\n\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\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{open && finalNavElement}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t\t</LazyMotion>,\n\t\t\t\tdocument.body,\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t{finalNavElement}\n\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailComponent.displayName = \"NavigationRail\";\nexport const NavigationRail = React.memo(NavigationRailComponent);\n","/**\n * @file radio-button.tsx\n * MD3 Expressive RadioButton — single-select with RadioGroup support.\n * Spec: https://m3.material.io/components/radio-button/overview\n */\n\nimport { domMax, LazyMotion, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Ripple, type RippleOrigin } from \"./ripple\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** MD3 FastEffects easing: dot grow (emphasizedAccelerate). */\nconst MD3_FAST_EFFECTS = [0.3, 0, 1, 1] as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Color variant for `RadioButton`.\n * - `\"primary\"` — standard selection (default)\n * - `\"error\"` — error/invalid state\n */\nexport type RadioButtonColors = \"primary\" | \"error\";\n\n/** Props for `RadioButton`. */\nexport interface RadioButtonProps {\n\t/** Whether this radio is selected. */\n\tselected?: boolean;\n\t/** Initial selected state (uncontrolled). @default false */\n\tdefaultSelected?: boolean;\n\t/** Called when user clicks. Pass `null` to disable interaction. */\n\tonClick?: (() => void) | null;\n\t/** Disables the radio — visual disabled state + no interaction. @default false */\n\tdisabled?: boolean;\n\t/** Color variant. @default \"primary\" */\n\tcolor?: RadioButtonColors;\n\t/** Error state — changes colors to `m3-error`. @default false */\n\terror?: boolean;\n\t/** Adjacent label text. Renders a `<label>` wrapper. */\n\tlabel?: string;\n\t/** Value used for form submission. */\n\tvalue?: string;\n\t/** Name for grouping (used in RadioGroup context). */\n\tname?: string;\n\t/** ID for the hidden `<input>`. Auto-generated when `label` is set. */\n\tid?: string;\n\t/** Extra class names on the outermost wrapper. */\n\tclassName?: string;\n\t/** ARIA label for the radio when no visible label exists. */\n\t\"aria-label\"?: string;\n\t\"aria-labelledby\"?: string;\n\t\"aria-describedby\"?: string;\n\t/** Whether the radio is required for form submission. */\n\trequired?: boolean;\n\t/** Ref to the hidden `<input type=\"radio\">`. */\n\tref?: React.Ref<HTMLInputElement>;\n}\n\n/** Props for `RadioGroup`. */\nexport interface RadioGroupProps {\n\t/** The name attribute shared across all child RadioButtons. */\n\tname: string;\n\t/** The currently selected value (controlled). */\n\tvalue?: string;\n\t/** Default value (uncontrolled). */\n\tdefaultValue?: string;\n\t/** Called when selection changes. */\n\tonValueChange?: (value: string) => void;\n\t/** Disables all radio buttons in the group. */\n\tdisabled?: boolean;\n\t/** Error state for the entire group. */\n\terror?: boolean;\n\t/** Label for the group (renders as visually hidden or visible heading). */\n\tlabel?: string;\n\t/** ID of an external element that labels this group. */\n\t\"aria-labelledby\"?: string;\n\t/** Direction of layout. @default \"vertical\" */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/** Whether at least one radio in the group must be selected. */\n\trequired?: boolean;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface RadioGroupContextValue {\n\tname: string;\n\tselectedValue: string | undefined;\n\tonValueChange: (value: string) => void;\n\tdisabled: boolean;\n\terror: boolean;\n\trequired: boolean;\n}\n\nconst RadioGroupContext = React.createContext<RadioGroupContextValue | null>(\n\tnull,\n);\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Merges external + internal refs into a single callback ref. @internal */\nfunction useMergedRef<T>(\n\texternalRef: React.Ref<T> | undefined,\n\tinternalRef: React.RefObject<T | null>,\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\t(internalRef as React.MutableRefObject<T | null>).current = node;\n\t\t\tif (!externalRef) return;\n\t\t\tif (typeof externalRef === \"function\") {\n\t\t\t\texternalRef(node);\n\t\t\t} else {\n\t\t\t\t(externalRef as React.MutableRefObject<T | null>).current = node;\n\t\t\t}\n\t\t},\n\t\t[externalRef, internalRef],\n\t);\n}\n\n// ─── RadioVisual ──────────────────────────────────────────────────────────────\n\ninterface RadioVisualProps {\n\tisSelected: boolean;\n\tdisabled: boolean;\n\terror: boolean;\n\tisHovered: boolean;\n\tprefersReduced: boolean;\n}\n\n/**\n * Animated 20×20dp radio circle (outer ring + inner dot). @internal\n * Uses `m.circle` for Framer Motion SVG animation.\n */\nconst RadioVisual = React.memo(function RadioVisual({\n\tisSelected,\n\tdisabled,\n\terror,\n\tisHovered,\n\tprefersReduced,\n}: RadioVisualProps) {\n\tconst accentColor = error\n\t\t? \"var(--color-m3-error)\"\n\t\t: \"var(--color-m3-primary)\";\n\n\tconst disabledColor = \"rgba(0, 0, 0, 0.38)\";\n\n\tconst outerStroke = disabled\n\t\t? disabledColor\n\t\t: isSelected\n\t\t\t? accentColor\n\t\t\t: isHovered\n\t\t\t\t? \"var(--color-m3-on-surface)\"\n\t\t\t\t: \"var(--color-m3-on-surface-variant)\";\n\n\tconst dotFill = disabled\n\t\t? disabledColor\n\t\t: isSelected\n\t\t\t? accentColor\n\t\t\t: \"rgba(0, 0, 0, 0)\";\n\n\tconst ringDuration = prefersReduced ? 0 : 0.15;\n\tconst dotDuration = prefersReduced ? 0 : isSelected ? 0.2 : 0.1;\n\tconst dotEase = isSelected ? MD3_FAST_EFFECTS : (\"easeOut\" as const);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\twidth={20}\n\t\t\theight={20}\n\t\t\tfill=\"none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<m.circle\n\t\t\t\tcx={10}\n\t\t\t\tcy={10}\n\t\t\t\tr={9}\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tfill=\"none\"\n\t\t\t\tanimate={{ stroke: outerStroke }}\n\t\t\t\ttransition={{ duration: ringDuration, ease: \"easeOut\" }}\n\t\t\t/>\n\t\t\t<m.circle\n\t\t\t\tcx={10}\n\t\t\t\tcy={10}\n\t\t\t\tinitial={{ r: 0 }}\n\t\t\t\tanimate={{ r: isSelected ? 5 : 0, fill: dotFill }}\n\t\t\t\ttransition={{\n\t\t\t\t\tr: { duration: dotDuration, ease: dotEase },\n\t\t\t\t\tfill: { duration: ringDuration, ease: \"easeOut\" },\n\t\t\t\t}}\n\t\t\t\tstroke=\"none\"\n\t\t\t/>\n\t\t</svg>\n\t);\n});\n\n// ─── RadioButton ──────────────────────────────────────────────────────────────\n\nconst RadioButtonComponent = React.forwardRef<\n\tHTMLInputElement,\n\tRadioButtonProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\tdefaultSelected = false,\n\t\t\tonClick,\n\t\t\tdisabled: disabledProp = false,\n\t\t\tcolor,\n\t\t\terror: errorProp = false,\n\t\t\tlabel,\n\t\t\tvalue,\n\t\t\tname: nameProp,\n\t\t\tid: idProp,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-labelledby\": ariaLabelledby,\n\t\t\t\"aria-describedby\": ariaDescribedby,\n\t\t\trequired: requiredProp,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst group = React.useContext(RadioGroupContext);\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst generatedId = React.useId();\n\t\tconst inputId = idProp ?? (label ? `radio-${generatedId}` : undefined);\n\n\t\tconst name = group?.name ?? nameProp;\n\t\tconst disabled = group?.disabled || disabledProp;\n\t\tconst error = group?.error || errorProp || color === \"error\";\n\t\tconst required = group?.required || requiredProp;\n\n\t\tconst [internalSelected, setInternalSelected] =\n\t\t\tReact.useState(defaultSelected);\n\n\t\tconst isControlled = selected !== undefined;\n\t\tconst isSelected: boolean = group\n\t\t\t? group.selectedValue === value\n\t\t\t: isControlled\n\t\t\t\t? (selected ?? false)\n\t\t\t\t: internalSelected;\n\n\t\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\t\tconst removeRipple = React.useCallback(\n\t\t\t(id: number) => setRipples((prev) => prev.filter((r) => r.id !== id)),\n\t\t\t[],\n\t\t);\n\n\t\tconst onPointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\t\tif (disabled) return;\n\t\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\t\tconst x = e.clientX - rect.left - 4;\n\t\t\t\tconst y = e.clientY - rect.top - 4;\n\t\t\t\tconst rippleSize = Math.hypot(40, 40) * 2;\n\t\t\t\tsetRipples((prev) => [\n\t\t\t\t\t...prev,\n\t\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t\t]);\n\t\t\t},\n\t\t\t[disabled],\n\t\t);\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst onPointerEnter = React.useCallback(() => {\n\t\t\tif (!disabled) setIsHovered(true);\n\t\t}, [disabled]);\n\t\tconst onPointerLeave = React.useCallback(() => setIsHovered(false), []);\n\n\t\tconst handleChange = React.useCallback(\n\t\t\t(_e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\tif (disabled || onClick === null) return;\n\n\t\t\t\tif (group) {\n\t\t\t\t\tif (value !== undefined) group.onValueChange(value);\n\t\t\t\t} else if (!isControlled) {\n\t\t\t\t\tsetInternalSelected(true);\n\t\t\t\t\tonClick?.();\n\t\t\t\t} else {\n\t\t\t\t\tonClick?.();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[disabled, onClick, group, value, isControlled],\n\t\t);\n\n\t\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, inputRef);\n\n\t\tconst stateLayerBg = error ? \"before:bg-m3-error\" : \"before:bg-m3-primary\";\n\n\t\tconst stateLayerClass = cn(\n\t\t\t\"before:absolute before:inset-0 before:rounded-full before:pointer-events-none\",\n\t\t\t\"before:transition-opacity before:duration-150 before:opacity-0\",\n\t\t\t\"group-hover/radio:before:opacity-[0.08]\",\n\t\t\t\"group-focus-within/radio:before:opacity-[0.10]\",\n\t\t\t\"group-active/radio:before:opacity-[0.10]\",\n\t\t\tstateLayerBg,\n\t\t);\n\n\t\tconst touchTargetClass = cn(\n\t\t\t\"relative inline-flex items-center justify-center outline-none shrink-0\",\n\t\t\t\"w-12 h-12 group/radio cursor-pointer\",\n\t\t\tdisabled && \"pointer-events-none\",\n\t\t);\n\n\t\tconst stateLayerAndRipple = (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute flex items-center justify-center w-10 h-10 m-auto inset-0 rounded-full overflow-hidden pointer-events-none\",\n\t\t\t\t\tstateLayerClass,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<Ripple\n\t\t\t\t\tripples={ripples}\n\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\n\t\tconst hiddenInput = (\n\t\t\t<input\n\t\t\t\tref={mergedRef}\n\t\t\t\ttype=\"radio\"\n\t\t\t\tid={inputId}\n\t\t\t\tname={name}\n\t\t\t\tvalue={value}\n\t\t\t\tchecked={isSelected}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-labelledby={ariaLabelledby}\n\t\t\t\taria-describedby={ariaDescribedby}\n\t\t\t\trequired={required}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tclassName=\"sr-only\"\n\t\t\t/>\n\t\t);\n\n\t\tconst visual = (\n\t\t\t<RadioVisual\n\t\t\t\tisSelected={isSelected}\n\t\t\t\tdisabled={disabled}\n\t\t\t\terror={error}\n\t\t\t\tisHovered={isHovered}\n\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t/>\n\t\t);\n\n\t\tif (label) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"inline-flex items-center gap-2 cursor-pointer select-none\",\n\t\t\t\t\t\t\tdisabled &&\n\t\t\t\t\t\t\t\t\"cursor-not-allowed opacity-[0.38] pointer-events-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={touchTargetClass}\n\t\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t\tonPointerEnter={onPointerEnter}\n\t\t\t\t\t\t\tonPointerLeave={onPointerLeave}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{stateLayerAndRipple}\n\t\t\t\t\t\t\t{hiddenInput}\n\t\t\t\t\t\t\t{visual}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-sm leading-none text-m3-on-surface\">\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<label\n\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\tclassName={cn(touchTargetClass, className)}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonPointerEnter={onPointerEnter}\n\t\t\t\t\tonPointerLeave={onPointerLeave}\n\t\t\t\t>\n\t\t\t\t\t{stateLayerAndRipple}\n\t\t\t\t\t{hiddenInput}\n\t\t\t\t\t{visual}\n\t\t\t\t</label>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nRadioButtonComponent.displayName = \"RadioButton\";\n\n/**\n * MD3 Expressive RadioButton component.\n *\n * Single-select control. Supports standalone (controlled/uncontrolled) and\n * `RadioGroup` context. Animated per MD3 spec: inner dot radius morph,\n * outer ring color transition, state layer, and ripple.\n *\n * @example\n * ```tsx\n * <RadioButton selected={isSelected} onClick={() => setSelected(true)} label=\"Option A\" />\n *\n * <RadioGroup name=\"plan\" value={plan} onValueChange={setPlan}>\n * <RadioButton value=\"free\" label=\"Free\" />\n * <RadioButton value=\"pro\" label=\"Pro\" />\n * </RadioGroup>\n * ```\n * @see https://m3.material.io/components/radio-button/overview\n */\nexport const RadioButton = React.memo(RadioButtonComponent);\n\n// ─── RadioGroup ────────────────────────────────────────────────────────────────\n\nconst RadioGroupComponent = React.forwardRef<HTMLDivElement, RadioGroupProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvalue: valueProp,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\tdisabled = false,\n\t\t\terror = false,\n\t\t\tlabel,\n\t\t\t\"aria-labelledby\": ariaLabelledby,\n\t\t\trequired = false,\n\t\t\torientation = \"vertical\",\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [internalValue, setInternalValue] = React.useState<\n\t\t\tstring | undefined\n\t\t>(defaultValue);\n\t\tconst isControlled = valueProp !== undefined;\n\t\tconst selectedValue = isControlled ? valueProp : internalValue;\n\n\t\tconst handleValueChange = React.useCallback(\n\t\t\t(val: string) => {\n\t\t\t\tif (!isControlled) setInternalValue(val);\n\t\t\t\tonValueChange?.(val);\n\t\t\t},\n\t\t\t[isControlled, onValueChange],\n\t\t);\n\n\t\tconst groupRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, groupRef);\n\n\t\tconst onKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\t\tif (disabled) return;\n\n\t\t\t\tconst isNext = e.key === \"ArrowDown\" || e.key === \"ArrowRight\";\n\t\t\t\tconst isPrev = e.key === \"ArrowUp\" || e.key === \"ArrowLeft\";\n\t\t\t\tif (!isNext && !isPrev) return;\n\n\t\t\t\te.preventDefault();\n\n\t\t\t\tconst inputs = Array.from(\n\t\t\t\t\tgroupRef.current?.querySelectorAll<HTMLInputElement>(\n\t\t\t\t\t\t'input[type=\"radio\"]:not(:disabled)',\n\t\t\t\t\t) ?? [],\n\t\t\t\t);\n\t\t\t\tif (inputs.length === 0) return;\n\n\t\t\t\tconst currentIdx = inputs.indexOf(\n\t\t\t\t\tdocument.activeElement as HTMLInputElement,\n\t\t\t\t);\n\n\t\t\t\tconst nextIdx = isNext\n\t\t\t\t\t? currentIdx < inputs.length - 1\n\t\t\t\t\t\t? currentIdx + 1\n\t\t\t\t\t\t: 0\n\t\t\t\t\t: currentIdx > 0\n\t\t\t\t\t\t? currentIdx - 1\n\t\t\t\t\t\t: inputs.length - 1;\n\n\t\t\t\tconst target = inputs[nextIdx];\n\t\t\t\ttarget.focus();\n\t\t\t\thandleValueChange(target.value);\n\t\t\t},\n\t\t\t[disabled, handleValueChange],\n\t\t);\n\n\t\tconst contextValue = React.useMemo<RadioGroupContextValue>(\n\t\t\t() => ({\n\t\t\t\tname,\n\t\t\t\tselectedValue,\n\t\t\t\tonValueChange: handleValueChange,\n\t\t\t\tdisabled,\n\t\t\t\terror,\n\t\t\t\trequired,\n\t\t\t}),\n\t\t\t[name, selectedValue, handleValueChange, disabled, error, required],\n\t\t);\n\n\t\treturn (\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-label={label && !ariaLabelledby ? label : undefined}\n\t\t\t\t\taria-labelledby={ariaLabelledby}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\taria-required={required || undefined}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex\",\n\t\t\t\t\t\torientation === \"horizontal\" ? \"flex-row gap-4\" : \"flex-col gap-1\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t>\n\t\t\t\t\t{label && !ariaLabelledby && <span className=\"sr-only\">{label}</span>}\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t);\n\t},\n);\n\nRadioGroupComponent.displayName = \"RadioGroup\";\n\n/**\n * MD3 Expressive RadioGroup component.\n *\n * Groups multiple `RadioButton` components under a shared `name` with keyboard\n * navigation (Arrow keys with wrapping) and ARIA `radiogroup` semantics.\n *\n * @example\n * ```tsx\n * <RadioGroup name=\"theme\" value={theme} onValueChange={setTheme} label=\"Theme\">\n * <RadioButton value=\"light\" label=\"Light\" />\n * <RadioButton value=\"dark\" label=\"Dark\" />\n * <RadioButton value=\"system\" label=\"System\" />\n * </RadioGroup>\n * ```\n * @see https://m3.material.io/components/radio-button/overview\n */\nexport const RadioGroup = React.memo(RadioGroupComponent);\n","/**\n * @file snackbar.tsx\n *\n * MD3 Expressive Snackbar component.\n *\n * Architecture:\n * - `Snackbar` → Pure display component (motion.div, role=\"status\", aria-live=\"polite\")\n * - `SnackbarHost` → AnimatePresence container + queue flush (place once in layout)\n * - `SnackbarProvider` → Context provider that wires SnackbarHost + exposes `useSnackbar`\n * - `useSnackbarState` → Low-level ref-based queue hook (mutex pattern)\n * - `useSnackbar` → Consumer hook for imperative `showSnackbar(visuals)` calls\n *\n * Queue strategy:\n * - One snackbar visible at a time (MD3 spec).\n * - Subsequent `showSnackbar()` calls are enqueued, shown as soon as current one dismisses.\n * - Cleanup: on unmount, all pending promises resolve as 'dismissed'.\n *\n * @see https://m3.material.io/components/snackbar/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../icon\";\nimport { IconButton } from \"../icon-button\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DURATION_MAP = {\n\tshort: 4000,\n\tlong: 7000,\n} as const;\n\nconst RESULT = {\n\tACTION: \"action-performed\",\n\tDISMISSED: \"dismissed\",\n} as const satisfies Record<string, SnackbarResult>;\n\n// ─── Animation Config (Framer Motion — NOT CSS transitions) ──────────────────\n\nconst SNACKBAR_SPRING = {\n\ttype: \"spring\" as const,\n\tbounce: 0.15,\n\tduration: 0.4,\n};\n\nconst SNACKBAR_ANIM = {\n\tinitial: { opacity: 0, y: 56, scale: 0.9 },\n\tanimate: {\n\t\topacity: 1,\n\t\ty: 0,\n\t\tscale: 1,\n\t\ttransition: SNACKBAR_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\ty: 24,\n\t\tscale: 0.95,\n\t\ttransition: { duration: 0.2, ease: \"easeIn\" as const },\n\t},\n} as const;\n\nconst REDUCED_MOTION_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: { opacity: 1 },\n\texit: { opacity: 0 },\n} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Duration preset for the snackbar auto-dismiss timer.\n * - `'short'` → 4 000 ms (default, MD3 spec)\n * - `'long'` → 7 000 ms\n * - `number` → custom milliseconds\n */\nexport type SnackbarDuration = \"short\" | \"long\" | number;\n\n/**\n * Resolution value returned by the `showSnackbar()` promise.\n * - `'action-performed'` → user clicked the action button\n * - `'dismissed'` → auto-dismissed or close button clicked\n */\nexport type SnackbarResult = \"action-performed\" | \"dismissed\";\n\n/**\n * Visual configuration for a single snackbar instance.\n */\nexport interface SnackbarVisuals {\n\t/** Main message text. */\n\tmessage: string;\n\t/** Label for the optional action button. */\n\tactionLabel?: string;\n\t/** When `true`, renders a close (X) icon button. @default false */\n\twithDismissAction?: boolean;\n\t/**\n\t * When `true`, renders the action button below the message (Column layout).\n\t * Use when both message and actionLabel are long.\n\t * @default false\n\t */\n\tactionOnNewLine?: boolean;\n\t/**\n\t * Auto-dismiss duration.\n\t * @default 'short' (4 000 ms)\n\t */\n\tduration?: SnackbarDuration;\n\t/** Additional className applied to the snackbar container. */\n\tclassName?: string;\n}\n\n/**\n * Internal runtime data for a currently-displayed snackbar.\n * Includes the resolve callback to settle the caller's promise.\n */\nexport interface SnackbarData {\n\t/** Unique key for AnimatePresence element diffing. */\n\tid: string;\n\t/** Visual configuration. */\n\tvisuals: SnackbarVisuals;\n\t/** Settles the promise returned by `showSnackbar()`. */\n\tresolve: (result: SnackbarResult) => void;\n}\n\n/** Props for the pure `Snackbar` display component. */\nexport interface SnackbarProps {\n\t/** Runtime data including message, actions, and resolve callback. */\n\tdata: SnackbarData;\n\t/** Additional className merged onto the snackbar container. */\n\tclassName?: string;\n}\n\n/** Props for the `SnackbarHost` component. */\nexport interface SnackbarHostProps {\n\t/** State returned by `useSnackbarState()`. */\n\tstate: UseSnackbarStateReturn;\n\t/** Additional className applied to the fixed host wrapper. */\n\tclassName?: string;\n}\n\n// ─── Internal Queue Item ──────────────────────────────────────────────────────\n\ninterface QueueItem {\n\tvisuals: SnackbarVisuals;\n\tresolve: (result: SnackbarResult) => void;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveDuration(duration: SnackbarDuration | undefined): number {\n\tif (duration === undefined) return DURATION_MAP.short;\n\tif (typeof duration === \"number\") return duration;\n\treturn DURATION_MAP[duration];\n}\n\nfunction generateId(): string {\n\treturn typeof crypto !== \"undefined\" && crypto.randomUUID\n\t\t? crypto.randomUUID()\n\t\t: Math.random().toString(36).slice(2);\n}\n\nfunction toSnackbarData(item: QueueItem): SnackbarData {\n\treturn { id: generateId(), visuals: item.visuals, resolve: item.resolve };\n}\n\n// ─── useSnackbarState hook ────────────────────────────────────────────────────\n\n/** Return type of `useSnackbarState`. */\nexport interface UseSnackbarStateReturn {\n\t/** Currently visible snackbar data, or `null` when idle. */\n\tcurrent: SnackbarData | null;\n\t/**\n\t * Show a snackbar with the given visuals.\n\t * Returns a promise that resolves when the snackbar is dismissed or the action is triggered.\n\t */\n\tshowSnackbar: (visuals: SnackbarVisuals) => Promise<SnackbarResult>;\n\t/** Internal dismiss handler — called by `SnackbarHost`. */\n\t_dismiss: (result: SnackbarResult) => void;\n}\n\n/**\n * Low-level hook that manages the snackbar queue and current state.\n *\n * Uses a `ref`-based queue (mutex pattern) so that enqueueing never\n * triggers a re-render storm — only the state transition does.\n *\n * @example\n * ```tsx\n * // Used internally by SnackbarProvider\n * const state = useSnackbarState();\n * return <SnackbarHost state={state} />;\n * ```\n */\nexport function useSnackbarState(): UseSnackbarStateReturn {\n\tconst [current, setCurrent] = React.useState<SnackbarData | null>(null);\n\tconst queueRef = React.useRef<QueueItem[]>([]);\n\n\tconst showSnackbar = React.useCallback(\n\t\t(visuals: SnackbarVisuals): Promise<SnackbarResult> => {\n\t\t\treturn new Promise<SnackbarResult>((resolve) => {\n\t\t\t\tconst item: QueueItem = { visuals, resolve };\n\t\t\t\tsetCurrent((prev) => {\n\t\t\t\t\tif (prev === null) return toSnackbarData(item);\n\t\t\t\t\tqueueRef.current.push(item);\n\t\t\t\t\treturn prev;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst _dismiss = React.useCallback((result: SnackbarResult) => {\n\t\tsetCurrent((prev) => {\n\t\t\tif (prev) prev.resolve(result);\n\t\t\tconst next = queueRef.current.shift();\n\t\t\treturn next ? toSnackbarData(next) : null;\n\t\t});\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tfor (const item of queueRef.current) {\n\t\t\t\titem.resolve(RESULT.DISMISSED);\n\t\t\t}\n\t\t\tqueueRef.current = [];\n\t\t};\n\t}, []);\n\n\treturn { current, showSnackbar, _dismiss };\n}\n\n// ─── Snackbar (Pure Display Component) ───────────────────────────────────────\n\n/**\n * MD3 Expressive Snackbar — pure display component.\n *\n * Renders a single snackbar with message, optional action button, and\n * optional dismiss icon button. Handles its own auto-dismiss timer.\n *\n * @remarks\n * - Uses `role=\"status\"` + `aria-live=\"polite\"` for screen reader announcements.\n * - All entrance/exit animation is handled by the parent `SnackbarHost` via\n * `AnimatePresence` + `SNACKBAR_ANIM`.\n * - Do NOT render this component directly — use `SnackbarHost`.\n *\n * @example\n * ```tsx\n * // Internal usage inside SnackbarHost — not for direct use\n * <Snackbar data={currentSnackbarData} />\n * ```\n */\nexport const Snackbar = React.memo(function Snackbar({\n\tdata,\n\tclassName,\n}: SnackbarProps) {\n\tconst { visuals, resolve } = data;\n\tconst {\n\t\tmessage,\n\t\tactionLabel,\n\t\twithDismissAction = false,\n\t\tactionOnNewLine = false,\n\t\tduration,\n\t} = visuals;\n\n\tconst reducedMotion = useReducedMotion();\n\tconst durationMs = resolveDuration(duration);\n\n\tReact.useEffect(() => {\n\t\tconst timer = setTimeout(() => resolve(RESULT.DISMISSED), durationMs);\n\t\treturn () => clearTimeout(timer);\n\t}, [resolve, durationMs]);\n\n\tconst handleAction = React.useCallback(\n\t\t() => resolve(RESULT.ACTION),\n\t\t[resolve],\n\t);\n\n\tconst handleDismiss = React.useCallback(\n\t\t() => resolve(RESULT.DISMISSED),\n\t\t[resolve],\n\t);\n\n\tconst hasActions = actionLabel || withDismissAction;\n\tconst anim = reducedMotion ? REDUCED_MOTION_ANIM : SNACKBAR_ANIM;\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-atomic=\"true\"\n\t\t\t{...anim}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2\",\n\t\t\t\t\"min-w-72 max-w-142 w-max\",\n\t\t\t\t\"rounded-sm px-4 py-3 shadow-md\",\n\t\t\t\t\"text-m3-inverse-on-surface bg-m3-inverse-surface\",\n\t\t\t\tactionOnNewLine ? \"flex-col items-start\" : \"flex-row\",\n\t\t\t\tclassName,\n\t\t\t\tvisuals.className,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"flex-1 text-sm leading-5 font-normal\">{message}</span>\n\n\t\t\t{hasActions && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex shrink-0 items-center gap-1\",\n\t\t\t\t\t\tactionOnNewLine && \"self-end\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{actionLabel && (\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={handleAction}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-sm font-medium\",\n\t\t\t\t\t\t\t\t\"px-2 py-1 rounded-sm\",\n\t\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\t\t\t\t\t\t\t\"transition-colors whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\"text-m3-inverse-primary\",\n\t\t\t\t\t\t\t)}\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\n\t\t\t\t\t{withDismissAction && (\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tcolorStyle=\"filled\"\n\t\t\t\t\t\t\taria-label=\"Dismiss notification\"\n\t\t\t\t\t\t\tonClick={handleDismiss}\n\t\t\t\t\t\t\tclassName=\"text-m3-inverse-on-surface bg-m3-inverse-surface\"\n\t\t\t\t\t\t>\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)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</m.div>\n\t);\n});\n\nSnackbar.displayName = \"Snackbar\";\n\n// ─── SnackbarHost ─────────────────────────────────────────────────────────────\n\n/**\n * MD3 SnackbarHost — renders the AnimatePresence container for snackbar queue.\n *\n * Place this once in your app layout. It will show snackbars one at a time,\n * dequeuing the next one as each dismisses.\n *\n * @example\n * ```tsx\n * // Typically used inside SnackbarProvider — not directly\n * const state = useSnackbarState();\n * <SnackbarHost state={state} />\n * ```\n */\nexport function SnackbarHost({ state, className }: SnackbarHostProps) {\n\tconst { current, _dismiss } = state;\n\n\tconst wrappedData = React.useMemo<SnackbarData | null>(() => {\n\t\tif (!current) return null;\n\t\treturn { ...current, resolve: _dismiss };\n\t}, [current, _dismiss]);\n\n\treturn (\n\t\t<LazyMotion features={domMax} strict>\n\t\t\t<section\n\t\t\t\taria-label=\"Snackbar notifications\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed bottom-4 left-1/2 -translate-x-1/2 z-50\",\n\t\t\t\t\t\"flex flex-col items-center pointer-events-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{wrappedData && (\n\t\t\t\t\t\t<div key={wrappedData.id} className=\"pointer-events-auto\">\n\t\t\t\t\t\t\t<Snackbar data={wrappedData} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</section>\n\t\t</LazyMotion>\n\t);\n}\n\nSnackbarHost.displayName = \"SnackbarHost\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface SnackbarContextValue {\n\tshowSnackbar: (visuals: SnackbarVisuals) => Promise<SnackbarResult>;\n}\n\nconst SnackbarContext = React.createContext<SnackbarContextValue | null>(null);\n\n// ─── SnackbarProvider ─────────────────────────────────────────────────────────\n\n/**\n * MD3 SnackbarProvider — context provider for imperative snackbar API.\n *\n * Wrap your application (or a section of it) with this provider.\n * Then use `useSnackbar()` in any descendant to show snackbars.\n *\n * @example\n * ```tsx\n * // In your root layout:\n * <SnackbarProvider>\n * <App />\n * </SnackbarProvider>\n *\n * // In any component:\n * const { showSnackbar } = useSnackbar();\n * await showSnackbar({ message: 'Saved!', actionLabel: 'Undo' });\n * ```\n */\nexport function SnackbarProvider({ children }: { children: React.ReactNode }) {\n\tconst state = useSnackbarState();\n\n\tconst contextValue = React.useMemo<SnackbarContextValue>(\n\t\t() => ({ showSnackbar: state.showSnackbar }),\n\t\t[state.showSnackbar],\n\t);\n\n\treturn (\n\t\t<SnackbarContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t\t<SnackbarHost state={state} />\n\t\t</SnackbarContext.Provider>\n\t);\n}\n\nSnackbarProvider.displayName = \"SnackbarProvider\";\n\n// ─── useSnackbar hook ─────────────────────────────────────────────────────────\n\n/**\n * Hook that returns the `showSnackbar` function from the nearest `SnackbarProvider`.\n *\n * @throws {Error} if used outside of a `SnackbarProvider`.\n *\n * @example\n * ```tsx\n * function SaveButton() {\n * const { showSnackbar } = useSnackbar();\n *\n * const handleSave = async () => {\n * const result = await showSnackbar({\n * message: 'Changes saved',\n * actionLabel: 'Undo',\n * });\n * if (result === 'action-performed') undoSave();\n * };\n *\n * return <button onClick={handleSave}>Save</button>;\n * }\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n\tconst ctx = React.useContext(SnackbarContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useSnackbar must be used within a <SnackbarProvider>.\");\n\t}\n\treturn ctx;\n}\n","/**\n * @file switch.tokens.ts\n * MD3 Expressive Switch — Design tokens ported from SwitchTokens.kt.\n * All dimensional values are in px (dp equivalent for web).\n * @see docs/m3/switch/SwitchTokens.kt\n */\n\n/**\n * Design tokens for the MD3 Expressive Switch component.\n *\n * Maps directly from `SwitchTokens.kt` (v0_210) to CSS/JS values.\n * Use these as the single source of truth for sizing and opacity.\n *\n * Color tokens are NOT included here — they reference CSS custom properties\n * from the project's MD3 theme system (`--md-sys-color-*`).\n */\nexport const SwitchTokens = {\n\t// ── Track ─────────────────────────────────────────────────────────────────\n\t/** SwitchTokens.TrackWidth = 52dp */\n\ttrackWidth: 52,\n\t/** SwitchTokens.TrackHeight = 32dp */\n\ttrackHeight: 32,\n\t/** SwitchTokens.TrackOutlineWidth = 2dp */\n\ttrackOutlineWidth: 2,\n\n\t// ── Handle (Thumb) ────────────────────────────────────────────────────────\n\t/** SwitchTokens.SelectedHandleWidth/Height = 24dp */\n\tselectedHandleSize: 24,\n\t/** SwitchTokens.UnselectedHandleWidth/Height = 16dp */\n\tunselectedHandleSize: 16,\n\t/** SwitchTokens.IconHandleWidth/Height = 24dp (when thumb has icon content) */\n\ticonHandleSize: 24,\n\t/** SwitchTokens.PressedHandleWidth/Height = 28dp */\n\tpressedHandleSize: 28,\n\n\t// ── State Layer ───────────────────────────────────────────────────────────\n\t/** SwitchTokens.StateLayerSize = 40dp */\n\tstateLayerSize: 40,\n\n\t// ── Icon ──────────────────────────────────────────────────────────────────\n\t/** SwitchTokens.SelectedIconSize / UnselectedIconSize = 16dp */\n\ticonSize: 16,\n\n\t// ── Opacity (disabled states) ─────────────────────────────────────────────\n\t/** SwitchTokens.DisabledTrackOpacity = 0.12 */\n\tdisabledTrackOpacity: 0.12,\n\t/** SwitchTokens.DisabledSelectedHandleOpacity = 1.0 */\n\tdisabledSelectedHandleOpacity: 1.0,\n\t/** SwitchTokens.DisabledUnselectedHandleOpacity = 0.38 */\n\tdisabledUnselectedHandleOpacity: 0.38,\n\t/** SwitchTokens.DisabledSelectedIconOpacity = 0.38 */\n\tdisabledSelectedIconOpacity: 0.38,\n\t/** SwitchTokens.DisabledUnselectedIconOpacity = 0.38 */\n\tdisabledUnselectedIconOpacity: 0.38,\n} as const;\n\n// ── MD3 Color token references (CSS custom properties) ────────────────────────\n\n/**\n * CSS custom property references for Switch colors.\n * These map to the project's `--md-sys-color-*` tokens in `colors.css`.\n *\n * DO NOT hardcode hex values — always use these references so the\n * component automatically adapts to light/dark theme switching.\n */\nexport const SwitchColors = {\n\t// Track\n\tcheckedTrack: \"var(--md-sys-color-primary)\",\n\tuncheckedTrack: \"var(--md-sys-color-surface-container-highest)\",\n\tuncheckedTrackOutline: \"var(--md-sys-color-outline)\",\n\n\t// Thumb\n\tcheckedThumb: \"var(--md-sys-color-on-primary)\",\n\tuncheckedThumb: \"var(--md-sys-color-outline)\",\n\thoverCheckedThumb: \"var(--md-sys-color-primary-container)\",\n\thoverUncheckedThumb: \"var(--md-sys-color-on-surface-variant)\",\n\tdisabledCheckedThumb: \"var(--md-sys-color-surface)\",\n\n\t// Icon\n\tcheckedIcon: \"var(--md-sys-color-on-primary-container)\",\n\tuncheckedIcon: \"var(--md-sys-color-surface-container-highest)\",\n\n\t// State layer\n\tcheckedStateLayer: \"var(--md-sys-color-primary)\",\n\tuncheckedStateLayer: \"var(--md-sys-color-on-surface)\",\n\n\t// Focus indicator\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n} as const;\n","/**\n * @file switch.tsx\n * MD3 Expressive Switch — ARIA switch pattern with Framer Motion animations.\n * Spec: https://m3.material.io/components/switch/overview\n *\n * Key decisions:\n * - Uses `<button role=\"switch\">` (no <input>) per MD3 accessibility spec\n * - Framer Motion for ALL animations (thumb x, size morph, state layer, icons)\n * - Hover state via useState (required for Framer Motion color animate)\n * - Disabled colors via rgba() literals (color-mix() not animatable by FM)\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Ripple, type RippleOrigin } from \"../ripple\";\nimport { SwitchColors, SwitchTokens } from \"./switch.tokens\";\nimport type { SwitchProps } from \"./switch.types\";\n\n// ─── Animation constants ───────────────────────────────────────────────────────\n\n/**\n * FastSpatial spring — equivalent to MotionSchemeKeyTokens.FastSpatial.\n * Used for thumb translation and size morph on checked state change.\n */\nconst FAST_SPATIAL_SPRING = {\n\ttype: \"spring\",\n\tstiffness: 500,\n\tdamping: 40,\n} as const;\n\n/** Instant transition (SnapSpec equivalent) — used when thumb is pressed. */\nconst SNAP_TRANSITION = { duration: 0 } as const;\n\n/** Color transition for track/thumb color changes. */\nconst COLOR_TRANSITION = { duration: 0.2, ease: \"easeInOut\" } as const;\n\n/** State layer spring — for hover/focus overlay. */\nconst STATE_LAYER_SPRING = {\n\ttype: \"spring\",\n\tstiffness: 400,\n\tdamping: 30,\n} as const;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Computes thumb size in px based on current interaction state.\n * @internal\n */\nfunction resolveThumbSize(\n\tisPressed: boolean,\n\tchecked: boolean,\n\thasIcon: boolean,\n): number {\n\tif (isPressed) return SwitchTokens.pressedHandleSize;\n\tif (checked || hasIcon) return SwitchTokens.selectedHandleSize;\n\treturn SwitchTokens.unselectedHandleSize;\n}\n\n/**\n * Computes thumb X offset. Mirrors ThumbNode.measure() from Switch.kt.\n * @internal\n */\nfunction resolveThumbX(\n\tchecked: boolean,\n\tisPressed: boolean,\n\tthumbSize: number,\n): number {\n\tconst { trackHeight, trackWidth, trackOutlineWidth, selectedHandleSize } =\n\t\tSwitchTokens;\n\tconst thumbPaddingStart = (trackHeight - thumbSize) / 2;\n\tconst thumbPadding = (trackHeight - selectedHandleSize) / 2;\n\tconst maxBound = trackWidth - selectedHandleSize - thumbPadding;\n\n\tif (isPressed && checked) return maxBound - trackOutlineWidth;\n\tif (isPressed) return thumbPaddingStart + trackOutlineWidth;\n\tif (checked) return maxBound;\n\treturn thumbPaddingStart;\n}\n\n/**\n * Resolves the thumb background color based on interaction state.\n * @internal\n */\nfunction resolveThumbColor(\n\tchecked: boolean,\n\tdisabled: boolean,\n\tisInteracting: boolean,\n\tcheckedThumbColor?: string,\n\tuncheckedThumbColor?: string,\n): string {\n\tif (disabled) {\n\t\treturn checked\n\t\t\t? SwitchColors.disabledCheckedThumb\n\t\t\t: \"rgba(28, 27, 31, 0.38)\";\n\t}\n\tif (checked) {\n\t\treturn isInteracting\n\t\t\t? (checkedThumbColor ?? SwitchColors.hoverCheckedThumb)\n\t\t\t: (checkedThumbColor ?? SwitchColors.checkedThumb);\n\t}\n\treturn isInteracting\n\t\t? (uncheckedThumbColor ?? SwitchColors.hoverUncheckedThumb)\n\t\t: (uncheckedThumbColor ?? SwitchColors.uncheckedThumb);\n}\n\n/**\n * Determines if the thumb icon should be visible.\n * @internal\n */\nfunction isIconVisible(\n\tthumbContent: React.ReactNode | undefined,\n\ticons: boolean,\n\tshowOnlySelectedIcon: boolean,\n\tchecked: boolean,\n): boolean {\n\tif (thumbContent == null) return false;\n\tif (icons) return true;\n\treturn showOnlySelectedIcon && checked;\n}\n\n// ─── SwitchVisual ──────────────────────────────────────────────────────────────\n\ninterface ColorOverrides {\n\tcheckedTrackColor?: string;\n\tuncheckedTrackColor?: string;\n\tcheckedThumbColor?: string;\n\tuncheckedThumbColor?: string;\n}\n\ninterface SwitchVisualProps extends ColorOverrides {\n\tchecked: boolean;\n\tdisabled: boolean;\n\tisPressed: boolean;\n\tisHovered: boolean;\n\tisFocused: boolean;\n\tthumbContent: React.ReactNode | undefined;\n\ticons: boolean;\n\tshowOnlySelectedIcon: boolean;\n\tprefersReduced: boolean;\n}\n\n/** Animated switch visual (track + state layer + thumb + icon). @internal */\nconst SwitchVisual = React.memo(function SwitchVisual({\n\tchecked,\n\tdisabled,\n\tisPressed,\n\tisHovered,\n\tisFocused,\n\tthumbContent,\n\ticons,\n\tshowOnlySelectedIcon,\n\tprefersReduced,\n\tcheckedTrackColor,\n\tuncheckedTrackColor,\n\tcheckedThumbColor,\n\tuncheckedThumbColor,\n}: SwitchVisualProps) {\n\tconst hasIcon = icons && thumbContent != null;\n\tconst thumbSize = resolveThumbSize(isPressed, checked, hasIcon);\n\tconst thumbX = resolveThumbX(checked, isPressed, thumbSize);\n\n\t// ── Track colors ──────────────────────────────────────────────────────────\n\tconst trackBg = checked\n\t\t? (checkedTrackColor ?? SwitchColors.checkedTrack)\n\t\t: (uncheckedTrackColor ?? SwitchColors.uncheckedTrack);\n\n\tconst trackBorderColor = checked\n\t\t? \"rgba(0, 0, 0, 0)\"\n\t\t: SwitchColors.uncheckedTrackOutline;\n\n\tconst trackBorderWidth = checked ? 0 : SwitchTokens.trackOutlineWidth;\n\n\t// Disabled track: use rgba literals (color-mix not animatable)\n\t// Light: on-surface = #1c1b1f → rgba(28,27,31,0.12)\n\t// We use CSS custom property approach with opacity wrapper instead\n\tconst trackOpacity = disabled ? SwitchTokens.disabledTrackOpacity : 1;\n\n\t// ── Thumb colors ──────────────────────────────────────────────────────────\n\tconst isInteracting = isHovered || isFocused || isPressed;\n\tconst thumbBg = resolveThumbColor(\n\t\tchecked,\n\t\tdisabled,\n\t\tisInteracting,\n\t\tcheckedThumbColor,\n\t\tuncheckedThumbColor,\n\t);\n\n\t// ── Icon color ────────────────────────────────────────────────────────────\n\tconst iconColor = disabled\n\t\t? checked\n\t\t\t? \"rgba(28, 27, 31, 0.38)\"\n\t\t\t: \"rgba(230, 225, 229, 0.38)\"\n\t\t: checked\n\t\t\t? SwitchColors.checkedIcon\n\t\t\t: SwitchColors.uncheckedIcon;\n\n\t// ── State layer ───────────────────────────────────────────────────────────\n\tconst stateLayerColor = checked\n\t\t? SwitchColors.checkedStateLayer\n\t\t: SwitchColors.uncheckedStateLayer;\n\tconst stateLayerOpacity =\n\t\tisPressed || isFocused ? 0.12 : isHovered ? 0.08 : 0;\n\tconst stateLayerX = thumbX + thumbSize / 2 - SwitchTokens.stateLayerSize / 2;\n\n\t// ── Icon visibility ───────────────────────────────────────────────────────\n\tconst showIcon = isIconVisible(\n\t\tthumbContent,\n\t\ticons,\n\t\tshowOnlySelectedIcon,\n\t\tchecked,\n\t);\n\n\t// ── Motion: no animation when reduced ─────────────────────────────────────\n\tconst colorTransition = prefersReduced ? { duration: 0 } : COLOR_TRANSITION;\n\n\tconst stateLayerTransition = prefersReduced\n\t\t? { duration: 0 }\n\t\t: STATE_LAYER_SPRING;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative\"\n\t\t\tstyle={{\n\t\t\t\twidth: SwitchTokens.trackWidth,\n\t\t\t\theight: SwitchTokens.trackHeight,\n\t\t\t}}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{/* Track */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"absolute inset-0 rounded-full\"\n\t\t\t\tstyle={{ borderStyle: \"solid\", opacity: trackOpacity }}\n\t\t\t\tanimate={{\n\t\t\t\t\tbackgroundColor: trackBg,\n\t\t\t\t\tborderColor: trackBorderColor,\n\t\t\t\t\tborderWidth: trackBorderWidth,\n\t\t\t\t}}\n\t\t\t\ttransition={colorTransition}\n\t\t\t/>\n\n\t\t\t{/* State layer — 40dp circle centered on thumb */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"absolute rounded-full pointer-events-none\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: SwitchTokens.stateLayerSize,\n\t\t\t\t\theight: SwitchTokens.stateLayerSize,\n\t\t\t\t\ttop: (SwitchTokens.trackHeight - SwitchTokens.stateLayerSize) / 2,\n\t\t\t\t\tbackgroundColor: stateLayerColor,\n\t\t\t\t}}\n\t\t\t\tanimate={{ x: stateLayerX, opacity: stateLayerOpacity }}\n\t\t\t\ttransition={stateLayerTransition}\n\t\t\t/>\n\n\t\t\t{/* Thumb */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"absolute rounded-full flex items-center justify-center overflow-hidden\"\n\t\t\t\tstyle={{ top: \"50%\", left: 0, y: \"-50%\" }}\n\t\t\t\tanimate={{\n\t\t\t\t\tx: thumbX,\n\t\t\t\t\twidth: thumbSize,\n\t\t\t\t\theight: thumbSize,\n\t\t\t\t\tbackgroundColor: thumbBg,\n\t\t\t\t}}\n\t\t\t\ttransition={\n\t\t\t\t\tprefersReduced\n\t\t\t\t\t\t? { duration: 0 }\n\t\t\t\t\t\t: isPressed\n\t\t\t\t\t\t\t? SNAP_TRANSITION\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tx: FAST_SPATIAL_SPRING,\n\t\t\t\t\t\t\t\t\twidth: FAST_SPATIAL_SPRING,\n\t\t\t\t\t\t\t\t\theight: FAST_SPATIAL_SPRING,\n\t\t\t\t\t\t\t\t\tbackgroundColor: colorTransition,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{/* Icon cross-fade */}\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{showIcon && (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey={checked ? \"icon-on\" : \"icon-off\"}\n\t\t\t\t\t\t\tclassName=\"flex items-center justify-center\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: SwitchTokens.iconSize,\n\t\t\t\t\t\t\t\theight: SwitchTokens.iconSize,\n\t\t\t\t\t\t\t\tcolor: iconColor,\n\t\t\t\t\t\t\t\tfontSize: SwitchTokens.iconSize,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tinitial={prefersReduced ? false : { opacity: 0, scale: 0.5 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={prefersReduced ? {} : { opacity: 0, scale: 0.5 }}\n\t\t\t\t\t\t\ttransition={prefersReduced ? { duration: 0 } : { duration: 0.15 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{thumbContent}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</m.div>\n\t\t</div>\n\t);\n});\n\n// ─── Switch ────────────────────────────────────────────────────────────────────\n\nconst SwitchComponent = React.forwardRef<HTMLButtonElement, SwitchProps>(\n\t(\n\t\t{\n\t\t\tchecked,\n\t\t\tonCheckedChange,\n\t\t\tdisabled = false,\n\t\t\tthumbContent,\n\t\t\ticons = false,\n\t\t\tshowOnlySelectedIcon = false,\n\t\t\tlabel,\n\t\t\tariaLabel,\n\t\t\tclassName,\n\t\t\tcheckedTrackColor,\n\t\t\tuncheckedTrackColor,\n\t\t\tcheckedThumbColor,\n\t\t\tuncheckedThumbColor,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst [isPressed, setIsPressed] = React.useState(false);\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst [isFocused, setIsFocused] = React.useState(false);\n\t\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\t\tconst generatedId = React.useId();\n\t\tconst switchId = label ? `switch-${generatedId}` : undefined;\n\n\t\t// ── Event handlers ────────────────────────────────────────────────────\n\t\tconst handleClick = React.useCallback(() => {\n\t\t\tif (!disabled) onCheckedChange(!checked);\n\t\t}, [disabled, checked, onCheckedChange]);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) return;\n\t\t\t\tif (e.key === \" \" || e.key === \"Enter\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonCheckedChange(!checked);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[disabled, checked, onCheckedChange],\n\t\t);\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) return;\n\t\t\t\tsetIsPressed(true);\n\t\t\t\t// Ripple\n\t\t\t\tconst rect = e.currentTarget.getBoundingClientRect();\n\t\t\t\tconst x = e.clientX - rect.left;\n\t\t\t\tconst y = e.clientY - rect.top;\n\t\t\t\tconst rippleSize = Math.hypot(rect.width, rect.height) * 2;\n\t\t\t\tsetRipples((prev) => [\n\t\t\t\t\t...prev,\n\t\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t\t]);\n\t\t\t},\n\t\t\t[disabled],\n\t\t);\n\n\t\tconst handlePointerUp = React.useCallback(() => {\n\t\t\tsetIsPressed(false);\n\t\t}, []);\n\n\t\tconst handlePointerEnter = React.useCallback(() => {\n\t\t\tif (!disabled) setIsHovered(true);\n\t\t}, [disabled]);\n\n\t\tconst handlePointerLeave = React.useCallback(() => {\n\t\t\tsetIsHovered(false);\n\t\t\tsetIsPressed(false);\n\t\t}, []);\n\n\t\tconst handleFocus = React.useCallback(() => setIsFocused(true), []);\n\t\tconst handleBlur = React.useCallback(() => setIsFocused(false), []);\n\n\t\tconst removeRipple = React.useCallback(\n\t\t\t(id: number) => setRipples((prev) => prev.filter((r) => r.id !== id)),\n\t\t\t[],\n\t\t);\n\n\t\t// ── Shared accessible label ───────────────────────────────────────────\n\t\t// When visible label wraps, aria-label is redundant (label text is\n\t\t// announced via htmlFor linkage). Apply aria-label only when no label.\n\t\tconst buttonAriaLabel = label ? undefined : ariaLabel;\n\n\t\t// ── Switch button ─────────────────────────────────────────────────────\n\t\tconst switchButton = (\n\t\t\t<button\n\t\t\t\tref={ref}\n\t\t\t\tid={switchId}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked={checked}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\taria-label={buttonAriaLabel}\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\tonFocus={handleFocus}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center cursor-pointer select-none\",\n\t\t\t\t\t// Touch target: 48×48 minimum (pad around 32px track)\n\t\t\t\t\t\"min-w-12 min-h-12\",\n\t\t\t\t\t// Focus ring — MD3 FocusIndicatorColor = secondary\n\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2 rounded-full\",\n\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t// Disabled\n\t\t\t\t\tdisabled && \"pointer-events-none cursor-not-allowed\",\n\t\t\t\t\t!label && className,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Overflow clip wrapper for ripple */}\n\t\t\t\t<div className=\"relative overflow-hidden rounded-full\">\n\t\t\t\t\t<SwitchVisual\n\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tisPressed={isPressed}\n\t\t\t\t\t\tisHovered={isHovered}\n\t\t\t\t\t\tisFocused={isFocused}\n\t\t\t\t\t\tthumbContent={thumbContent}\n\t\t\t\t\t\ticons={icons}\n\t\t\t\t\t\tshowOnlySelectedIcon={showOnlySelectedIcon}\n\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\tcheckedTrackColor={checkedTrackColor}\n\t\t\t\t\t\tuncheckedTrackColor={uncheckedTrackColor}\n\t\t\t\t\t\tcheckedThumbColor={checkedThumbColor}\n\t\t\t\t\t\tuncheckedThumbColor={uncheckedThumbColor}\n\t\t\t\t\t/>\n\t\t\t\t\t<Ripple\n\t\t\t\t\t\tripples={ripples}\n\t\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</button>\n\t\t);\n\n\t\t// ── With label ────────────────────────────────────────────────────────\n\t\tconst content = label ? (\n\t\t\t<label\n\t\t\t\thtmlFor={switchId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center gap-3 cursor-pointer select-none\",\n\t\t\t\t\tdisabled && \"cursor-not-allowed pointer-events-none opacity-[0.38]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{switchButton}\n\t\t\t\t<span className=\"text-sm leading-none text-(--md-sys-color-on-surface)\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t) : (\n\t\t\tswitchButton\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t{content}\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nSwitchComponent.displayName = \"Switch\";\n\n/**\n * MD3 Expressive Switch component.\n *\n * Toggles a single item on or off. Implements the ARIA switch pattern\n * (`role=\"switch\"`) without `<input>`. Fully animated per MD3 spec:\n * thumb translation, size morph (16→24→28px), state layer, and icon cross-fade.\n *\n * @example\n * ```tsx\n * <Switch checked={isOn} onCheckedChange={setIsOn} label=\"Wi-Fi\" />\n * <Switch checked={isOn} onCheckedChange={setIsOn} icons thumbContent={<CheckIcon />} />\n * <Switch checked={isOn} onCheckedChange={setIsOn} disabled />\n * ```\n *\n * @see https://m3.material.io/components/switch/overview\n */\nexport const Switch = React.memo(SwitchComponent);\n","/**\n * @file tabs.tsx\n * MD3 Expressive Tabs — Root context provider and state manager.\n * Implements compound component pattern (similar to Radix UI).\n * Spec: https://m3.material.io/components/tabs/overview\n */\n\nimport { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { TabsContextValue, TabsProps } from \"./tabs.types\";\n\n// ─── Context ───────────────────────────────────────────────────────────────────\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\n/**\n * Hook to consume the Tabs context.\n * Throws if used outside a `<Tabs>` root.\n * @internal\n */\nexport function useTabsContext(): TabsContextValue {\n\tconst ctx = React.useContext(TabsContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"[MD3 Tabs] Component must be used within a <Tabs> root. \" +\n\t\t\t\t\"Ensure <TabsList>, <Tab>, and <TabsContent> are descendants of <Tabs>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n// ─── Tabs Root ─────────────────────────────────────────────────────────────────\n\nconst TabsComponent = React.forwardRef<HTMLDivElement, TabsProps>(\n\t(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue = \"\",\n\t\t\tonValueChange,\n\t\t\tautoActivate = false,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\t// ── State: selected value (controlled + uncontrolled) ──────────────────\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue);\n\t\tconst isControlled = controlledValue !== undefined;\n\t\tconst value = isControlled ? controlledValue : internalValue;\n\n\t\tconst handleValueChange = React.useCallback(\n\t\t\t(newValue: string) => {\n\t\t\t\tif (!isControlled) setInternalValue(newValue);\n\t\t\t\tonValueChange?.(newValue);\n\t\t\t},\n\t\t\t[isControlled, onValueChange],\n\t\t);\n\n\t\t// ── State: keyboard focus (roving tabindex) ────────────────────────────\n\t\t// focusedValue is separate from `value` so focus can move without selecting.\n\t\tconst [focusedValue, setFocusedValue] = React.useState(value);\n\n\t\t// Sync focusedValue when controlled value changes externally\n\t\tReact.useEffect(() => {\n\t\t\tsetFocusedValue(value);\n\t\t}, [value]);\n\n\t\t// ── Registered tabs registry ───────────────────────────────────────────\n\t\t// Tabs register/unregister themselves to enable ArrowKey navigation.\n\t\tconst [tabValues, setTabValues] = React.useState<string[]>([]);\n\n\t\tconst registerTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => {\n\t\t\t\tif (prev.includes(tabValue)) return prev;\n\t\t\t\treturn [...prev, tabValue];\n\t\t\t});\n\t\t}, []);\n\n\t\tconst unregisterTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => prev.filter((v) => v !== tabValue));\n\t\t}, []);\n\n\t\t// ── Auto-select first enabled tab when no defaultValue is provided ─────\n\t\t// Mirrors Google's behavior: if no tab is active, select the first one.\n\t\tconst hasAutoSelected = React.useRef(false);\n\n\t\t// ── Disabled tab tracking ──────────────────────────────────────────────\n\t\tconst [disabledValues, setDisabledValues] = React.useState<Set<string>>(\n\t\t\tnew Set(),\n\t\t);\n\n\t\tconst markTabDisabled = React.useCallback(\n\t\t\t(tabValue: string, disabled: boolean) => {\n\t\t\t\tsetDisabledValues((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tif (disabled) {\n\t\t\t\t\t\tnext.add(tabValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext.delete(tabValue);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\t// Auto-select first enabled tab if no value is set\n\t\tReact.useEffect(() => {\n\t\t\tif (isControlled || hasAutoSelected.current || tabValues.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value && tabValues.includes(value)) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst firstEnabled = tabValues.find((v) => !disabledValues.has(v));\n\t\t\tif (firstEnabled) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\tsetInternalValue(firstEnabled);\n\t\t\t\tsetFocusedValue(firstEnabled);\n\t\t\t}\n\t\t}, [tabValues, disabledValues, isControlled, value]);\n\n\t\t// ── Unique layout group ID for Framer Motion ───────────────────────────\n\t\tconst id = React.useId();\n\t\tconst layoutGroupId = `tabs-${id}`;\n\n\t\t// ── Context value ──────────────────────────────────────────────────────\n\t\tconst contextValue = React.useMemo<TabsContextValue>(\n\t\t\t() => ({\n\t\t\t\tvalue,\n\t\t\t\tonValueChange: handleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\tsetFocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tvalue,\n\t\t\t\thandleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<TabsContext.Provider value={contextValue}>\n\t\t\t\t\t<div ref={ref} className={cn(\"w-full\", className)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</TabsContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nTabsComponent.displayName = \"Tabs\";\n\n/**\n * MD3 Expressive Tabs root component.\n *\n * Manages tab selection state and provides context to all\n * compound sub-components. Supports both controlled and\n * uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Tabs defaultValue=\"flights\">\n * <TabsList variant=\"primary\">\n * <Tab value=\"flights\">Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * </TabsList>\n * <TabsContent value=\"flights\">Flight content</TabsContent>\n * <TabsContent value=\"trips\">Trip content</TabsContent>\n * </Tabs>\n *\n * // Controlled\n * const [tab, setTab] = useState(\"flights\");\n * <Tabs value={tab} onValueChange={setTab}>...</Tabs>\n *\n * // Auto-activate mode (focus = select)\n * <Tabs defaultValue=\"flights\" autoActivate>...</Tabs>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n */\nexport const Tabs = React.memo(TabsComponent);\n\n// ─── TabsListContext ───────────────────────────────────────────────────────────\n\n/**\n * Secondary context carrying variant + scrollable from <TabsList>.\n * Separate from TabsContext so Tabs root doesn't need these props —\n * they belong to the list, not the root.\n * @internal\n */\nexport interface TabsListContextValue {\n\tvariant: \"primary\" | \"secondary\";\n\tscrollable: boolean;\n}\n\nexport const TabsListContext = React.createContext<TabsListContextValue | null>(\n\tnull,\n);\n\n/**\n * Hook to consume TabsList-level context (variant, scrollable).\n * @internal\n */\nexport function useTabsListContext(): TabsListContextValue {\n\tconst ctx = React.useContext(TabsListContext);\n\t// Fallback to sensible defaults instead of throwing, since\n\t// Tab might be rendered without explicit context in tests.\n\treturn ctx ?? { variant: \"primary\", scrollable: false };\n}\n","/**\n * @file tabs.tokens.ts\n * MD3 Expressive Tabs — Design tokens ported from:\n * - PrimaryNavigationTabTokens.kt (v0_162)\n * - SecondaryNavigationTabTokens.kt (v0_162)\n *\n * All dimensional values are in px (dp equivalent for web).\n * @see docs/m3/tabs/PrimaryNavigationTabTokens.kt\n * @see docs/m3/tabs/SecondaryNavigationTabTokens.kt\n */\n\n/**\n * Dimensional design tokens for the MD3 Tabs component.\n *\n * Maps directly from the `.kt` token files to CSS/JS values.\n * Use as the single source of truth for sizing.\n */\nexport const TabsTokens = {\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** ContainerHeight = 48dp (text-only tab) */\n\tcontainerHeight: 48,\n\t/** IconAndLabelTextContainerHeight = 64dp (tab with icon + label stacked) */\n\tcontainerHeightWithIcon: 64,\n\n\t// ── Indicator ─────────────────────────────────────────────────────────────\n\t/** ActiveIndicatorHeight (Primary) = 3dp */\n\tprimaryIndicatorHeight: 3,\n\t/** ActiveIndicatorHeight (Secondary) = 2dp */\n\tsecondaryIndicatorHeight: 2,\n\t/**\n\t * ActiveIndicatorShape = 3dp top-left and top-right (per MD3 token, not a full pill).\n\t * Google reference: `var(--_active-indicator-shape)` resolves to `3px 3px 0 0` effectively.\n\t */\n\tindicatorBorderRadius: \"3px 3px 0 0\",\n\n\t// ── Icon ──────────────────────────────────────────────────────────────────\n\t/** IconSize = 24dp */\n\ticonSize: 24,\n\n\t// ── Scrollable layout ─────────────────────────────────────────────────────\n\t/**\n\t * Edge start/end padding for scrollable mode = 52px.\n\t * Per MD3 spec: tabs have padding on both leading and trailing edges.\n\t */\n\tscrollableEdgePadding: 52,\n\t/** Minimum tab width in scrollable mode = 90px. */\n\tscrollableMinTabWidth: 90,\n\n\t// ── Divider (Secondary only) ───────────────────────────────────────────────\n\t/** DividerHeight = 1dp */\n\tdividerHeight: 1,\n\n\t// ── Focus ring ────────────────────────────────────────────────────────────\n\t/**\n\t * Focus ring border-radius = 8px.\n\t * Google reference: `focus-ring.theme({ shape: 8px })` in _tab.scss.\n\t */\n\tfocusRingBorderRadius: 8,\n} as const;\n\n// ── MD3 Color token references (CSS custom properties) ────────────────────────\n\n/**\n * CSS custom property references for Tabs colors.\n * Maps to `--md-sys-color-*` tokens in the MD3 theme system.\n *\n * DO NOT hardcode hex values — use these references for automatic\n * light/dark theme adaptation.\n */\nexport const TabsColors = {\n\t// ── Primary variant ───────────────────────────────────────────────────────\n\t/** Primary: ActiveLabelTextColor / ActiveIconColor = Primary */\n\tprimaryActiveText: \"var(--md-sys-color-primary)\",\n\t/** Primary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tprimaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Primary: ActiveIndicatorColor = Primary */\n\tprimaryIndicator: \"var(--md-sys-color-primary)\",\n\n\t// ── Secondary variant ─────────────────────────────────────────────────────\n\t/** Secondary: ActiveLabelTextColor / ActiveIconColor = OnSurface */\n\tsecondaryActiveText: \"var(--md-sys-color-on-surface)\",\n\t/** Secondary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tsecondaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Secondary: Indicator color = Primary (same as primary variant) */\n\tsecondaryIndicator: \"var(--md-sys-color-primary)\",\n\t/** Secondary: DividerColor = SurfaceVariant */\n\tdivider: \"var(--md-sys-color-surface-variant)\",\n\n\t// ── Shared ────────────────────────────────────────────────────────────────\n\t/** ContainerColor = Surface */\n\tcontainer: \"var(--md-sys-color-surface)\",\n\t/** Focus ring indicator = Secondary */\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n\n\t// ── State overlays ────────────────────────────────────────────────────────\n\t/** Hover state layer (primary active) */\n\tprimaryActiveHover: \"var(--md-sys-color-primary)\",\n\t/** Hover state layer (inactive, both variants) */\n\tinactiveHover: \"var(--md-sys-color-on-surface)\",\n} as const;\n\n// ── Animation constants ────────────────────────────────────────────────────────\n\n/** Spring transition for the sliding indicator (FastSpatial equivalent). */\nexport const TABS_INDICATOR_SPRING = {\n\ttype: \"spring\",\n\tstiffness: 500,\n\tdamping: 40,\n} as const;\n\n/** Color transition for label/icon color animate (active ↔ inactive). */\nexport const TABS_COLOR_TRANSITION = {\n\tduration: 0.2,\n\tease: \"easeInOut\",\n} as const;\n\n/** Content fade transition when switching tabs. */\nexport const TABS_CONTENT_TRANSITION = {\n\tduration: 0.15,\n\tease: \"easeInOut\",\n} as const;\n","/**\n * @file tab.tsx\n * MD3 Expressive Tab — Individual tab button with Framer Motion indicator.\n *\n * Design decisions:\n * 1. PRIMARY indicator nested inside content wrapper → width = content width (not full button).\n * 2. SECONDARY indicator outside content wrapper → `inset-x-0` = full button width.\n * 3. ROVING TABINDEX (WAI-ARIA): only focused tab has tabIndex=0; ArrowKey moves focus, Enter/Space selects.\n * 4. DISABLED tabs are skipped in ArrowKey navigation.\n * 5. RTL: ArrowLeft/Right directions are swapped when `direction: rtl` is detected.\n * 6. INLINE ICON: icon beside label, height stays 48dp (stacked = 64dp).\n * 7. AUTO-ACTIVATE: when parent `<Tabs autoActivate>`, ArrowKey also selects.\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { BadgedBox } from \"../badge\";\nimport { useTabsContext, useTabsListContext } from \"./tabs\";\nimport {\n\tTABS_COLOR_TRANSITION,\n\tTABS_INDICATOR_SPRING,\n\tTabsColors,\n\tTabsTokens,\n} from \"./tabs.tokens\";\nimport type { TabProps } from \"./tabs.types\";\n\n// ─── Constants ──────────────────────────────────────────────────────────────────\n\n/** Minimum indicator width per MD3 spec (24dp). */\nconst INDICATOR_MIN_WIDTH = 24;\n\n// ─── Tab ───────────────────────────────────────────────────────────────────────\n\nconst TabComponent = React.forwardRef<HTMLButtonElement, TabProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\ticon,\n\t\t\tinlineIcon = false,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tvalue: selectedValue,\n\t\t\tonValueChange,\n\t\t\tfocusedValue,\n\t\t\tsetFocusedValue,\n\t\t\ttabValues,\n\t\t\tregisterTab,\n\t\t\tunregisterTab,\n\t\t\tlayoutGroupId,\n\t\t\tdisabledValues,\n\t\t\tmarkTabDisabled,\n\t\t\tautoActivate,\n\t\t} = useTabsContext();\n\n\t\tconst { variant, scrollable } = useTabsListContext();\n\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst isActive = selectedValue === value;\n\t\tconst isFocused = focusedValue === value;\n\t\tconst hasIcon = icon != null;\n\t\tconst isStackedIcon = hasIcon && !inlineIcon;\n\n\t\t// ── Refs ───────────────────────────────────────────────────────────────\n\t\tconst buttonRef = React.useRef<HTMLButtonElement | null>(null);\n\t\tconst isFirstMount = React.useRef(true);\n\n\t\t// Merge forwarded ref with internal ref\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLButtonElement | null) => {\n\t\t\t\tbuttonRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\t// ── Register/unregister with parent context on mount/unmount ──────────\n\t\tReact.useEffect(() => {\n\t\t\tregisterTab(value);\n\t\t\treturn () => unregisterTab(value);\n\t\t}, [value, registerTab, unregisterTab]);\n\n\t\t// ── Sync disabled state with parent context ────────────────────────────\n\t\tReact.useEffect(() => {\n\t\t\tmarkTabDisabled(value, disabled);\n\t\t\treturn () => markTabDisabled(value, false);\n\t\t}, [value, disabled, markTabDisabled]);\n\n\t\t// ── Keyboard navigation ────────────────────────────────────────────────\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tconst isRtl = buttonRef.current\n\t\t\t\t\t? getComputedStyle(buttonRef.current).direction === \"rtl\"\n\t\t\t\t\t: false;\n\n\t\t\t\tconst enabledValues = tabValues.filter((v) => !disabledValues.has(v));\n\t\t\t\tconst currentIndex = enabledValues.indexOf(value);\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tcase \"ArrowLeft\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst goForward = isRtl\n\t\t\t\t\t\t\t? e.key === \"ArrowLeft\"\n\t\t\t\t\t\t\t: e.key === \"ArrowRight\";\n\t\t\t\t\t\tconst nextIndex = goForward\n\t\t\t\t\t\t\t? (currentIndex + 1) % enabledValues.length\n\t\t\t\t\t\t\t: (currentIndex - 1 + enabledValues.length) %\n\t\t\t\t\t\t\t\tenabledValues.length;\n\t\t\t\t\t\tconst nextValue = enabledValues[nextIndex];\n\t\t\t\t\t\tif (nextValue) {\n\t\t\t\t\t\t\tsetFocusedValue(nextValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(nextValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Home\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst firstValue = enabledValues[0];\n\t\t\t\t\t\tif (firstValue) {\n\t\t\t\t\t\t\tsetFocusedValue(firstValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(firstValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"End\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst lastValue = enabledValues[enabledValues.length - 1];\n\t\t\t\t\t\tif (lastValue) {\n\t\t\t\t\t\t\tsetFocusedValue(lastValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(lastValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Enter\":\n\t\t\t\t\tcase \" \": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (!disabled) onValueChange(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\ttabValues,\n\t\t\t\tdisabledValues,\n\t\t\t\tvalue,\n\t\t\t\tdisabled,\n\t\t\t\tsetFocusedValue,\n\t\t\t\tonValueChange,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\t// Focus DOM node when focusedValue changes via keyboard (skip initial mount)\n\t\tReact.useEffect(() => {\n\t\t\tif (isFirstMount.current) {\n\t\t\t\tisFirstMount.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isFocused && buttonRef.current) {\n\t\t\t\tbuttonRef.current.focus({ preventScroll: true });\n\t\t\t}\n\t\t}, [isFocused]);\n\n\t\t// ── Auto-scroll active tab into view (scrollable mode) ─────────────────\n\t\t// Horizontally scrolls the nearest overflow-x container to reveal the\n\t\t// active tab. Uses scrollTo (not scrollIntoView) to avoid vertical page jumps.\n\t\tReact.useEffect(() => {\n\t\t\tif (!isActive || !scrollable || !buttonRef.current) return;\n\n\t\t\tconst btn = buttonRef.current;\n\t\t\tlet container: HTMLElement | null = btn.parentElement;\n\t\t\twhile (container) {\n\t\t\t\tconst { overflowX } = getComputedStyle(container);\n\t\t\t\tif (overflowX === \"auto\" || overflowX === \"scroll\") break;\n\t\t\t\tcontainer = container.parentElement;\n\t\t\t}\n\t\t\tif (!container) return;\n\n\t\t\tconst btnRect = btn.getBoundingClientRect();\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tconst overflowLeft = containerRect.left - btnRect.left;\n\t\t\tconst overflowRight = btnRect.right - containerRect.right;\n\n\t\t\tif (overflowLeft > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft - overflowLeft,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t} else if (overflowRight > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft + overflowRight,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t}\n\t\t}, [isActive, scrollable]);\n\n\t\t// ── Derived tokens ─────────────────────────────────────────────────────\n\t\tconst containerHeight = isStackedIcon\n\t\t\t? TabsTokens.containerHeightWithIcon\n\t\t\t: TabsTokens.containerHeight;\n\n\t\tconst activeColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryActiveText\n\t\t\t\t: TabsColors.secondaryActiveText;\n\n\t\tconst inactiveColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryInactiveText\n\t\t\t\t: TabsColors.secondaryInactiveText;\n\n\t\tconst indicatorColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryIndicator\n\t\t\t\t: TabsColors.secondaryIndicator;\n\n\t\tconst indicatorLayoutId = `${layoutGroupId}-indicator`;\n\n\t\tconst colorTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_COLOR_TRANSITION;\n\t\tconst springTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_INDICATOR_SPRING;\n\n\t\t// ── IDs for ARIA wiring ────────────────────────────────────────────────\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\t// ── Content wrapper layout ─────────────────────────────────────────────\n\t\t// inlineIcon → flex-row; stacked icon → flex-col gap-0.5; text only → flex-col\n\t\tconst contentFlexClass = inlineIcon\n\t\t\t? \"flex-row gap-2\"\n\t\t\t: isStackedIcon\n\t\t\t\t? \"flex-col gap-0.5\"\n\t\t\t\t: \"flex-col gap-0\";\n\n\t\t// Badge placement\n\t\tconst shouldWrapIconWithBadge = isStackedIcon && badge != null;\n\t\tconst shouldAppendInlineBadge = !isStackedIcon && badge != null;\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={mergedRef}\n\t\t\t\tid={tabId}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"tab\"\n\t\t\t\taria-selected={isActive}\n\t\t\t\taria-controls={panelId}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttabIndex={isFocused ? 0 : -1}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\tonValueChange(value);\n\t\t\t\t\t\tsetFocusedValue(value);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonFocus={() => setFocusedValue(value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center\",\n\t\t\t\t\t\"cursor-pointer select-none\",\n\t\t\t\t\tscrollable ? \"shrink-0\" : \"flex-1\",\n\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\"focus-visible:rounded-lg\",\n\t\t\t\t\t\"rounded-none\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\theight: containerHeight,\n\t\t\t\t\tzIndex: isActive ? 1 : 0,\n\t\t\t\t\t...(scrollable && { minWidth: TabsTokens.scrollableMinTabWidth }),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/*\n\t\t\t\t * Content wrapper — PRIMARY INDICATOR TECHNIQUE:\n\t\t\t\t * Indicator lives inside this wrapper → width matches content (not button).\n\t\t\t\t * inlineIcon: flex-row places icon beside label, height stays 48dp.\n\t\t\t\t */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex h-full items-center justify-center\",\n\t\t\t\t\t\tcontentFlexClass,\n\t\t\t\t\t)}\n\t\t\t\t\tanimate={{ color: isActive ? activeColor : inactiveColor }}\n\t\t\t\t\ttransition={colorTransition}\n\t\t\t\t>\n\t\t\t\t\t{/* Icon (optional) — 24dp per MD3 token */}\n\t\t\t\t\t{hasIcon && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\taria-hidden={!shouldWrapIconWithBadge ? \"true\" : undefined}\n\t\t\t\t\t\t\tclassName={cn(\"flex shrink-0 items-center justify-center\")}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: TabsTokens.iconSize,\n\t\t\t\t\t\t\t\theight: TabsTokens.iconSize,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{shouldWrapIconWithBadge ? (\n\t\t\t\t\t\t\t\t<BadgedBox badge={badge}>\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">{icon}</span>\n\t\t\t\t\t\t\t\t</BadgedBox>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span className=\"size-full\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Label text — TitleSmall per MD3 typography token */}\n\t\t\t\t\t<span className=\"text-title-sm font-medium whitespace-nowrap\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Inline Badge */}\n\t\t\t\t\t{shouldAppendInlineBadge && (\n\t\t\t\t\t\t<span className=\"ml-1 flex items-center justify-center\">\n\t\t\t\t\t\t\t{badge}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/*\n\t\t\t\t\t * PRIMARY INDICATOR\n\t\t\t\t\t * Inside content wrapper → width matches content.\n\t\t\t\t\t * `layoutId` enables shared layout animation across tabs.\n\t\t\t\t\t */}\n\t\t\t\t\t{variant === \"primary\" && isActive && (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-1/2 -translate-x-1/2\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: TabsTokens.primaryIndicatorHeight,\n\t\t\t\t\t\t\t\tminWidth: INDICATOR_MIN_WIDTH,\n\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</m.div>\n\n\t\t\t\t{/*\n\t\t\t\t * SECONDARY INDICATOR\n\t\t\t\t * Outside content wrapper → `inset-x-0` = full button width.\n\t\t\t\t */}\n\t\t\t\t{variant === \"secondary\" && isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"absolute bottom-0 inset-x-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: TabsTokens.secondaryIndicatorHeight,\n\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\n\nTabComponent.displayName = \"Tab\";\n\n/**\n * MD3 Expressive Tab component — individual tab button.\n *\n * Must be a direct child of `<TabsList>`. Implements WAI-ARIA Tabs pattern\n * with roving tabindex keyboard navigation.\n *\n * - **Primary variant**: indicator width = content (text + icon) width.\n * - **Secondary variant**: indicator width = full button hit area.\n * - **Disabled**: Skipped entirely in ArrowKey navigation (cannot be focused).\n * - **inlineIcon**: Icon beside (not above) label; height stays 48dp.\n * - Framer Motion `layoutId` animates indicator with spring physics.\n * - ArrowLeft/Right respect RTL direction automatically.\n *\n * @example\n * ```tsx\n * <Tab value=\"flights\" icon={<Icon name=\"flight\" />}>Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * <Tab value=\"explore\" disabled>Explore</Tab>\n * <Tab value=\"hotels\" icon={<Icon name=\"hotel\" />} inlineIcon>Hotels</Tab>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const Tab = React.memo(TabComponent);\n","/**\n * @file tabs-content.tsx\n * MD3 Expressive TabsContent — Animated panel component.\n *\n * Implements WAI-ARIA tabpanel role with:\n * - AnimatePresence for fade transition on tab switch\n * - Proper aria-labelledby pointing to the associated <Tab>\n * - tabIndex=0 so keyboard users can Tab from the tablist into the panel\n * - Hidden panels are removed from the DOM (not just visually hidden)\n * to prevent screen readers from reading inactive content\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useTabsContext } from \"./tabs\";\nimport { TABS_CONTENT_TRANSITION } from \"./tabs.tokens\";\nimport type { TabsContentProps } from \"./tabs.types\";\n\n// ─── TabsContent ───────────────────────────────────────────────────────────────\n\nconst TabsContentComponent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n\t({ value, className, children }, ref) => {\n\t\tconst { value: selectedValue, layoutGroupId } = useTabsContext();\n\t\tconst isActive = selectedValue === value;\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\t// ARIA wiring: panel is labelled by its corresponding <Tab> button\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\tconst contentTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_CONTENT_TRANSITION;\n\n\t\treturn (\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t{isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tid={panelId}\n\t\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\t\taria-labelledby={tabId}\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"focus:outline-none w-full\",\n\t\t\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={contentTransition}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\n\nTabsContentComponent.displayName = \"TabsContent\";\n\n/**\n * MD3 Expressive TabsContent panel component.\n *\n * Each panel corresponds to a `<Tab>` with the same `value`.\n * Only the active panel is rendered in the DOM — inactive panels\n * are fully unmounted (not `display: none`) to prevent screen readers\n * from reading hidden content.\n *\n * Fade animation is applied on both enter and exit via Framer Motion\n * `AnimatePresence`. We use `mode=\"popLayout\"` to prevent height layout shifting\n * during tab transitions. Animation is automatically disabled when the user\n * has enabled `prefers-reduced-motion`.\n *\n * @example\n * ```tsx\n * <TabsContent value=\"flights\">\n * <p>Available flights...</p>\n * </TabsContent>\n * ```\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const TabsContent = React.memo(TabsContentComponent);\n","/**\n * @file tabs-list.tsx\n * MD3 Expressive TabsList — Container component for tab buttons.\n *\n * Responsibilities:\n * - Applies variant (primary/secondary) layout and styling\n * - Manages horizontal scroll for scrollable mode (52px edge padding per MD3)\n * - Renders the bottom divider for secondary variant\n * - Scopes Framer Motion LayoutGroup so indicators animate correctly\n * when multiple <Tabs> instances are on the same page\n * - Restores focus to activeTab when keyboard focus leaves the tablist\n * (matches Google's `focusout` handler on <md-tabs>)\n */\n\nimport { LayoutGroup } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { TabsListContext, useTabsContext } from \"./tabs\";\nimport { TabsTokens } from \"./tabs.tokens\";\nimport type { TabsListProps } from \"./tabs.types\";\n\n// ─── TabsList ──────────────────────────────────────────────────────────────────\n\nconst TabsListComponent = React.forwardRef<HTMLDivElement, TabsListProps>(\n\t(\n\t\t{\n\t\t\tvariant,\n\t\t\tscrollable = false,\n\t\t\tbackgroundColor,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { layoutGroupId, value, setFocusedValue } = useTabsContext();\n\n\t\t// Unique layout group ID scoped to this TabsList instance.\n\t\tconst listLayoutId = `${layoutGroupId}-list`;\n\n\t\t// ── TabsListContext: provide variant + scrollable to children ──────────\n\t\tconst listContextValue = React.useMemo(\n\t\t\t() => ({ variant, scrollable }),\n\t\t\t[variant, scrollable],\n\t\t);\n\n\t\t// ── Background color ───────────────────────────────────────────────────\n\t\tconst bgColor = backgroundColor ?? \"var(--md-sys-color-surface)\";\n\n\t\t// ── Focusout handler — restore roving focus to active tab ──────────────\n\t\t// When keyboard focus leaves the tablist entirely (e.g. user presses Tab\n\t\t// to move to the panel), reset `focusedValue` back to the selected tab.\n\t\t// This ensures the next time the user Tabs back into the tablist, focus\n\t\t// lands on the active tab — not the last arrow-key-focused tab.\n\t\t// Mirrors Google's `handleFocusout` in tabs.ts:\n\t\t// \"restore focus to selected item when blurring the tab bar\"\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLDivElement>) => {\n\t\t\t\t// `relatedTarget` is the element receiving focus.\n\t\t\t\t// If it's still inside the tablist, this is an internal focus move\n\t\t\t\t// (e.g. clicking another tab) — don't restore.\n\t\t\t\tconst listEl = e.currentTarget;\n\t\t\t\tif (listEl.contains(e.relatedTarget as Node | null)) return;\n\n\t\t\t\t// Focus left the tablist — restore focusedValue to the active tab.\n\t\t\t\tsetFocusedValue(value);\n\t\t\t},\n\t\t\t[value, setFocusedValue],\n\t\t);\n\n\t\treturn (\n\t\t\t<TabsListContext.Provider value={listContextValue}>\n\t\t\t\t{/* LayoutGroup scopes shared layout animation so indicators from different Tabs instances don't bleed into each other. */}\n\t\t\t\t<LayoutGroup id={listLayoutId}>\n\t\t\t\t\t{/* Outer wrapper: positioning context for the secondary divider */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\t\t\tstyle={{ backgroundColor: bgColor }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-row items-stretch\",\n\t\t\t\t\t\t\t\tscrollable &&\n\t\t\t\t\t\t\t\t\t\"overflow-x-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tscrollable\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Secondary variant: bottom divider — absolute so it doesn't affect tab layout flow */}\n\t\t\t\t\t\t{variant === \"secondary\" && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-0 right-0\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\theight: TabsTokens.dividerHeight,\n\t\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-surface-variant)\",\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</div>\n\t\t\t\t</LayoutGroup>\n\t\t\t</TabsListContext.Provider>\n\t\t);\n\t},\n);\n\nTabsListComponent.displayName = \"TabsList\";\n\n/**\n * MD3 Expressive TabsList container component.\n *\n * Renders a horizontal row of `<Tab>` components with MD3-compliant\n * layout (fixed or scrollable) and variant styling (primary or secondary).\n *\n * - **Primary**: Tabs divide available width equally, indicator width = content width.\n * - **Secondary**: Tabs divide equally + full-width indicator + bottom divider line.\n * - **Scrollable**: Tabs have min-width (90px), scroll horizontally with 52px edge padding.\n * - **Focusout**: When focus leaves the tablist, roving focus resets to the active tab.\n *\n * @example\n * ```tsx\n * <TabsList variant=\"primary\" scrollable={false}>\n * <Tab value=\"tab1\">Tab 1</Tab>\n * <Tab value=\"tab2\">Tab 2</Tab>\n * </TabsList>\n *\n * <TabsList variant=\"secondary\" scrollable={true} aria-label=\"Content sections\">\n * <Tab value=\"a\">Alpha</Tab>\n * <Tab value=\"b\">Beta</Tab>\n * </TabsList>\n * ```\n */\nexport const TabsList = React.memo(TabsListComponent);\n","/**\n * @file text-field.tokens.ts\n * MD3 design token mapping for the TextField component.\n *\n * All color values reference CSS custom properties defined by the MD3 theme.\n * Do NOT use raw hex values — always use CSS variables.\n *\n * @see https://m3.material.io/components/text-fields/specs\n */\n\n// ─── Color Tokens ────────────────────────────────────────────────────────────\n\nexport const TF_COLORS = {\n\t/** Filled container background */\n\tfilledBg: \"var(--color-m3-surface-container-highest)\",\n\t/** Input text color */\n\tinputText: \"var(--color-m3-on-surface)\",\n\t/** Label (unfloated) + icons + prefix/suffix + supporting text */\n\tonSurfaceVariant: \"var(--color-m3-on-surface-variant)\",\n\t/** Focused active indicator / outline, floated label */\n\tprimary: \"var(--color-m3-primary)\",\n\t/** Error indicator / outline / label / icon / supporting text */\n\terror: \"var(--color-m3-error)\",\n\t/** Outlined border (enabled) */\n\toutline: \"var(--color-m3-outline)\",\n\t/** Transparent */\n\ttransparent: \"transparent\",\n} as const;\n\n// ─── Size Tokens ──────────────────────────────────────────────────────────────\n\nexport const TF_SIZE = {\n\t/** Container height — normal */\n\theight: 56,\n\t/** Container height — dense variant */\n\tdenseHeight: 48,\n\t/** Active indicator height — enabled */\n\tindicatorThin: 1,\n\t/** Active indicator height — focused */\n\tindicatorThick: 2,\n\t/** Outline stroke width — enabled */\n\toutlineThin: 1,\n\t/** Outline stroke width — focused */\n\toutlineThick: 2,\n\t/** Corner radius — all variants */\n\tcornerRadius: 4,\n\t/** Leading/Trailing icon size */\n\ticonSize: 24,\n\t/** Padding inline start (no leading icon) */\n\tpaddingStart: 16,\n\t/** Padding inline start (with leading icon) */\n\tpaddingStartWithIcon: 12,\n\t/** Padding inline end */\n\tpaddingEnd: 16,\n\t/** Padding inline end (with trailing icon) */\n\tpaddingEndWithIcon: 12,\n\t/** Notch extra padding per side on outlined label gap */\n\tnotchPadding: 4,\n} as const;\n\n// ─── Typography Tokens ────────────────────────────────────────────────────────\n\nexport const TF_TYPOGRAPHY = {\n\t/** Body Large — input text, unfloated label */\n\tbodyLargePx: 16,\n\t/** Body Small — floated label, supporting text, counter */\n\tbodySmallPx: 12,\n\t/** Scale ratio when label floats: 12/16 = 0.75 */\n\tlabelScaleRatio: 12 / 16,\n} as const;\n\n// ─── Tailwind Class Snippets ──────────────────────────────────────────────────\n\n/**\n * Tailwind utility classes for key TextField elements.\n * Use via cn() — do NOT use these as standalone strings without merging.\n */\nexport const TF_CLASSES = {\n\t// Container\n\tfilledContainer:\n\t\t\"bg-[var(--color-m3-surface-container-highest)] rounded-tl-[4px] rounded-tr-[4px] rounded-bl-none rounded-br-none\",\n\toutlinedContainer: \"bg-transparent rounded-[4px]\",\n\n\t// Input\n\tinput:\n\t\t\"bg-transparent outline-none w-full text-base text-[var(--color-m3-on-surface)] caret-[var(--color-m3-primary)] placeholder:text-[var(--color-m3-on-surface-variant)]\",\n\tinputNoSpinner:\n\t\t\"[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\",\n\n\t// States\n\tdisabled: \"opacity-[0.38] pointer-events-none cursor-not-allowed\",\n\n\t// Supporting text\n\tsupportingText: \"text-xs text-[var(--color-m3-on-surface-variant)] px-4\",\n\terrorText: \"text-xs text-[var(--color-m3-error)] px-4\",\n\n\t// Prefix / Suffix\n\tprefixSuffix:\n\t\t\"text-base text-[var(--color-m3-on-surface-variant)] select-none shrink-0\",\n\n\t// State layer (hover)\n\tstateLayer:\n\t\t\"absolute inset-0 bg-[var(--color-m3-on-surface)] opacity-0 transition-opacity duration-150 pointer-events-none rounded-[inherit]\",\n} as const;\n","/**\n * @file active-indicator.tsx\n * Animated bottom border line for the MD3 Filled TextField.\n * Expands height from 1px → 2px and color changes on focus.\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tMD3_INDICATOR_DURATION,\n\tMD3_STANDARD_EASING,\n} from \"../../shared/constants\";\nimport { TF_COLORS, TF_SIZE } from \"../text-field.tokens\";\n\nexport interface ActiveIndicatorProps {\n\tisFocused: boolean;\n\tisError: boolean;\n\tisDisabled: boolean;\n\tisHovered: boolean;\n\tprefersReduced: boolean;\n}\n\n/**\n * MD3 Active Indicator — the bottom border line for Filled TextField.\n *\n * Animates:\n * - `height`: 1px (enabled) → 2px (focused)\n * - `backgroundColor`: on-surface-variant → primary (focused) → error\n * - `scaleX`: 0 → 1 expanding from center on focus in\n *\n * @see https://m3.material.io/components/text-fields/specs#filled-text-field\n */\nexport const ActiveIndicator = React.memo(function ActiveIndicator({\n\tisFocused,\n\tisError,\n\tisDisabled,\n\tisHovered,\n\tprefersReduced,\n}: ActiveIndicatorProps) {\n\tconst duration = prefersReduced ? 0 : MD3_INDICATOR_DURATION;\n\tconst ease = MD3_STANDARD_EASING;\n\n\tconst height =\n\t\tisFocused || isError ? TF_SIZE.indicatorThick : TF_SIZE.indicatorThin;\n\n\tlet backgroundColor: string;\n\tif (isError) {\n\t\tbackgroundColor = TF_COLORS.error;\n\t} else if (isFocused) {\n\t\tbackgroundColor = TF_COLORS.primary;\n\t} else if (isHovered && !isDisabled) {\n\t\tbackgroundColor = TF_COLORS.inputText;\n\t} else {\n\t\tbackgroundColor = TF_COLORS.onSurfaceVariant;\n\t}\n\n\treturn (\n\t\t<m.div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute bottom-0 left-0 right-0 origin-center\"\n\t\t\tanimate={{ height, backgroundColor }}\n\t\t\ttransition={{ duration, ease }}\n\t\t/>\n\t);\n});\n\nActiveIndicator.displayName = \"ActiveIndicator\";\n","/**\n * @file floating-label.tsx\n * Animated floating label for MD3 TextField.\n * Animates between inline (body large) and floated (body small) positions.\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n\tMD3_LABEL_FLOAT_DURATION,\n\tMD3_STANDARD_EASING,\n} from \"../../shared/constants\";\nimport { TF_COLORS, TF_TYPOGRAPHY } from \"../text-field.tokens\";\n\nexport interface FloatingLabelProps {\n\t/** The label text content. */\n\ttext: string;\n\t/** Whether the label is in the floated (small) position. */\n\tisFloated: boolean;\n\t/** Whether the field is currently focused. */\n\tisFocused: boolean;\n\t/** Whether the field is in error state. */\n\tisError: boolean;\n\t/** Whether the field is disabled. */\n\tisDisabled: boolean;\n\t/** 'filled' or 'outlined' — determines vertical y offset. */\n\tvariant: \"filled\" | \"outlined\";\n\t/** Container height in px (56 normal, 48 dense). */\n\tcontainerHeight: number;\n\t/** Whether to skip animations (prefers-reduced-motion). */\n\tprefersReduced: boolean;\n\t/** Whether the required asterisk should be shown. */\n\tshowAsterisk: boolean;\n\t/** ID of the label element, for associating with a containing element. */\n\thtmlFor?: string;\n\t/** Ref callback so the parent can measure label width for the outlined notch. */\n\tlabelRef?: React.Ref<HTMLSpanElement>;\n\t/** Whether there is a leading icon. */\n\thasLeading?: boolean;\n}\n\n/**\n * Calculates the y-translation (in px) for the floated label position.\n *\n * For FILLED: move up from vertical center to the top inline padding area.\n * For OUTLINED: move up so the label sits on the top border line.\n *\n * The label starts at y=0 (vertically centered by flex parent).\n * When floated, it moves upward by `offset` pixels.\n */\nfunction getFloatedY(\n\tvariant: \"filled\" | \"outlined\",\n\tcontainerHeight: number,\n): number {\n\t// Label body-large line height ≈ 24px (16px * 1.5)\n\t// Label body-small line height ≈ 16px (12px * 1.33)\n\t// Floated container top-padding: 8px from top of container\n\tconst labelSmallHeight = 16;\n\tconst paddingTop = 8;\n\n\tif (variant === \"filled\") {\n\t\t// Center of container → top-padding area\n\t\t// Center is at containerHeight/2, floated center is at paddingTop + labelSmallHeight/2\n\t\tconst floatedCenter = paddingTop + labelSmallHeight / 2;\n\t\tconst unfloatedCenter = containerHeight / 2;\n\t\treturn -(unfloatedCenter - floatedCenter);\n\t}\n\t// Outlined: label sits on the border line (y = 0 relative to container top)\n\t// We move up by half the container height to reach the border\n\treturn -(containerHeight / 2);\n}\n\n/**\n * Returns the label color based on current state.\n */\nfunction getLabelColor(\n\tisFloated: boolean,\n\tisFocused: boolean,\n\tisError: boolean,\n\tisDisabled: boolean,\n): string {\n\tif (isDisabled) return TF_COLORS.onSurfaceVariant;\n\tif (isError) return TF_COLORS.error;\n\tif (isFloated && isFocused) return TF_COLORS.primary;\n\treturn TF_COLORS.onSurfaceVariant;\n}\n\n/**\n * MD3 Expressive Floating Label.\n *\n * Animates y-position, scale, and color when the label floats.\n * Uses `transformOrigin: 'left center'` so scaling anchors at the start.\n *\n * @accessibility\n * Rendered as a `<label>` with `htmlFor` linking to the `<input>`.\n * When floated, visual size changes but the semantic label is unchanged.\n */\nexport const FloatingLabel = React.memo(function FloatingLabel({\n\ttext,\n\tisFloated,\n\tisFocused,\n\tisError,\n\tisDisabled,\n\tvariant,\n\tcontainerHeight,\n\tprefersReduced,\n\tshowAsterisk,\n\thtmlFor,\n\tlabelRef,\n\thasLeading = false,\n}: FloatingLabelProps) {\n\tconst duration = prefersReduced ? 0 : MD3_LABEL_FLOAT_DURATION;\n\tconst ease = MD3_STANDARD_EASING;\n\n\tconst y = isFloated ? getFloatedY(variant, containerHeight) : 0;\n\tconst x = variant === \"outlined\" && isFloated && hasLeading ? -36 : 0;\n\tconst scale = isFloated ? TF_TYPOGRAPHY.labelScaleRatio : 1;\n\tconst color = getLabelColor(isFloated, isFocused, isError, isDisabled);\n\n\treturn (\n\t\t<m.label\n\t\t\thtmlFor={htmlFor}\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute pointer-events-none select-none origin-[left_center] leading-6 text-base whitespace-nowrap\",\n\t\t\t\t\"px-1 -mx-1\", // Clear the notch gap and keep text aligned\n\t\t\t\tvariant === \"outlined\" && isFloated && \"bg-m3-surface\",\n\t\t\t\t\"left-4\",\n\t\t\t\tisDisabled && \"opacity-[0.38]\",\n\t\t\t)}\n\t\t\tanimate={{ y, x, scale, color }}\n\t\t\ttransition={{ duration, ease }}\n\t\t\tstyle={{\n\t\t\t\ttop: (containerHeight - 24) / 2, // 24px is the resting line-height\n\t\t\t\ttransformOrigin: \"left center\",\n\t\t\t\tzIndex: 1,\n\t\t\t}}\n\t\t>\n\t\t\t<span ref={labelRef} className=\"inline-block relative\">\n\t\t\t\t{text}\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{showAsterisk && (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"asterisk\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\ttransition={{ duration: prefersReduced ? 0 : 0.1 }}\n\t\t\t\t\t\t\tclassName=\"ml-0.5 text-m3-error\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t*\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</span>\n\t\t</m.label>\n\t);\n});\n\nFloatingLabel.displayName = \"FloatingLabel\";\n","/**\n * @file leading-icon.tsx\n * Leading icon slot for MD3 TextField.\n */\n\nimport * as React from \"react\";\nimport { TF_COLORS } from \"../text-field.tokens\";\n\nexport interface LeadingIconProps {\n\t/** Icon node — should be 24×24px. */\n\tchildren: React.ReactNode;\n\t/** Whether the field is in error state (changes icon color). */\n\tisError: boolean;\n\t/** Whether the field is disabled. */\n\tisDisabled: boolean;\n}\n\n/**\n * MD3 Leading Icon wrapper.\n *\n * Decorative — `aria-hidden=\"true\"`.\n * Color: `on-surface-variant` (default), `error` (error state).\n * Size: 24×24px icon, 48×56px touch target via flex alignment.\n *\n * @see https://m3.material.io/components/text-fields/specs#anatomy\n */\nexport const LeadingIcon = React.memo(function LeadingIcon({\n\tchildren,\n\tisError,\n\tisDisabled,\n}: LeadingIconProps) {\n\tconst color =\n\t\tisError && !isDisabled ? TF_COLORS.error : TF_COLORS.onSurfaceVariant;\n\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"flex items-center justify-center shrink-0 w-6 h-6 ml-3\"\n\t\t\tstyle={{ color }}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n});\n\nLeadingIcon.displayName = \"LeadingIcon\";\n","/**\n * @file outline-container.tsx\n * MD3-compliant outlined border with animated notch for the Outlined TextField.\n *\n * Implementation: 3-segment approach inspired by Material Web's fieldset/legend pattern.\n * The top border is split into: [left-segment] [notch-gap] [right-segment].\n * The notch-gap width animates from 0 → (labelWidth × scaleRatio + 8px) when label floats.\n *\n * This mirrors Material Web's implementation without requiring <fieldset> semantics.\n *\n * @see https://github.com/material-components/material-web/tree/main/textfield\n * @see https://m3.material.io/components/text-fields/specs#outlined-text-field\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tMD3_INDICATOR_DURATION,\n\tMD3_LABEL_FLOAT_DURATION,\n\tMD3_STANDARD_EASING,\n} from \"../../shared/constants\";\nimport { TF_COLORS, TF_SIZE, TF_TYPOGRAPHY } from \"../text-field.tokens\";\n\nexport interface OutlineContainerProps {\n\t/** Whether the label is in the floated position. */\n\tisFloated: boolean;\n\t/** Whether the field is focused. */\n\tisFocused: boolean;\n\t/** Whether the field is in error state. */\n\tisError: boolean;\n\t/** Whether the field is disabled. */\n\tisDisabled: boolean;\n\t/** Whether the field is hovered. */\n\tisHovered: boolean;\n\t/**\n\t * Measured width of the label element in its full (unfloated) size.\n\t * The notch width = labelWidth × scaleRatio + 2×notchPadding.\n\t */\n\tlabelWidth: number;\n\t/** Whether to disable animations. */\n\tprefersReduced: boolean;\n}\n\n/**\n * Determines the outline border color based on current state.\n */\nfunction getOutlineColor(\n\tisFocused: boolean,\n\tisError: boolean,\n\tisHovered: boolean,\n\tisDisabled: boolean,\n): string {\n\tif (isDisabled) return TF_COLORS.onSurfaceVariant;\n\tif (isError) return TF_COLORS.error;\n\tif (isFocused) return TF_COLORS.primary;\n\tif (isHovered) return TF_COLORS.inputText;\n\treturn TF_COLORS.outline;\n}\n\n/**\n * MD3 Outlined TextField container with animated notch.\n *\n * The notch gap expands/collapses in sync with the FloatingLabel animation,\n * creating the visual effect of the label breaking through the border.\n *\n * Accessibility: `aria-hidden=\"true\"` — purely decorative border.\n */\nexport const OutlineContainer = React.memo(function OutlineContainer({\n\tisFloated,\n\tisFocused,\n\tisError,\n\tisDisabled,\n\tisHovered,\n\tlabelWidth,\n\tprefersReduced,\n}: OutlineContainerProps) {\n\tconst colorDuration = prefersReduced ? 0 : MD3_INDICATOR_DURATION;\n\tconst notchDuration = prefersReduced ? 0 : MD3_LABEL_FLOAT_DURATION;\n\tconst ease = MD3_STANDARD_EASING;\n\n\tconst borderColor = getOutlineColor(\n\t\tisFocused,\n\t\tisError,\n\t\tisHovered,\n\t\tisDisabled,\n\t);\n\tconst borderWidth =\n\t\tisFocused || isError ? TF_SIZE.outlineThick : TF_SIZE.outlineThin;\n\n\t// Calculate offset for notch (always 16px from the edge in M3 Outlined)\n\tconst leftSegmentWidth = TF_SIZE.paddingStart;\n\n\t/**\n\t * Notch width calculation:\n\t * When floated: label is scaled to 0.75, so its displayed width = labelWidth × 0.75\n\t * Add 2 × notchPadding (4px each side) for spacing inside the notch gap.\n\t * When unfloated: 0 (no gap in the border).\n\t */\n\tconst notchWidth = isFloated\n\t\t? labelWidth * TF_TYPOGRAPHY.labelScaleRatio + TF_SIZE.notchPadding * 2\n\t\t: 0;\n\n\tconst borderTransition = { duration: colorDuration, ease };\n\tconst notchTransition = { duration: notchDuration, ease };\n\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute inset-0 pointer-events-none flex rounded-[inherit]\"\n\t\t>\n\t\t\t{/* Left segment — left + bottom + top borders */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"rounded-tl-[inherit] rounded-bl-[inherit]\"\n\t\t\t\tstyle={{ width: leftSegmentWidth - TF_SIZE.notchPadding }}\n\t\t\t\tanimate={{\n\t\t\t\t\tborderColor,\n\t\t\t\t\tborderWidth,\n\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\tborderRightWidth: 0,\n\t\t\t\t}}\n\t\t\t\ttransition={borderTransition}\n\t\t\t/>\n\n\t\t\t{/* Center (notch) segment */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"flex flex-col shrink-0\"\n\t\t\t\tstyle={{ minWidth: 0 }}\n\t\t\t\tanimate={{ width: notchWidth }}\n\t\t\t\ttransition={notchTransition}\n\t\t\t>\n\t\t\t\t{/* Top border of notch: transparent when notched */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\tstyle={{ height: borderWidth }}\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\tborderTopColor: borderColor,\n\t\t\t\t\t\topacity: isFloated ? 0 : 1,\n\t\t\t\t\t\tborderTopWidth: borderWidth,\n\t\t\t\t\t\tborderTopStyle: \"solid\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={borderTransition}\n\t\t\t\t/>\n\t\t\t\t{/* Bottom border (always present) */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\tborderBottomColor: borderColor,\n\t\t\t\t\t\tborderBottomWidth: borderWidth,\n\t\t\t\t\t\tborderBottomStyle: \"solid\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={borderTransition}\n\t\t\t\t/>\n\t\t\t</m.div>\n\n\t\t\t{/* Right segment — full height, right + bottom + top borders */}\n\t\t\t<m.div\n\t\t\t\tclassName=\"flex-1 rounded-tr-[inherit] rounded-br-[inherit]\"\n\t\t\t\tanimate={{\n\t\t\t\t\tborderColor,\n\t\t\t\t\tborderWidth,\n\t\t\t\t\tborderStyle: \"solid\",\n\t\t\t\t\tborderLeftWidth: 0,\n\t\t\t\t}}\n\t\t\t\ttransition={borderTransition}\n\t\t\t/>\n\t\t</div>\n\t);\n});\n\nOutlineContainer.displayName = \"OutlineContainer\";\n","/**\n * @file prefix-suffix.tsx\n * Prefix and suffix text for MD3 TextField.\n * Visible only when the label is floated (or when there is no label).\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tMD3_LABEL_FLOAT_DURATION,\n\tMD3_STANDARD_EASING,\n} from \"../../shared/constants\";\nimport { TF_CLASSES } from \"../text-field.tokens\";\n\nexport interface PrefixSuffixProps {\n\ttext: string;\n\ttype: \"prefix\" | \"suffix\";\n\t/** Whether the label is floated (controls visibility). */\n\tvisible: boolean;\n\t/** Disable animations. */\n\tprefersReduced: boolean;\n}\n\n/**\n * MD3 Prefix / Suffix Text.\n *\n * Animates in/out in sync with the floating label using AnimatePresence.\n * Hidden when label is in the inline position (would overlap the label).\n *\n * @accessibility\n * `aria-hidden=\"true\"` — decorative. Screen readers read the full value in context.\n */\nexport const PrefixSuffix = React.memo(function PrefixSuffix({\n\ttext,\n\ttype,\n\tvisible,\n\tprefersReduced,\n}: PrefixSuffixProps) {\n\tconst duration = prefersReduced ? 0 : MD3_LABEL_FLOAT_DURATION;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{visible && (\n\t\t\t\t<m.span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName={`${TF_CLASSES.prefixSuffix} ${type === \"suffix\" ? \"ml-0.5\" : \"mr-0.5\"}`}\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration, ease: MD3_STANDARD_EASING }}\n\t\t\t\t>\n\t\t\t\t\t{text}\n\t\t\t\t</m.span>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n});\n\nPrefixSuffix.displayName = \"PrefixSuffix\";\n","/**\n * @file supporting-text.tsx\n * Supporting text, error text, and character counter for MD3 TextField.\n *\n * Animates in/out using AnimatePresence. Uses aria-live for accessibility.\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tMD3_STANDARD_EASING,\n\tMD3_SUPPORTING_DURATION,\n} from \"../../shared/constants\";\nimport { TF_COLORS } from \"../text-field.tokens\";\n\nexport interface SupportingTextProps {\n\t/** Helper text shown in normal state. */\n\tsupportingText?: string;\n\t/** Error message — shown instead of supportingText when isError=true. */\n\terrorText?: string;\n\t/** Whether field is in error state. */\n\tisError: boolean;\n\t/** Current character count (value.length). */\n\tcharCount?: number;\n\t/** Maximum character limit. Counter shown only when maxLength is set. */\n\tmaxLength?: number;\n\t/** ID for aria-describedby linking from the input. */\n\tid: string;\n\t/** Disable animations. */\n\tprefersReduced: boolean;\n}\n\n/**\n * AnimatePresence wrapper for text content changes.\n * Fades out old text, fades in new text.\n */\nfunction AnimatedText({\n\ttext,\n\tmotionKey,\n\tclassName,\n\tariaLive,\n\tduration,\n}: {\n\ttext: string;\n\tmotionKey: string;\n\tclassName: string;\n\tariaLive?: \"polite\" | \"off\";\n\tduration: number;\n}) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={motionKey}\n\t\t\tclassName={className}\n\t\t\tinitial={{ opacity: 0, y: -4 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\texit={{ opacity: 0, y: -4 }}\n\t\t\ttransition={{ duration, ease: MD3_STANDARD_EASING }}\n\t\t\taria-live={ariaLive}\n\t\t>\n\t\t\t{text}\n\t\t</m.span>\n\t);\n}\n\n/**\n * MD3 Supporting Text area.\n *\n * Layout: [helper/error text] [character counter]\n * - Error text replaces supporting text when isError=true.\n * - Character counter shows only when maxLength is provided.\n * - Both use aria-live=\"polite\" to announce changes to screen readers.\n * - Animates in/out with opacity + y-offset via AnimatePresence.\n *\n * @accessibility\n * - Error text: `aria-live=\"polite\"` — screen readers announce when error appears.\n * - Counter: `aria-live=\"polite\"` — announces count changes.\n */\nexport const SupportingText = React.memo(function SupportingText({\n\tsupportingText,\n\terrorText,\n\tisError,\n\tcharCount,\n\tmaxLength,\n\tid,\n\tprefersReduced,\n}: SupportingTextProps) {\n\tconst duration = prefersReduced ? 0 : MD3_SUPPORTING_DURATION;\n\n\tconst activeText = isError && errorText ? errorText : supportingText;\n\tconst isOverLimit = maxLength !== undefined && (charCount ?? 0) > maxLength;\n\n\t// Determine counter color\n\tconst counterColor = isOverLimit\n\t\t? TF_COLORS.error\n\t\t: TF_COLORS.onSurfaceVariant;\n\n\tif (!activeText && maxLength === undefined) return null;\n\n\treturn (\n\t\t<m.div\n\t\t\tclassName=\"flex items-start justify-between gap-2 mt-1 px-4\"\n\t\t\tinitial={{ opacity: 0, height: 0 }}\n\t\t\tanimate={{ opacity: 1, height: \"auto\" }}\n\t\t\texit={{ opacity: 0, height: 0 }}\n\t\t\ttransition={{ duration, ease: MD3_STANDARD_EASING }}\n\t\t>\n\t\t\t{/* Left: helper or error text */}\n\t\t\t<div id={id} className=\"flex-1 min-w-0\">\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t{activeText && (\n\t\t\t\t\t\t<AnimatedText\n\t\t\t\t\t\t\tkey={isError && errorText ? \"error\" : \"helper\"}\n\t\t\t\t\t\t\tmotionKey={\n\t\t\t\t\t\t\t\tisError && errorText\n\t\t\t\t\t\t\t\t\t? `error-${errorText}`\n\t\t\t\t\t\t\t\t\t: `helper-${supportingText}`\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttext={activeText}\n\t\t\t\t\t\t\tclassName={`text-xs leading-4 block ${\n\t\t\t\t\t\t\t\tisError ? \"text-m3-error\" : \"text-m3-on-surface-variant\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\tariaLive=\"polite\"\n\t\t\t\t\t\t\tduration={duration}\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\n\t\t\t{/* Right: character counter */}\n\t\t\t{maxLength !== undefined && typeof charCount === \"number\" && (\n\t\t\t\t<m.span\n\t\t\t\t\tclassName=\"text-xs leading-4 tabular-nums shrink-0\"\n\t\t\t\t\tanimate={{ color: counterColor }}\n\t\t\t\t\ttransition={{ duration, ease: MD3_STANDARD_EASING }}\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{charCount} / {maxLength}\n\t\t\t\t</m.span>\n\t\t\t)}\n\t\t</m.div>\n\t);\n});\n\nSupportingText.displayName = \"SupportingText\";\n","/**\n * @file trailing-icon.tsx\n * Trailing icon slot for MD3 TextField.\n *\n * Supports three built-in modes:\n * - 'clear': ✕ button, visible when field has value\n * - 'password-toggle': eye icon, toggles password visibility\n * - 'custom': renders the `children` prop\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tMD3_ICON_SWAP_DURATION,\n\tMD3_STANDARD_EASING,\n} from \"../../shared/constants\";\nimport { TF_COLORS } from \"../text-field.tokens\";\nimport type { TextFieldTrailingIconMode } from \"../text-field.types\";\n\nexport interface TrailingIconProps {\n\tmode: TextFieldTrailingIconMode;\n\t/** Custom icon content (used when mode='custom'). */\n\tchildren?: React.ReactNode;\n\t/** Current input value — used to determine if clear button is visible. */\n\tvalue: string;\n\t/** Whether password is currently visible (for password-toggle mode). */\n\tshowPassword?: boolean;\n\t/** Fires when clear button is clicked. */\n\tonClear?: () => void;\n\t/** Fires when password visibility toggle is clicked. */\n\tonPasswordToggle?: () => void;\n\t/** Whether the field is in error state. */\n\tisError: boolean;\n\t/** Whether the field is disabled. */\n\tisDisabled: boolean;\n\t/** Disable animations. */\n\tprefersReduced: boolean;\n}\n\n/** Animated icon wrapper with scale + opacity transition. */\nfunction AnimatedIconSlot({\n\tchildren,\n\tmotionKey,\n\tduration,\n}: {\n\tchildren: React.ReactNode;\n\tmotionKey: string;\n\tduration: number;\n}) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={motionKey}\n\t\t\tclassName=\"flex items-center justify-center\"\n\t\t\tinitial={{ opacity: 0, scale: 0 }}\n\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\texit={{ opacity: 0, scale: 0 }}\n\t\t\ttransition={{ duration, ease: MD3_STANDARD_EASING }}\n\t\t>\n\t\t\t{children}\n\t\t</m.span>\n\t);\n}\n\n/** Eye icon (password visible). */\nfunction EyeOpenIcon() {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<path d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\" />\n\t\t</svg>\n\t);\n}\n\n/** Eye-off icon (password hidden). */\nfunction EyeOffIcon() {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\" />\n\t\t</svg>\n\t);\n}\n\n/** ✕ Clear icon. */\nfunction ClearIcon() {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"20\"\n\t\t\theight=\"20\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n\t\t</svg>\n\t);\n}\n\n/**\n * MD3 Trailing Icon.\n *\n * Touch target: 48×48px (padding extends the hit area beyond the 24×24 icon).\n *\n * @accessibility\n * - Clear button: `aria-label=\"Clear input\"`\n * - Password toggle: `aria-label=\"Show password\"` / `\"Hide password\"`\n * - Custom: no aria — consumer provides accessible markup\n */\nexport const TrailingIcon = React.memo(function TrailingIcon({\n\tmode,\n\tchildren,\n\tvalue,\n\tshowPassword = false,\n\tonClear,\n\tonPasswordToggle,\n\tisError,\n\tisDisabled,\n\tprefersReduced,\n}: TrailingIconProps) {\n\tconst duration = prefersReduced ? 0 : MD3_ICON_SWAP_DURATION;\n\n\tconst iconColor =\n\t\tisError && !isDisabled ? TF_COLORS.error : TF_COLORS.onSurfaceVariant;\n\n\t// Touch target button styles: 48×48px, centered icon\n\tconst btnClass =\n\t\t\"relative flex items-center justify-center w-12 h-12 -mr-1 rounded-full cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-m3-primary)] transition-colors hover:bg-[var(--color-m3-on-surface)]/8 active:bg-[var(--color-m3-on-surface)]/12 disabled:pointer-events-none\";\n\n\tif (mode === \"clear\") {\n\t\tconst hasValue = value.length > 0;\n\t\treturn (\n\t\t\t<AnimatePresence>\n\t\t\t\t{hasValue && (\n\t\t\t\t\t<AnimatedIconSlot motionKey=\"clear\" duration={duration}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label=\"Clear input\"\n\t\t\t\t\t\t\tonClick={onClear}\n\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\t\t\t\t\tclassName={btnClass}\n\t\t\t\t\t\t\tstyle={{ color: iconColor }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ClearIcon />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</AnimatedIconSlot>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t}\n\n\tif (mode === \"password-toggle\") {\n\t\treturn (\n\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t<AnimatedIconSlot\n\t\t\t\t\tmotionKey={showPassword ? \"eye-off\" : \"eye-on\"}\n\t\t\t\t\tduration={duration}\n\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\taria-label={showPassword ? \"Hide password\" : \"Show password\"}\n\t\t\t\t\t\tonClick={onPasswordToggle}\n\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\t\t\t\tclassName={btnClass}\n\t\t\t\t\t\tstyle={{ color: iconColor }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{showPassword ? <EyeOffIcon /> : <EyeOpenIcon />}\n\t\t\t\t\t</button>\n\t\t\t\t</AnimatedIconSlot>\n\t\t\t</AnimatePresence>\n\t\t);\n\t}\n\n\tif (mode === \"custom\" && children) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center justify-center w-6 h-6 mr-3\"\n\t\t\t\tstyle={{ color: iconColor }}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn null;\n});\n\nTrailingIcon.displayName = \"TrailingIcon\";\n","/**\n * @file text-field.tsx\n * MD3 Expressive TextField — Filled & Outlined variants.\n *\n * Features:\n * - Floating label animation (Framer Motion)\n * - Filled (active indicator) and Outlined (notch border) variants\n * - Controlled & uncontrolled value handling\n * - Built-in clear button, password toggle\n * - Prefix / suffix text\n * - Supporting text, error text, character counter\n * - Leading & trailing icon slots\n * - Textarea support\n * - Native form validation + imperative handle\n * - Full WCAG AA accessibility\n * - prefers-reduced-motion support\n *\n * @see https://m3.material.io/components/text-fields/overview\n */\n\n\"use client\";\n\nimport { domMax, LazyMotion, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { ActiveIndicator } from \"./subcomponents/active-indicator\";\nimport { FloatingLabel } from \"./subcomponents/floating-label\";\nimport { LeadingIcon } from \"./subcomponents/leading-icon\";\nimport { OutlineContainer } from \"./subcomponents/outline-container\";\nimport { PrefixSuffix } from \"./subcomponents/prefix-suffix\";\nimport { SupportingText } from \"./subcomponents/supporting-text\";\nimport { TrailingIcon } from \"./subcomponents/trailing-icon\";\nimport { TF_SIZE } from \"./text-field.tokens\";\nimport type { TextFieldHandle, TextFieldProps } from \"./text-field.types\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** Textarea line height in px — matches leading-6 (1.5rem at 16px base). */\nconst LINE_HEIGHT_PX = 24;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nconst TextFieldComponent = React.forwardRef<TextFieldHandle, TextFieldProps>(\n\t(\n\t\t{\n\t\t\t// Core\n\t\t\tvariant = \"filled\",\n\t\t\tlabel,\n\t\t\tvalue: valueProp,\n\t\t\tdefaultValue = \"\",\n\t\t\tonChange,\n\t\t\t// Input config\n\t\t\ttype = \"text\",\n\t\t\tplaceholder,\n\t\t\tname,\n\t\t\tid: idProp,\n\t\t\tautoComplete,\n\t\t\tinputMode,\n\t\t\tautoResize = false,\n\t\t\tmaxRows,\n\t\t\trows = autoResize ? 1 : 2,\n\t\t\tcols,\n\t\t\ttextDirection,\n\t\t\t// Validation\n\t\t\trequired = false,\n\t\t\tnoAsterisk = false,\n\t\t\terror: errorProp = false,\n\t\t\terrorText,\n\t\t\tminLength,\n\t\t\tmaxLength,\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep,\n\t\t\tpattern,\n\t\t\tmultiple,\n\t\t\t// Supporting text\n\t\t\tsupportingText,\n\t\t\t// Decorators\n\t\t\tprefixText,\n\t\t\tsuffixText,\n\t\t\tleadingIcon,\n\t\t\ttrailingIcon,\n\t\t\ttrailingIconMode = \"none\",\n\t\t\t// States\n\t\t\tdisabled = false,\n\t\t\treadOnly = false,\n\t\t\tnoSpinner = false,\n\t\t\t// Form\n\t\t\tform,\n\t\t\t// Accessibility\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-describedby\": ariaDescribedby,\n\t\t\t\"aria-labelledby\": ariaLabelledby,\n\t\t\t// Layout\n\t\t\tclassName,\n\t\t\tfullWidth = true,\n\t\t\tdense = false,\n\t\t\t// ScrollArea\n\t\t\tscrollAreaType = \"hover\",\n\t\t\t// Callbacks\n\t\t\tonFocus,\n\t\t\tonBlur,\n\t\t\tonKeyDown,\n\t\t\tonKeyUp,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\t// ── IDs ───────────────────────────────────────────────────────────────\n\t\tconst generatedId = React.useId();\n\t\tconst inputId = idProp ?? `tf-${generatedId}`;\n\t\tconst supportingId = `${inputId}-supporting`;\n\n\t\t// ── Value state ───────────────────────────────────────────────────────\n\t\tconst isControlled = valueProp !== undefined;\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue);\n\t\tconst currentValue = isControlled ? (valueProp as string) : internalValue;\n\n\t\t// ── Interaction state ─────────────────────────────────────────────────\n\t\tconst [isFocused, setIsFocused] = React.useState(false);\n\t\t// Hover color changes are handled by CSS (group-hover/tf) for a11y compliance.\n\n\t\t// ── Password toggle ───────────────────────────────────────────────────\n\t\tconst [showPassword, setShowPassword] = React.useState(false);\n\t\tconst resolvedInputType =\n\t\t\ttype === \"password\" && showPassword ? \"text\" : type;\n\n\t\t// ── Native validation error ───────────────────────────────────────────\n\t\tconst [nativeError, setNativeError] = React.useState(\"\");\n\n\t\t// ── Label width for outlined notch ────────────────────────────────────\n\t\tconst [labelWidth, setLabelWidth] = React.useState(0);\n\n\t\t// ── Derived state ─────────────────────────────────────────────────────\n\t\tconst hasValue = currentValue.length > 0;\n\t\t/** Label is floated when focused OR when there is a value. */\n\t\tconst isFloated = isFocused || hasValue;\n\t\tconst isError =\n\t\t\terrorProp ||\n\t\t\t!!nativeError ||\n\t\t\t(maxLength !== undefined && currentValue.length > maxLength);\n\t\tconst containerHeight = dense ? TF_SIZE.denseHeight : TF_SIZE.height;\n\t\tconst showAsterisk = required && !noAsterisk;\n\n\t\t// ── Refs ──────────────────────────────────────────────────────────────\n\t\tconst inputRef = React.useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\t\tconst labelSpanRef = React.useRef<HTMLSpanElement>(null);\n\n\t\t// Measure label span width for outlined notch (once on mount)\n\t\tReact.useLayoutEffect(() => {\n\t\t\tif (labelSpanRef.current) {\n\t\t\t\tsetLabelWidth(labelSpanRef.current.offsetWidth);\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, []); // mount only — label text changes are rare in production\n\n\t\t// ── Auto-resize textarea ──────────────────────────────────────────────\n\t\tReact.useLayoutEffect(() => {\n\t\t\tif (type !== \"textarea\" || !inputRef.current) return;\n\t\t\tconst textarea = inputRef.current as HTMLTextAreaElement;\n\n\t\t\tif (autoResize) {\n\t\t\t\t// currentValue in deps triggers re-measure on each keystroke\n\t\t\t\tvoid currentValue;\n\t\t\t\ttextarea.style.height = \"auto\";\n\t\t\t\ttextarea.style.height = `${textarea.scrollHeight}px`;\n\n\t\t\t\tif (maxRows) {\n\t\t\t\t\ttextarea.style.maxHeight = `${maxRows * LINE_HEIGHT_PX}px`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Hide native scrollbar — ScrollArea handles it\n\t\t\ttextarea.style.overflowY = \"hidden\";\n\t\t}, [type, autoResize, maxRows, currentValue]);\n\n\t\t// ── Handlers ──────────────────────────────────────────────────────────\n\n\t\tconst handleValueChange = React.useCallback(\n\t\t\t(newValue: string) => {\n\t\t\t\tif (!isControlled) setInternalValue(newValue);\n\t\t\t\t// Clear native validation error when user types\n\t\t\t\tsetNativeError(\"\");\n\t\t\t\t(inputRef.current as HTMLInputElement)?.setCustomValidity?.(\"\");\n\t\t\t},\n\t\t\t[isControlled],\n\t\t);\n\n\t\tconst handleChange = React.useCallback(\n\t\t\t(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\t\tconst newVal = e.target.value;\n\t\t\t\thandleValueChange(newVal);\n\t\t\t\tonChange?.(newVal, e);\n\t\t\t},\n\t\t\t[handleValueChange, onChange],\n\t\t);\n\n\t\tconst handleFocus = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\t\tsetIsFocused(true);\n\t\t\t\tonFocus?.(e);\n\t\t\t},\n\t\t\t[onFocus],\n\t\t);\n\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\t// Run native validation on blur\n\t\t\t\tconst el = inputRef.current as HTMLInputElement;\n\t\t\t\tif (el && !el.validity.valid) {\n\t\t\t\t\tsetNativeError(el.validationMessage);\n\t\t\t\t} else {\n\t\t\t\t\tsetNativeError(\"\");\n\t\t\t\t}\n\t\t\t\tonBlur?.(e);\n\t\t\t},\n\t\t\t[onBlur],\n\t\t);\n\n\t\tconst handleClear = React.useCallback(() => {\n\t\t\thandleValueChange(\"\");\n\t\t\tonChange?.(\"\", {\n\t\t\t\ttarget: { value: \"\" },\n\t\t\t} as React.ChangeEvent<HTMLInputElement>);\n\t\t\tinputRef.current?.focus();\n\t\t}, [handleValueChange, onChange]);\n\n\t\tconst handlePasswordToggle = React.useCallback(() => {\n\t\t\tsetShowPassword((prev) => !prev);\n\t\t\tinputRef.current?.focus();\n\t\t}, []);\n\n\t\t// ── Imperative Handle ─────────────────────────────────────────────────\n\t\tReact.useImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tfocus: () => inputRef.current?.focus(),\n\t\t\t\tblur: () => inputRef.current?.blur(),\n\t\t\t\tselect: () => (inputRef.current as HTMLInputElement)?.select?.(),\n\t\t\t\tclear: () => handleValueChange(\"\"),\n\t\t\t\tsetCustomValidity: (msg: string) =>\n\t\t\t\t\t(inputRef.current as HTMLInputElement)?.setCustomValidity?.(msg),\n\t\t\t\tcheckValidity: () =>\n\t\t\t\t\t(inputRef.current as HTMLInputElement)?.checkValidity?.() ?? true,\n\t\t\t\treportValidity: () => {\n\t\t\t\t\tconst el = inputRef.current as HTMLInputElement;\n\t\t\t\t\tconst valid = el?.reportValidity?.() ?? true;\n\t\t\t\t\tif (!valid) setNativeError(el?.validationMessage ?? \"\");\n\t\t\t\t\treturn valid;\n\t\t\t\t},\n\t\t\t\tgetValue: () => currentValue,\n\t\t\t\tgetInputElement: () => inputRef.current,\n\t\t\t}),\n\t\t\t[currentValue, handleValueChange],\n\t\t);\n\n\t\t// ── ARIA describedby ──────────────────────────────────────────────────\n\t\tconst hasSupporting = !!(\n\t\t\tsupportingText ||\n\t\t\terrorText ||\n\t\t\tmaxLength !== undefined\n\t\t);\n\t\tconst computedDescribedby =\n\t\t\t[hasSupporting ? supportingId : \"\", ariaDescribedby ?? \"\"]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \") || undefined;\n\n\t\t// ── Input classes ─────────────────────────────────────────────────────\n\t\tconst inputClass = cn(\n\t\t\t\"bg-transparent outline-none w-full self-end\",\n\t\t\t\"text-base leading-6 text-m3-on-surface\",\n\t\t\t\"caret-[var(--color-m3-primary)]\",\n\t\t\t\"placeholder:text-m3-on-surface-variant/60\",\n\t\t\tnoSpinner &&\n\t\t\t\ttype === \"number\" &&\n\t\t\t\t\"[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\",\n\t\t\tdisabled && \"cursor-not-allowed\",\n\t\t);\n\n\t\t// Shared input element props\n\t\tconst inputProps = {\n\t\t\tid: inputId,\n\t\t\tname,\n\t\t\tvalue: currentValue,\n\t\t\tplaceholder: isFloated ? (placeholder ?? \"\") : \"\",\n\t\t\tdisabled,\n\t\t\treadOnly,\n\t\t\trequired,\n\t\t\tminLength,\n\t\t\tmaxLength,\n\t\t\tautoComplete,\n\t\t\tinputMode,\n\t\t\tform,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-labelledby\": ariaLabelledby,\n\t\t\t\"aria-describedby\": computedDescribedby,\n\t\t\t\"aria-invalid\": isError || undefined,\n\t\t\t\"aria-required\": required || undefined,\n\t\t\tonChange: handleChange,\n\t\t\tonFocus: handleFocus,\n\t\t\tonBlur: handleBlur,\n\t\t\tonKeyDown,\n\t\t\tonKeyUp,\n\t\t};\n\n\t\t// ── Container classes ─────────────────────────────────────────────────\n\t\tconst hasLeading = !!leadingIcon;\n\t\t// ALWAYS 16px gap between text and container/icons\n\t\tconst paddingStart = \"pl-4\";\n\t\tconst paddingEnd = \"pr-4\";\n\n\t\tconst containerClass = cn(\n\t\t\t\"relative flex items-center\",\n\t\t\tvariant === \"filled\"\n\t\t\t\t? \"bg-[var(--color-m3-surface-container-highest)] rounded-tl-sm rounded-tr-sm\"\n\t\t\t\t: \"bg-transparent rounded-sm\",\n\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t);\n\n\t\tconst innerClass = cn(\n\t\t\t\"relative flex flex-col flex-1 min-w-0\",\n\t\t\tpaddingStart,\n\t\t\tpaddingEnd,\n\t\t\tvariant === \"filled\"\n\t\t\t\t? dense\n\t\t\t\t\t? \"pt-5 pb-2\"\n\t\t\t\t\t: \"pt-6 pb-2\"\n\t\t\t\t: dense\n\t\t\t\t\t? \"py-3\"\n\t\t\t\t\t: \"py-4\",\n\t\t);\n\n\t\tconst wrapperClass = cn(\n\t\t\t\"group/tf inline-flex flex-col\",\n\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t\tdisabled && \"opacity-[0.38] pointer-events-none\",\n\t\t\tclassName,\n\t\t);\n\n\t\tconst containerHeightClass = dense ? \"h-12\" : \"h-14\";\n\n\t\t// ── Render ────────────────────────────────────────────────────────────\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div className={wrapperClass}>\n\t\t\t\t\t{/* Main container */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tcontainerClass,\n\t\t\t\t\t\t\ttype !== \"textarea\" && containerHeightClass,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Outlined border with animated notch */}\n\t\t\t\t\t\t{variant === \"outlined\" && (\n\t\t\t\t\t\t\t<OutlineContainer\n\t\t\t\t\t\t\t\tisFloated={isFloated}\n\t\t\t\t\t\t\t\tisFocused={isFocused}\n\t\t\t\t\t\t\t\tisError={isError}\n\t\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\t\tisHovered={false}\n\t\t\t\t\t\t\t\tlabelWidth={labelWidth}\n\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Hover state layer (filled only) */}\n\t\t\t\t\t\t{variant === \"filled\" && (\n\t\t\t\t\t\t\t<div\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\"absolute inset-0 pointer-events-none rounded-[inherit] bg-m3-on-surface\",\n\t\t\t\t\t\t\t\t\t\"opacity-0 transition-opacity duration-150\",\n\t\t\t\t\t\t\t\t\t\"group-hover/tf:opacity-[0.08]\",\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\n\t\t\t\t\t\t{/* Leading icon */}\n\t\t\t\t\t\t{leadingIcon && (\n\t\t\t\t\t\t\t<LeadingIcon isError={isError} isDisabled={disabled}>\n\t\t\t\t\t\t\t\t{leadingIcon}\n\t\t\t\t\t\t\t</LeadingIcon>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Inner column: floating label + input row */}\n\t\t\t\t\t\t<div className={innerClass}>\n\t\t\t\t\t\t\t{/* Floating label — absolutely positioned over the inner region */}\n\t\t\t\t\t\t\t{label && (\n\t\t\t\t\t\t\t\t<FloatingLabel\n\t\t\t\t\t\t\t\t\ttext={label}\n\t\t\t\t\t\t\t\t\tisFloated={isFloated}\n\t\t\t\t\t\t\t\t\tisFocused={isFocused}\n\t\t\t\t\t\t\t\t\tisError={isError}\n\t\t\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\t\t\tcontainerHeight={containerHeight}\n\t\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\t\t\t\tshowAsterisk={showAsterisk}\n\t\t\t\t\t\t\t\t\thtmlFor={inputId}\n\t\t\t\t\t\t\t\t\tlabelRef={labelSpanRef}\n\t\t\t\t\t\t\t\t\thasLeading={hasLeading}\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{/* Input row: prefix + input/textarea + suffix */}\n\t\t\t\t\t\t\t<div className=\"flex items-center w-full\">\n\t\t\t\t\t\t\t\t{prefixText && (\n\t\t\t\t\t\t\t\t\t<PrefixSuffix\n\t\t\t\t\t\t\t\t\t\ttext={prefixText}\n\t\t\t\t\t\t\t\t\t\ttype=\"prefix\"\n\t\t\t\t\t\t\t\t\t\tvisible={isFloated}\n\t\t\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{type === \"textarea\" ? (\n\t\t\t\t\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\t\t\t\t\ttype={scrollAreaType}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full flex-1\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\theight: !autoResize ? rows * LINE_HEIGHT_PX : undefined,\n\t\t\t\t\t\t\t\t\t\t\tmaxHeight:\n\t\t\t\t\t\t\t\t\t\t\t\tautoResize && maxRows\n\t\t\t\t\t\t\t\t\t\t\t\t\t? maxRows * LINE_HEIGHT_PX\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tviewportClassName=\"max-h-[inherit]\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\t\t\tref={inputRef as React.Ref<HTMLTextAreaElement>}\n\t\t\t\t\t\t\t\t\t\t\trows={rows}\n\t\t\t\t\t\t\t\t\t\t\tcols={cols}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tinputClass,\n\t\t\t\t\t\t\t\t\t\t\t\t\"resize-none mt-2\",\n\t\t\t\t\t\t\t\t\t\t\t\tautoResize ? \"h-auto\" : \"h-full\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ direction: textDirection || undefined }}\n\t\t\t\t\t\t\t\t\t\t\t{...inputProps}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</ScrollArea>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tref={inputRef as React.Ref<HTMLInputElement>}\n\t\t\t\t\t\t\t\t\t\ttype={type === \"password\" ? resolvedInputType : type}\n\t\t\t\t\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\t\t\t\t\tpattern={pattern}\n\t\t\t\t\t\t\t\t\t\tmultiple={multiple}\n\t\t\t\t\t\t\t\t\t\tclassName={inputClass}\n\t\t\t\t\t\t\t\t\t\tstyle={{ direction: textDirection || undefined }}\n\t\t\t\t\t\t\t\t\t\t{...inputProps}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{suffixText && (\n\t\t\t\t\t\t\t\t\t<PrefixSuffix\n\t\t\t\t\t\t\t\t\t\ttext={suffixText}\n\t\t\t\t\t\t\t\t\t\ttype=\"suffix\"\n\t\t\t\t\t\t\t\t\t\tvisible={isFloated}\n\t\t\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\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</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Trailing icon: clear, password-toggle, or custom */}\n\t\t\t\t\t\t{(trailingIconMode !== \"none\" || trailingIcon) && (\n\t\t\t\t\t\t\t<TrailingIcon\n\t\t\t\t\t\t\t\tmode={trailingIcon ? \"custom\" : trailingIconMode}\n\t\t\t\t\t\t\t\tvalue={currentValue}\n\t\t\t\t\t\t\t\tshowPassword={showPassword}\n\t\t\t\t\t\t\t\tonClear={handleClear}\n\t\t\t\t\t\t\t\tonPasswordToggle={handlePasswordToggle}\n\t\t\t\t\t\t\t\tisError={isError}\n\t\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{trailingIcon}\n\t\t\t\t\t\t\t</TrailingIcon>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Active indicator: bottom border line (filled variant only) */}\n\t\t\t\t\t\t{variant === \"filled\" && (\n\t\t\t\t\t\t\t<ActiveIndicator\n\t\t\t\t\t\t\t\tisFocused={isFocused}\n\t\t\t\t\t\t\t\tisError={isError}\n\t\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\t\tisHovered={false}\n\t\t\t\t\t\t\t\tprefersReduced={prefersReduced}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Supporting text area: helper text + character counter */}\n\t\t\t\t\t{hasSupporting && (\n\t\t\t\t\t\t<SupportingText\n\t\t\t\t\t\t\tsupportingText={supportingText}\n\t\t\t\t\t\t\terrorText={errorText ?? (nativeError || undefined)}\n\t\t\t\t\t\t\tisError={isError}\n\t\t\t\t\t\t\tcharCount={\n\t\t\t\t\t\t\t\tmaxLength !== undefined ? currentValue.length : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\tid={supportingId}\n\t\t\t\t\t\t\tprefersReduced={prefersReduced}\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\nTextFieldComponent.displayName = \"TextField\";\n\n/**\n * MD3 Expressive TextField.\n *\n * Supports `filled` and `outlined` variants, floating label animation,\n * prefix/suffix, leading/trailing icons, supporting text, character counter,\n * textarea mode, clear button, password toggle, and native form validation.\n *\n * @example\n * ```tsx\n * // Filled (default)\n * <TextField label=\"Email\" type=\"email\" />\n *\n * // Outlined with error\n * <TextField variant=\"outlined\" label=\"Username\" error errorText=\"Already taken\" />\n *\n * // With clear button\n * <TextField label=\"Search\" trailingIconMode=\"clear\" />\n *\n * // Password with toggle\n * <TextField label=\"Password\" type=\"password\" trailingIconMode=\"password-toggle\" />\n *\n * // With character counter\n * <TextField label=\"Bio\" maxLength={140} supportingText=\"Describe yourself\" />\n * ```\n *\n * @see https://m3.material.io/components/text-fields/overview\n */\nexport const TextField = React.memo(TextFieldComponent);\n","import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from \"react\";\nimport { applyTheme, type ThemeMode } from \"../../lib/theme-utils\";\n\ninterface ThemeContextValue {\n\tsourceColor: string;\n\tsetSourceColor: (color: string) => void;\n\tmode: ThemeMode;\n\tsetMode: (mode: ThemeMode) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nconst STORAGE_KEY_COLOR = \"md3-source-color\";\nconst STORAGE_KEY_MODE = \"md3-theme-mode\";\n\nexport interface MD3ThemeProviderProps {\n\tchildren: ReactNode;\n\tsourceColor?: string;\n\tdefaultMode?: ThemeMode;\n\tpersistToLocalStorage?: boolean;\n}\n\nexport function MD3ThemeProvider({\n\tchildren,\n\tsourceColor: initialSourceColor = \"#6750A4\",\n\tdefaultMode = \"light\",\n\tpersistToLocalStorage = false,\n}: MD3ThemeProviderProps) {\n\tconst [sourceColor, setSourceColor] = useState(initialSourceColor);\n\tconst [mode, setMode] = useState<ThemeMode>(defaultMode);\n\tconst [isHydrated, setIsHydrated] = useState(!persistToLocalStorage);\n\n\tuseEffect(() => {\n\t\tif (!persistToLocalStorage) return;\n\n\t\tconst savedColor = localStorage.getItem(STORAGE_KEY_COLOR);\n\t\tconst savedMode = localStorage.getItem(\n\t\t\tSTORAGE_KEY_MODE,\n\t\t) as ThemeMode | null;\n\n\t\tif (savedColor) setSourceColor(savedColor);\n\t\tif (savedMode === \"light\" || savedMode === \"dark\") setMode(savedMode);\n\n\t\tsetIsHydrated(true);\n\t}, [persistToLocalStorage]);\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\n\t\tapplyTheme(sourceColor, mode);\n\n\t\tif (persistToLocalStorage) {\n\t\t\tlocalStorage.setItem(STORAGE_KEY_COLOR, sourceColor);\n\t\t\tlocalStorage.setItem(STORAGE_KEY_MODE, mode);\n\t\t}\n\t}, [sourceColor, mode, persistToLocalStorage, isHydrated]);\n\n\treturn (\n\t\t<ThemeContext.Provider\n\t\t\tvalue={{ sourceColor, setSourceColor, mode, setMode }}\n\t\t>\n\t\t\t{children}\n\t\t</ThemeContext.Provider>\n\t);\n}\n\nexport function useTheme(): ThemeContextValue {\n\tconst context = useContext(ThemeContext);\n\tif (!context) {\n\t\tthrow new Error(\"useTheme must be used within <MD3ThemeProvider>.\");\n\t}\n\treturn context;\n}\n\nexport function useThemeMode(): Pick<ThemeContextValue, \"mode\" | \"setMode\"> {\n\tconst { mode, setMode } = useTheme();\n\treturn { mode, setMode };\n}\n","/**\n * @file toc.tsx\n *\n * Table of Contents component for long-form documentation pages.\n *\n * Uses `IntersectionObserver` to track which section heading is currently in the\n * viewport and highlights the corresponding link. Smooth-scrolls to the target\n * when a link is clicked (respecting the browser's `prefers-reduced-motion`\n * media query via the native `scrollIntoView` API).\n *\n * @remarks\n * - SSR-safe: `IntersectionObserver` usage is guarded by a `typeof` check.\n * - The observer `rootMargin` is tuned for documentation layout with a fixed header\n * (~100px) and early deactivation (~80% from bottom) so the active item changes\n * before the section scrolls off-screen.\n */\n\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A single entry in the Table of Contents.\n *\n * @example\n * ```ts\n * const items: ToCItem[] = [\n * { id: \"installation\", label: \"Installation\" },\n * { id: \"usage\", label: \"Usage\" },\n * ];\n * ```\n */\nexport interface ToCItem {\n\t/** The DOM `id` attribute of the corresponding section heading. */\n\tid: string;\n\t/** Human-readable label shown in the ToC. */\n\tlabel: string;\n}\n\n/**\n * Props for the `TableOfContents` component.\n */\nexport interface TableOfContentsProps {\n\t/**\n\t * Ordered list of section items to display.\n\t * Each item must have a matching DOM element with the same `id`.\n\t */\n\titems: ToCItem[];\n\t/**\n\t * Additional CSS classes applied to the root `<nav>` element.\n\t * Use this to control positioning (e.g. sticky, fixed) from the consumer.\n\t */\n\tclassName?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Table of Contents sidebar component.\n *\n * Renders a `<nav>` sidebar with links to page sections. Tracks the active\n * section using `IntersectionObserver` and applies active styles to the\n * current link.\n *\n * @remarks\n * - Visible only on `xl` screens (`hidden xl:block` — sticky sidebar).\n * - The `aria-current` attribute is set on the active link for screen readers.\n * - Click scroll is smooth: `scrollIntoView({ behavior: \"smooth\" })`.\n *\n * @example\n * ```tsx\n * const toc: ToCItem[] = [\n * { id: \"overview\", label: \"Overview\" },\n * { id: \"props\", label: \"Props\" },\n * { id: \"examples\", label: \"Examples\" },\n * ];\n *\n * <TableOfContents items={toc} />\n * ```\n *\n * @see https://m3.material.io/foundations/content-design/navigation\n */\nexport function TableOfContents({ items, className }: TableOfContentsProps) {\n\tconst [activeId, setActiveId] = useState(\"\");\n\n\t// Stabilize dependency — re-subscribe only when the item IDs actually change.\n\tconst itemIds = useMemo(() => items.map((i) => i.id), [items]);\n\n\tuseEffect(() => {\n\t\t// SSR guard: IntersectionObserver is not available in Node.js.\n\t\tif (typeof IntersectionObserver === \"undefined\") return;\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tif (entry.isIntersecting) setActiveId(entry.target.id);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// rootMargin: top offset ~100px (fixed header), bottom -80% (early switch)\n\t\t\t{ rootMargin: \"-100px 0% -80% 0%\" },\n\t\t);\n\n\t\tfor (const id of itemIds) {\n\t\t\tconst el = document.getElementById(id);\n\t\t\tif (el) observer.observe(el);\n\t\t}\n\n\t\treturn () => observer.disconnect();\n\t}, [itemIds]);\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n\t\t\te.preventDefault();\n\t\t\tdocument\n\t\t\t\t.getElementById(id)\n\t\t\t\t?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<nav aria-label=\"On this page\" className={cn(\"pl-6\", className)}>\n\t\t\t<h4 className=\"text-xs font-bold text-m3-on-surface-variant uppercase tracking-widest mb-4 sm:hidden lg:block\">\n\t\t\t\tOn this page\n\t\t\t</h4>\n\t\t\t<ul className=\"space-y-4\">\n\t\t\t\t{items.map((item) => (\n\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={`#${item.id}`}\n\t\t\t\t\t\t\tonClick={(e) => handleClick(e, item.id)}\n\t\t\t\t\t\t\taria-current={activeId === item.id ? \"true\" : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-sm transition-colors hover:text-m3-primary block\",\n\t\t\t\t\t\t\t\tactiveId === item.id\n\t\t\t\t\t\t\t\t\t? \"text-m3-primary font-bold\"\n\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant font-medium\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</nav>\n\t);\n}\n","export const TooltipTokens = {\n\tPlainTooltip: {\n\t\tcontainerColor: \"var(--md-sys-color-inverse-surface)\", // #322F35 light / #E6E1E5 dark\n\t\ttextColor: \"var(--md-sys-color-inverse-on-surface)\", // #F5EFF7 light / #322F35 dark\n\t\tshape: \"rounded-[4px]\", // CornerExtraSmall = 4dp\n\t\tfont: \"text-[12px] font-normal tracking-[0.4px] leading-[16px]\", // BodySmall\n\t\theight: \"min-h-6\", // 24dp min height\n\t\tpadding: \"px-2 py-1\", // 8dp all sides\n\t\tmaxWidth: \"max-w-50\",\n\t},\n\tRichTooltip: {\n\t\tcontainerColor: \"var(--md-sys-color-surface-container)\",\n\t\televation: \"shadow-md\", // ElevationTokens.Level2 (approximate with shadow-md)\n\t\tshape: \"rounded-[12px]\", // CornerMedium = 12dp\n\t\tpaddingTop: \"pt-3\", // 12dp\n\t\tpaddingBottom: \"pb-2\", // 8dp\n\t\tpaddingX: \"px-4\", // 16dp\n\t\tmaxWidth: \"max-w-80\",\n\t\tsubheadColor: \"var(--md-sys-color-on-surface-variant)\",\n\t\tsubheadFont: \"text-[14px] font-medium leading-[20px]\", // TitleSmall\n\t\tbodyColor: \"var(--md-sys-color-on-surface-variant)\",\n\t\tbodyFont: \"text-[14px] font-normal leading-[20px]\", // BodyMedium\n\t\tactionColor: \"var(--md-sys-color-primary)\",\n\t\tactionFont: \"text-[14px] font-medium leading-[20px]\", // LabelLarge\n\t},\n} as const;\n","export interface TooltipCaretProps {\n\tside: \"top\" | \"bottom\" | \"left\" | \"right\";\n\twidth?: number;\n\theight?: number;\n\tcolor?: string;\n\tcustomPath?: string;\n\tclassName?: string;\n}\n\ntype Side = TooltipCaretProps[\"side\"];\n\nconst CENTER_H = \"left-1/2 -translate-x-1/2\";\nconst CENTER_V = \"top-1/2 -translate-y-1/2 flex items-center justify-center\";\n\nconst POSITION_BY_SIDE: Record<Side, (h: number) => string> = {\n\ttop: (h) => `bottom-[calc(-1*${h}px)] ${CENTER_H}`,\n\tbottom: (h) => `top-[calc(-1*${h}px)] ${CENTER_H}`,\n\tleft: (h) => `right-[calc(-1*${h}px)] ${CENTER_V}`,\n\tright: (h) => `left-[calc(-1*${h}px)] ${CENTER_V}`,\n};\n\nconst ROTATION: Record<Side, string> = {\n\ttop: \"180deg\",\n\tbottom: \"0deg\",\n\tleft: \"90deg\",\n\tright: \"-90deg\",\n};\n\nexport function TooltipCaretShape({\n\tside,\n\twidth = 16,\n\theight = 8,\n\tcolor,\n\tcustomPath,\n\tclassName = \"\",\n}: TooltipCaretProps) {\n\tconst isHorizontal = side === \"left\" || side === \"right\";\n\tconst path =\n\t\tcustomPath ?? `M 0,${height} L ${width / 2},0 L ${width},${height} Z`;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`absolute pointer-events-none z-[-1] ${POSITION_BY_SIDE[side](height)} ${className}`}\n\t\t\tstyle={{\n\t\t\t\twidth: isHorizontal ? height : width,\n\t\t\t\theight: isHorizontal ? width : height,\n\t\t\t\tcolor,\n\t\t\t}}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<svg\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\tviewBox={`0 0 ${width} ${height}`}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={{\n\t\t\t\t\ttransform: `rotate(${ROTATION[side]})`,\n\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<path d={path} />\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from \"react\";\nimport { forwardRef } from \"react\";\nimport { TooltipTokens } from \"./tooltip.tokens\";\nimport type { PlainTooltipProps } from \"./tooltip.types\";\nimport { TooltipCaretShape } from \"./tooltip-caret-shape\";\n\nexport const PlainTooltip = forwardRef<HTMLDivElement, PlainTooltipProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tcaret,\n\t\t\tclassName = \"\",\n\t\t\tmaxWidth,\n\t\t\tcontainerColor,\n\t\t\ttextColor,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tcontainerColor: tokenContainer,\n\t\t\ttextColor: tokenText,\n\t\t\tfont,\n\t\t\tpadding,\n\t\t\tshape,\n\t\t\theight,\n\t\t\tmaxWidth: tokenMaxWidth,\n\t\t} = TooltipTokens.PlainTooltip;\n\n\t\tconst style: CSSProperties = {\n\t\t\t...props.style,\n\t\t\tbackgroundColor: containerColor ?? tokenContainer,\n\t\t\tcolor: textColor ?? tokenText,\n\t\t\t...(maxWidth && { maxWidth }),\n\t\t};\n\n\t\tconst side = props[\"data-side\"] ?? \"top\";\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`relative inline-flex items-center box-border ${shape} ${font} ${padding} ${height} ${!maxWidth ? tokenMaxWidth : \"\"} ${className}`}\n\t\t\t\tstyle={style}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{caret?.enabled && (\n\t\t\t\t\t<TooltipCaretShape\n\t\t\t\t\t\tside={side}\n\t\t\t\t\t\twidth={caret.width}\n\t\t\t\t\t\theight={caret.height}\n\t\t\t\t\t\tcolor={style.backgroundColor as string}\n\t\t\t\t\t\tcustomPath={caret.customPath}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<span className=\"whitespace-normal text-start wrap-break-word\">\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPlainTooltip.displayName = \"PlainTooltip\";\n","import type { CSSProperties } from \"react\";\nimport { forwardRef } from \"react\";\nimport { TooltipTokens } from \"./tooltip.tokens\";\nimport type { RichTooltipProps } from \"./tooltip.types\";\nimport { TooltipCaretShape } from \"./tooltip-caret-shape\";\n\nexport const RichTooltip = forwardRef<HTMLDivElement, RichTooltipProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\ttitle,\n\t\t\taction,\n\t\t\tcaret,\n\t\t\tclassName = \"\",\n\t\t\tmaxWidth,\n\t\t\tcolors = {},\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tcontainerColor: tokenContainer,\n\t\t\televation,\n\t\t\tshape,\n\t\t\tpaddingTop,\n\t\t\tpaddingBottom,\n\t\t\tpaddingX,\n\t\t\tmaxWidth: tokenMaxWidth,\n\t\t\tsubheadColor,\n\t\t\tsubheadFont,\n\t\t\tbodyColor,\n\t\t\tbodyFont,\n\t\t\tactionColor,\n\t\t\tactionFont,\n\t\t} = TooltipTokens.RichTooltip;\n\n\t\tconst containerStyle: CSSProperties = {\n\t\t\t...props.style,\n\t\t\tbackgroundColor: colors.container ?? tokenContainer,\n\t\t\t...(maxWidth && { maxWidth }),\n\t\t};\n\n\t\tconst side = props[\"data-side\"] ?? \"top\";\n\n\t\tconst titleColor = colors.title ?? subheadColor;\n\t\tconst bodyColorResolved = colors.body ?? bodyColor;\n\t\tconst actionColorResolved = colors.action ?? actionColor;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`relative box-border flex flex-col ${shape} ${elevation} ${paddingTop} ${paddingBottom} ${paddingX} ${!maxWidth ? tokenMaxWidth : \"\"} ${className}`}\n\t\t\t\tstyle={containerStyle}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{caret?.enabled && (\n\t\t\t\t\t<TooltipCaretShape\n\t\t\t\t\t\tside={side}\n\t\t\t\t\t\twidth={caret.width}\n\t\t\t\t\t\theight={caret.height}\n\t\t\t\t\t\tcolor={containerStyle.backgroundColor as string}\n\t\t\t\t\t\tcustomPath={caret.customPath}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{title && (\n\t\t\t\t\t<div className={`mb-1 ${subheadFont}`} style={{ color: titleColor }}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{children && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`whitespace-normal text-start wrap-break-word ${bodyFont}`}\n\t\t\t\t\t\tstyle={{ color: bodyColorResolved }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{action && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`mt-2 flex min-h-9 flex-wrap items-center gap-2 ${actionFont}`}\n\t\t\t\t\t\tstyle={{ color: actionColorResolved }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{action}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nRichTooltip.displayName = \"RichTooltip\";\n","import { useEffect, useLayoutEffect, useState } from \"react\";\nimport type { TooltipPlacement } from \"./tooltip.types\";\n\ninterface PositionState {\n\ttop: number;\n\tleft: number;\n\tactualSide: \"top\" | \"bottom\" | \"left\" | \"right\";\n}\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nconst VIEWPORT_PADDING = 8;\n\nconst useIsomorphicLayoutEffect =\n\ttypeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nfunction resolveAutoPlacement(\n\tspaceTop: number,\n\tspaceBottom: number,\n\tspaceLeft: number,\n\tspaceRight: number,\n\ttooltipWidth: number,\n\ttooltipHeight: number,\n\tspacing: number,\n): Side {\n\tif (spaceTop >= tooltipHeight + spacing) return \"top\";\n\tif (spaceBottom >= tooltipHeight + spacing) return \"bottom\";\n\tif (spaceLeft >= tooltipWidth + spacing) return \"left\";\n\tif (spaceRight >= tooltipWidth + spacing) return \"right\";\n\treturn \"top\";\n}\n\nfunction resolveActualSide(\n\ttargetPlacement: Side,\n\tspaceTop: number,\n\tspaceBottom: number,\n\tspaceLeft: number,\n\tspaceRight: number,\n\ttooltipWidth: number,\n\ttooltipHeight: number,\n\tspacing: number,\n): Side {\n\tconst needsHeight = tooltipHeight + spacing;\n\tconst needsWidth = tooltipWidth + spacing;\n\n\tif (targetPlacement === \"top\")\n\t\treturn spaceTop < needsHeight && spaceBottom >= needsHeight\n\t\t\t? \"bottom\"\n\t\t\t: \"top\";\n\tif (targetPlacement === \"bottom\")\n\t\treturn spaceBottom < needsHeight && spaceTop >= needsHeight\n\t\t\t? \"top\"\n\t\t\t: \"bottom\";\n\tif (targetPlacement === \"left\")\n\t\treturn spaceLeft < needsWidth && spaceRight >= needsWidth\n\t\t\t? \"right\"\n\t\t\t: \"left\";\n\treturn spaceRight < needsWidth && spaceLeft >= needsWidth ? \"left\" : \"right\";\n}\n\nfunction calculateXY(\n\tside: Side,\n\tanchorRect: DOMRect,\n\ttooltipWidth: number,\n\ttooltipHeight: number,\n\tspacing: number,\n): { top: number; left: number } {\n\tconst anchorCenterX = anchorRect.left + anchorRect.width / 2;\n\tconst anchorCenterY = anchorRect.top + anchorRect.height / 2;\n\n\tif (side === \"top\")\n\t\treturn {\n\t\t\ttop: anchorRect.top - tooltipHeight - spacing,\n\t\t\tleft: anchorCenterX - tooltipWidth / 2,\n\t\t};\n\tif (side === \"bottom\")\n\t\treturn {\n\t\t\ttop: anchorRect.bottom + spacing,\n\t\t\tleft: anchorCenterX - tooltipWidth / 2,\n\t\t};\n\tif (side === \"left\")\n\t\treturn {\n\t\t\ttop: anchorCenterY - tooltipHeight / 2,\n\t\t\tleft: anchorRect.left - tooltipWidth - spacing,\n\t\t};\n\treturn {\n\t\ttop: anchorCenterY - tooltipHeight / 2,\n\t\tleft: anchorRect.right + spacing,\n\t};\n}\n\nfunction clampToViewport(\n\tside: Side,\n\ttop: number,\n\tleft: number,\n\ttooltipWidth: number,\n\ttooltipHeight: number,\n): { top: number; left: number } {\n\tconst isVertical = side === \"top\" || side === \"bottom\";\n\tconst viewportWidth = window.innerWidth;\n\tconst viewportHeight = window.innerHeight;\n\n\tif (isVertical) {\n\t\tleft = Math.max(\n\t\t\tVIEWPORT_PADDING,\n\t\t\tMath.min(left, viewportWidth - VIEWPORT_PADDING - tooltipWidth),\n\t\t);\n\t} else {\n\t\ttop = Math.max(\n\t\t\tVIEWPORT_PADDING,\n\t\t\tMath.min(top, viewportHeight - VIEWPORT_PADDING - tooltipHeight),\n\t\t);\n\t}\n\n\treturn { top, left };\n}\n\nexport function useTooltipPosition(\n\tanchorRef: React.RefObject<HTMLElement | null>,\n\ttooltipRef: React.RefObject<HTMLElement | null>,\n\tplacement: TooltipPlacement,\n\tspacing: number,\n\tisVisible: boolean,\n): PositionState {\n\tconst [position, setPosition] = useState<PositionState>({\n\t\ttop: -9999,\n\t\tleft: -9999,\n\t\tactualSide: placement === \"auto\" ? \"top\" : placement,\n\t});\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tif (!isVisible || !anchorRef.current || !tooltipRef.current) return;\n\n\t\tconst calculatePosition = () => {\n\t\t\tconst anchorEl = anchorRef.current;\n\t\t\tconst tooltipEl = tooltipRef.current;\n\t\t\tif (!anchorEl || !tooltipEl) return;\n\n\t\t\tconst anchorRect = anchorEl.getBoundingClientRect();\n\t\t\tconst tooltipRect = tooltipEl.getBoundingClientRect();\n\t\t\tconst tooltipWidth = tooltipRect.width;\n\t\t\tconst tooltipHeight = tooltipRect.height;\n\n\t\t\tconst spaceTop = anchorRect.top;\n\t\t\tconst spaceBottom = window.innerHeight - anchorRect.bottom;\n\t\t\tconst spaceLeft = anchorRect.left;\n\t\t\tconst spaceRight = window.innerWidth - anchorRect.right;\n\n\t\t\tconst targetSide: Side =\n\t\t\t\tplacement === \"auto\"\n\t\t\t\t\t? resolveAutoPlacement(\n\t\t\t\t\t\t\tspaceTop,\n\t\t\t\t\t\t\tspaceBottom,\n\t\t\t\t\t\t\tspaceLeft,\n\t\t\t\t\t\t\tspaceRight,\n\t\t\t\t\t\t\ttooltipWidth,\n\t\t\t\t\t\t\ttooltipHeight,\n\t\t\t\t\t\t\tspacing,\n\t\t\t\t\t\t)\n\t\t\t\t\t: placement;\n\n\t\t\tconst actualSide = resolveActualSide(\n\t\t\t\ttargetSide,\n\t\t\t\tspaceTop,\n\t\t\t\tspaceBottom,\n\t\t\t\tspaceLeft,\n\t\t\t\tspaceRight,\n\t\t\t\ttooltipWidth,\n\t\t\t\ttooltipHeight,\n\t\t\t\tspacing,\n\t\t\t);\n\n\t\t\tconst { top, left } = calculateXY(\n\t\t\t\tactualSide,\n\t\t\t\tanchorRect,\n\t\t\t\ttooltipWidth,\n\t\t\t\ttooltipHeight,\n\t\t\t\tspacing,\n\t\t\t);\n\t\t\tconst clamped = clampToViewport(\n\t\t\t\tactualSide,\n\t\t\t\ttop,\n\t\t\t\tleft,\n\t\t\t\ttooltipWidth,\n\t\t\t\ttooltipHeight,\n\t\t\t);\n\n\t\t\tsetPosition({ ...clamped, actualSide });\n\t\t};\n\n\t\tcalculatePosition();\n\n\t\twindow.addEventListener(\"resize\", calculatePosition);\n\t\twindow.addEventListener(\"scroll\", calculatePosition, true);\n\n\t\tconst resizeObserver = new ResizeObserver(calculatePosition);\n\t\tif (anchorRef.current) resizeObserver.observe(anchorRef.current);\n\t\tif (tooltipRef.current) resizeObserver.observe(tooltipRef.current);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"resize\", calculatePosition);\n\t\t\twindow.removeEventListener(\"scroll\", calculatePosition, true);\n\t\t\tresizeObserver.disconnect();\n\t\t};\n\t}, [isVisible, placement, spacing, anchorRef, tooltipRef]);\n\n\treturn position;\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport type { TooltipState, TooltipStateConfig } from \"./tooltip.types\";\n\nconst activeTooltipDismissals = new Set<() => void>();\n\nexport function useTooltipState(config?: TooltipStateConfig): TooltipState {\n\tconst {\n\t\tinitialVisible = false,\n\t\tisPersistent = false,\n\t\tduration = 1500,\n\t} = config ?? {};\n\n\tconst [isVisible, setIsVisible] = useState(initialVisible);\n\n\tconst dismiss = useCallback(() => {\n\t\tsetIsVisible(false);\n\t\tactiveTooltipDismissals.delete(dismiss);\n\t}, []);\n\n\tconst show = useCallback(() => {\n\t\tfor (const otherDismiss of activeTooltipDismissals) {\n\t\t\tif (otherDismiss !== dismiss) otherDismiss();\n\t\t}\n\t\tsetIsVisible(true);\n\t\tactiveTooltipDismissals.add(dismiss);\n\t}, [dismiss]);\n\n\tuseEffect(() => {\n\t\tif (!isVisible || isPersistent) return;\n\t\tconst timeoutId = setTimeout(dismiss, duration);\n\t\treturn () => clearTimeout(timeoutId);\n\t}, [isVisible, isPersistent, duration, dismiss]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tactiveTooltipDismissals.delete(dismiss);\n\t\t};\n\t}, [dismiss]);\n\n\treturn { isVisible, show, dismiss };\n}\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport {\n\tcloneElement,\n\ttype ReactElement,\n\tuseEffect,\n\tuseId,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { TooltipBoxProps } from \"./tooltip.types\";\nimport { useTooltipPosition } from \"./use-tooltip-position\";\nimport { useTooltipState } from \"./use-tooltip-state\";\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nconst TRANSFORM_ORIGIN: Record<Side, string> = {\n\ttop: \"50% 100%\",\n\tbottom: \"50% 0%\",\n\tleft: \"100% 50%\",\n\tright: \"0% 50%\",\n};\n\nconst MOTION_VARIANTS = {\n\tfull: {\n\t\thidden: { opacity: 0, scale: 0.8 },\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\tscale: 1,\n\t\t\ttransition: {\n\t\t\t\topacity: { duration: 0.1, ease: \"easeOut\" },\n\t\t\t\tscale: { type: \"spring\", stiffness: 900, damping: 90, mass: 0.5 },\n\t\t\t},\n\t\t},\n\t\texit: {\n\t\t\topacity: 0,\n\t\t\tscale: 0.8,\n\t\t\ttransition: {\n\t\t\t\topacity: { duration: 0.075, ease: \"easeIn\" },\n\t\t\t\tscale: { duration: 0.1, ease: \"easeIn\" },\n\t\t\t},\n\t\t},\n\t},\n\treduced: {\n\t\thidden: { opacity: 0 },\n\t\tvisible: { opacity: 1, transition: { duration: 0.15 } },\n\t\texit: { opacity: 0, transition: { duration: 0.1 } },\n\t},\n} as const;\n\nfunction clearTimeout(ref: React.MutableRefObject<number | null>) {\n\tif (ref.current !== null) window.clearTimeout(ref.current);\n}\n\nexport function TooltipBox({\n\tchildren,\n\ttooltip,\n\tplacement = \"top\",\n\ttrigger = [\"hover\", \"focus\"],\n\tstate: controlledState,\n\tspacingFromAnchor = 4,\n\tdisabled = false,\n\tclassName = \"\",\n\tshowDelay = 400,\n\thideDelay = 200,\n\t\"aria-label\": ariaLabel,\n}: TooltipBoxProps) {\n\tconst internalState = useTooltipState();\n\tconst state = controlledState ?? internalState;\n\n\tconst anchorRef = useRef<HTMLDivElement>(null);\n\tconst tooltipRef = useRef<HTMLDivElement>(null);\n\tconst hoverTimeoutRef = useRef<number | null>(null);\n\tconst hideTimeoutRef = useRef<number | null>(null);\n\tconst pressTimeoutRef = useRef<number | null>(null);\n\n\tconst triggers = Array.isArray(trigger) ? trigger : [trigger];\n\n\tconst [mounted, setMounted] = useState(false);\n\tconst [hasHoverSupport, setHasHoverSupport] = useState(true);\n\tconst [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetMounted(true);\n\t\tsetHasHoverSupport(!window.matchMedia(\"(hover: none)\").matches);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tsetPrefersReducedMotion(mediaQuery.matches);\n\t\tconst onChange = (e: MediaQueryListEvent) =>\n\t\t\tsetPrefersReducedMotion(e.matches);\n\t\tmediaQuery.addEventListener(\"change\", onChange);\n\t\treturn () => mediaQuery.removeEventListener(\"change\", onChange);\n\t}, []);\n\n\tconst position = useTooltipPosition(\n\t\tanchorRef,\n\t\ttooltipRef,\n\t\tplacement,\n\t\tspacingFromAnchor,\n\t\tstate.isVisible,\n\t);\n\n\tconst canHover = !disabled && hasHoverSupport && triggers.includes(\"hover\");\n\tconst canClick = !disabled && triggers.includes(\"click\");\n\n\tconst handlePointerEnter = () => {\n\t\tif (!canHover) return;\n\t\tclearTimeout(hoverTimeoutRef);\n\t\tclearTimeout(hideTimeoutRef);\n\t\thoverTimeoutRef.current = window.setTimeout(() => state.show(), showDelay);\n\t};\n\n\tconst handlePointerLeave = () => {\n\t\tif (!canHover) return;\n\t\tclearTimeout(hoverTimeoutRef);\n\t\thideTimeoutRef.current = window.setTimeout(\n\t\t\t() => state.dismiss(),\n\t\t\thideDelay,\n\t\t);\n\t};\n\n\tconst handleFocus = () => {\n\t\tif (disabled || !triggers.includes(\"focus\")) return;\n\t\tstate.show();\n\t};\n\n\tconst handleBlur = (e: React.FocusEvent) => {\n\t\tif (disabled) return;\n\t\tconst focusMovedInside =\n\t\t\ttooltipRef.current &&\n\t\t\t(e.relatedTarget === tooltipRef.current ||\n\t\t\t\ttooltipRef.current.contains(e.relatedTarget as Node));\n\t\tif (focusMovedInside) return;\n\t\tstate.dismiss();\n\t};\n\n\tconst handlePointerDown = (e: React.PointerEvent) => {\n\t\tif (\n\t\t\tdisabled ||\n\t\t\t!triggers.includes(\"long-press\") ||\n\t\t\te.pointerType === \"mouse\"\n\t\t)\n\t\t\treturn;\n\t\tclearTimeout(pressTimeoutRef);\n\t\tpressTimeoutRef.current = window.setTimeout(() => state.show(), 500);\n\t};\n\n\tconst handleClick = () => {\n\t\tif (!canClick) return;\n\t\tif (state.isVisible) state.dismiss();\n\t\telse state.show();\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (disabled || !canClick) return;\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\thandleClick();\n\t\t}\n\t};\n\n\tconst handleContextMenu = (e: React.MouseEvent) => {\n\t\tif (triggers.includes(\"long-press\") && state.isVisible) e.preventDefault();\n\t};\n\n\tconst handleTooltipPointerEnter = () => {\n\t\tif (!canHover) return;\n\t\tclearTimeout(hideTimeoutRef);\n\t};\n\n\tconst handleTooltipPointerLeave = () => {\n\t\tif (!canHover) return;\n\t\thideTimeoutRef.current = window.setTimeout(\n\t\t\t() => state.dismiss(),\n\t\t\thideDelay,\n\t\t);\n\t};\n\n\tuseEffect(() => {\n\t\tif (!state.isVisible) return;\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tstate.dismiss();\n\t\t\t\tanchorRef.current?.focus();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", onKeyDown);\n\t}, [state.isVisible, state]);\n\n\tconst tooltipId = useId();\n\n\tconst tooltipWithProps = cloneElement(\n\t\ttooltip as ReactElement<{\n\t\t\t\"data-side\"?: Side;\n\t\t\tid?: string;\n\t\t\trole?: string;\n\t\t\tonBlur?: (e: React.FocusEvent) => void;\n\t\t}>,\n\t\t{\n\t\t\t\"data-side\": position.actualSide,\n\t\t\tid: tooltipId,\n\t\t\trole: \"tooltip\",\n\t\t\tonBlur: handleBlur,\n\t\t},\n\t);\n\n\tconst variants = prefersReducedMotion\n\t\t? MOTION_VARIANTS.reduced\n\t\t: MOTION_VARIANTS.full;\n\n\treturn (\n\t\t<>\n\t\t\t<Slot\n\t\t\t\tref={anchorRef}\n\t\t\t\tclassName={`inline-flex ${className}`}\n\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\tonFocus={handleFocus}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\tonPointerUp={() => clearTimeout(pressTimeoutRef)}\n\t\t\t\tonPointerCancel={() => clearTimeout(pressTimeoutRef)}\n\t\t\t\tonContextMenu={handleContextMenu}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-describedby={state.isVisible ? tooltipId : undefined}\n\t\t\t>\n\t\t\t\t{React.isValidElement(children) ? children : <span>{children}</span>}\n\t\t\t</Slot>\n\n\t\t\t{mounted &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t\t{state.isVisible && !disabled && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tref={tooltipRef}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\tvariants={variants}\n\t\t\t\t\t\t\t\tonPointerEnter={handleTooltipPointerEnter}\n\t\t\t\t\t\t\t\tonPointerLeave={handleTooltipPointerLeave}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\t\t\ttransformOrigin: TRANSFORM_ORIGIN[position.actualSide],\n\t\t\t\t\t\t\t\t\tzIndex: 50,\n\t\t\t\t\t\t\t\t\tpointerEvents: \"auto\",\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{tooltipWithProps}\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t</>\n\t);\n}\n","/**\n * TypeScaleTokens - MD3 Expressive Typography Physical Tokens\n *\n * Port of androidx.compose.material3.tokens.TypeScaleTokens\n * Adapted for Web with Google Sans Flex Variable Font (ROND axis = 100).\n *\n * All font sizes use rem units based on 14px root (project default).\n * Reference: Material Design 3 Type Scale Tokens spec.\n */\n\nconst font = \"'Google Sans Flex', system-ui, sans-serif\";\n\nexport const TypeScaleTokens = {\n\t// ─── DISPLAY ────────────────────────────────────────────────────────────────\n\tDisplayLargeFont: font,\n\tDisplayLargeWeight: 400,\n\tDisplayLargeSize: \"3.571rem\", // 57sp → ~57px / 14 = 4.071, MD3 uses 57px on 16px base → 3.5625rem\n\tDisplayLargeLineHeight: \"4rem\", // 64px\n\tDisplayLargeTracking: \"-0.25px\",\n\n\tDisplayMediumFont: font,\n\tDisplayMediumWeight: 400,\n\tDisplayMediumSize: \"2.857rem\", // 45px\n\tDisplayMediumLineHeight: \"3.286rem\", // 52px\n\tDisplayMediumTracking: \"0px\",\n\n\tDisplaySmallFont: font,\n\tDisplaySmallWeight: 400,\n\tDisplaySmallSize: \"2.571rem\", // 36px\n\tDisplaySmallLineHeight: \"3.143rem\", // 44px\n\tDisplaySmallTracking: \"0px\",\n\n\t// ─── HEADLINE ───────────────────────────────────────────────────────────────\n\tHeadlineLargeFont: font,\n\tHeadlineLargeWeight: 400,\n\tHeadlineLargeSize: \"2.286rem\", // 32px\n\tHeadlineLargeLineHeight: \"2.857rem\", // 40px\n\tHeadlineLargeTracking: \"0px\",\n\n\tHeadlineMediumFont: font,\n\tHeadlineMediumWeight: 400,\n\tHeadlineMediumSize: \"2rem\", // 28px\n\tHeadlineMediumLineHeight: \"2.571rem\", // 36px\n\tHeadlineMediumTracking: \"0px\",\n\n\tHeadlineSmallFont: font,\n\tHeadlineSmallWeight: 400,\n\tHeadlineSmallSize: \"1.714rem\", // 24px\n\tHeadlineSmallLineHeight: \"2.286rem\", // 32px\n\tHeadlineSmallTracking: \"0px\",\n\n\t// ─── TITLE ──────────────────────────────────────────────────────────────────\n\tTitleLargeFont: font,\n\tTitleLargeWeight: 400,\n\tTitleLargeSize: \"1.571rem\", // 22px\n\tTitleLargeLineHeight: \"2rem\", // 28px\n\tTitleLargeTracking: \"0px\",\n\n\tTitleMediumFont: font,\n\tTitleMediumWeight: 500,\n\tTitleMediumSize: \"1.143rem\", // 16px\n\tTitleMediumLineHeight: \"1.714rem\", // 24px\n\tTitleMediumTracking: \"0.15px\",\n\n\tTitleSmallFont: font,\n\tTitleSmallWeight: 500,\n\tTitleSmallSize: \"1rem\", // 14px\n\tTitleSmallLineHeight: \"1.429rem\", // 20px\n\tTitleSmallTracking: \"0.1px\",\n\n\t// ─── BODY ───────────────────────────────────────────────────────────────────\n\tBodyLargeFont: font,\n\tBodyLargeWeight: 400,\n\tBodyLargeSize: \"1.143rem\", // 16px\n\tBodyLargeLineHeight: \"1.714rem\", // 24px\n\tBodyLargeTracking: \"0.5px\",\n\n\tBodyMediumFont: font,\n\tBodyMediumWeight: 400,\n\tBodyMediumSize: \"1rem\", // 14px\n\tBodyMediumLineHeight: \"1.429rem\", // 20px\n\tBodyMediumTracking: \"0.25px\",\n\n\tBodySmallFont: font,\n\tBodySmallWeight: 400,\n\tBodySmallSize: \"0.857rem\", // 12px\n\tBodySmallLineHeight: \"1.143rem\", // 16px\n\tBodySmallTracking: \"0.4px\",\n\n\t// ─── LABEL ──────────────────────────────────────────────────────────────────\n\tLabelLargeFont: font,\n\tLabelLargeWeight: 500,\n\tLabelLargeSize: \"1rem\", // 14px\n\tLabelLargeLineHeight: \"1.429rem\", // 20px\n\tLabelLargeTracking: \"0.1px\",\n\n\tLabelMediumFont: font,\n\tLabelMediumWeight: 500,\n\tLabelMediumSize: \"0.857rem\", // 12px\n\tLabelMediumLineHeight: \"1.143rem\", // 16px\n\tLabelMediumTracking: \"0.5px\",\n\n\tLabelSmallFont: font,\n\tLabelSmallWeight: 500,\n\tLabelSmallSize: \"0.786rem\", // 11px\n\tLabelSmallLineHeight: \"1.143rem\", // 16px\n\tLabelSmallTracking: \"0.5px\",\n\n\t// ─── EMPHASIZED (MD3 Expressive) ────────────────────────────────────────────\n\t// Emphasized styles share Font/Size/LineHeight/Tracking with baseline.\n\t// Only fontWeight is elevated to create visual emphasis.\n\t// Source: TypographyTokens.kt (Emphasized entries reference same scale)\n\n\tDisplayLargeEmphasizedFont: font,\n\tDisplayLargeEmphasizedWeight: 800,\n\tDisplayLargeEmphasizedSize: \"3.571rem\",\n\tDisplayLargeEmphasizedLineHeight: \"4rem\",\n\tDisplayLargeEmphasizedTracking: \"-0.25px\",\n\n\tDisplayMediumEmphasizedFont: font,\n\tDisplayMediumEmphasizedWeight: 800,\n\tDisplayMediumEmphasizedSize: \"2.857rem\",\n\tDisplayMediumEmphasizedLineHeight: \"3.286rem\",\n\tDisplayMediumEmphasizedTracking: \"0px\",\n\n\tDisplaySmallEmphasizedFont: font,\n\tDisplaySmallEmphasizedWeight: 800,\n\tDisplaySmallEmphasizedSize: \"2.571rem\",\n\tDisplaySmallEmphasizedLineHeight: \"3.143rem\",\n\tDisplaySmallEmphasizedTracking: \"0px\",\n\n\tHeadlineLargeEmphasizedFont: font,\n\tHeadlineLargeEmphasizedWeight: 800,\n\tHeadlineLargeEmphasizedSize: \"2.286rem\",\n\tHeadlineLargeEmphasizedLineHeight: \"2.857rem\",\n\tHeadlineLargeEmphasizedTracking: \"0px\",\n\n\tHeadlineMediumEmphasizedFont: font,\n\tHeadlineMediumEmphasizedWeight: 800,\n\tHeadlineMediumEmphasizedSize: \"2rem\",\n\tHeadlineMediumEmphasizedLineHeight: \"2.571rem\",\n\tHeadlineMediumEmphasizedTracking: \"0px\",\n\n\tHeadlineSmallEmphasizedFont: font,\n\tHeadlineSmallEmphasizedWeight: 800,\n\tHeadlineSmallEmphasizedSize: \"1.714rem\",\n\tHeadlineSmallEmphasizedLineHeight: \"2.286rem\",\n\tHeadlineSmallEmphasizedTracking: \"0px\",\n\n\tTitleLargeEmphasizedFont: font,\n\tTitleLargeEmphasizedWeight: 700,\n\tTitleLargeEmphasizedSize: \"1.571rem\",\n\tTitleLargeEmphasizedLineHeight: \"2rem\",\n\tTitleLargeEmphasizedTracking: \"0px\",\n\n\tTitleMediumEmphasizedFont: font,\n\tTitleMediumEmphasizedWeight: 700,\n\tTitleMediumEmphasizedSize: \"1.143rem\",\n\tTitleMediumEmphasizedLineHeight: \"1.714rem\",\n\tTitleMediumEmphasizedTracking: \"0.15px\",\n\n\tTitleSmallEmphasizedFont: font,\n\tTitleSmallEmphasizedWeight: 700,\n\tTitleSmallEmphasizedSize: \"1rem\",\n\tTitleSmallEmphasizedLineHeight: \"1.429rem\",\n\tTitleSmallEmphasizedTracking: \"0.1px\",\n\n\tBodyLargeEmphasizedFont: font,\n\tBodyLargeEmphasizedWeight: 700,\n\tBodyLargeEmphasizedSize: \"1.143rem\",\n\tBodyLargeEmphasizedLineHeight: \"1.714rem\",\n\tBodyLargeEmphasizedTracking: \"0.5px\",\n\n\tBodyMediumEmphasizedFont: font,\n\tBodyMediumEmphasizedWeight: 700,\n\tBodyMediumEmphasizedSize: \"1rem\",\n\tBodyMediumEmphasizedLineHeight: \"1.429rem\",\n\tBodyMediumEmphasizedTracking: \"0.25px\",\n\n\tBodySmallEmphasizedFont: font,\n\tBodySmallEmphasizedWeight: 700,\n\tBodySmallEmphasizedSize: \"0.857rem\",\n\tBodySmallEmphasizedLineHeight: \"1.143rem\",\n\tBodySmallEmphasizedTracking: \"0.4px\",\n\n\tLabelLargeEmphasizedFont: font,\n\tLabelLargeEmphasizedWeight: 800,\n\tLabelLargeEmphasizedSize: \"1rem\",\n\tLabelLargeEmphasizedLineHeight: \"1.429rem\",\n\tLabelLargeEmphasizedTracking: \"0.1px\",\n\n\tLabelMediumEmphasizedFont: font,\n\tLabelMediumEmphasizedWeight: 800,\n\tLabelMediumEmphasizedSize: \"0.857rem\",\n\tLabelMediumEmphasizedLineHeight: \"1.143rem\",\n\tLabelMediumEmphasizedTracking: \"0.5px\",\n\n\tLabelSmallEmphasizedFont: font,\n\tLabelSmallEmphasizedWeight: 800,\n\tLabelSmallEmphasizedSize: \"0.786rem\",\n\tLabelSmallEmphasizedLineHeight: \"1.143rem\",\n\tLabelSmallEmphasizedTracking: \"0.5px\",\n} as const;\n\nexport type TypeScaleTokensType = typeof TypeScaleTokens;\n","/**\n * TypographyKeyTokens - MD3 Expressive Typography Key Tokens Enum\n *\n * Port of androidx.compose.material3.tokens.TypographyKeyTokens (Kotlin enum class).\n * Used to reference a specific TextStyle via Typography.fromToken().\n *\n * Contains 30 keys: 15 baseline + 15 emphasized (MD3 Expressive).\n */\nexport enum TypographyKeyTokens {\n\t// ─── Baseline (15) ──────────────────────────────────────────────────────\n\tBodyLarge = \"BodyLarge\",\n\tBodyMedium = \"BodyMedium\",\n\tBodySmall = \"BodySmall\",\n\tDisplayLarge = \"DisplayLarge\",\n\tDisplayMedium = \"DisplayMedium\",\n\tDisplaySmall = \"DisplaySmall\",\n\tHeadlineLarge = \"HeadlineLarge\",\n\tHeadlineMedium = \"HeadlineMedium\",\n\tHeadlineSmall = \"HeadlineSmall\",\n\tLabelLarge = \"LabelLarge\",\n\tLabelMedium = \"LabelMedium\",\n\tLabelSmall = \"LabelSmall\",\n\tTitleLarge = \"TitleLarge\",\n\tTitleMedium = \"TitleMedium\",\n\tTitleSmall = \"TitleSmall\",\n\n\t// ─── Emphasized (15) - MD3 Expressive ───────────────────────────────────\n\tBodyLargeEmphasized = \"BodyLargeEmphasized\",\n\tBodyMediumEmphasized = \"BodyMediumEmphasized\",\n\tBodySmallEmphasized = \"BodySmallEmphasized\",\n\tDisplayLargeEmphasized = \"DisplayLargeEmphasized\",\n\tDisplayMediumEmphasized = \"DisplayMediumEmphasized\",\n\tDisplaySmallEmphasized = \"DisplaySmallEmphasized\",\n\tHeadlineLargeEmphasized = \"HeadlineLargeEmphasized\",\n\tHeadlineMediumEmphasized = \"HeadlineMediumEmphasized\",\n\tHeadlineSmallEmphasized = \"HeadlineSmallEmphasized\",\n\tLabelLargeEmphasized = \"LabelLargeEmphasized\",\n\tLabelMediumEmphasized = \"LabelMediumEmphasized\",\n\tLabelSmallEmphasized = \"LabelSmallEmphasized\",\n\tTitleLargeEmphasized = \"TitleLargeEmphasized\",\n\tTitleMediumEmphasized = \"TitleMediumEmphasized\",\n\tTitleSmallEmphasized = \"TitleSmallEmphasized\",\n}\n","/**\n * @file typography-tokens.ts\n * @description MD3 Expressive Typography Token Definitions.\n *\n * Port of `androidx.compose.material3.tokens.TypographyTokens` (Kotlin class).\n *\n * ### Memory Optimization\n * All 30 `TextStyle` properties are implemented as **lazy getters** — they are\n * computed on first access and cached, rather than being computed eagerly at\n * construction time. This reduces the instantiation cost of `TypographyTokens`.\n *\n * ### Variable Font Axes\n * Supports customizable CSS `font-variation-settings` via {@link FontVariationAxes}.\n * - Default `ROND` value is `100` (maximum roundness of Google Sans Flex).\n * - Other axes remain at font defaults unless explicitly overridden.\n *\n * @example Basic usage (default tokens)\n * ```ts\n * const tokens = new TypographyTokens();\n * const style = tokens.BodyLarge; // { fontSize, fontWeight, ... }\n * ```\n *\n * @example Custom font family\n * ```ts\n * const tokens = new TypographyTokens({ fontFamily: \"'Inter', sans-serif\" });\n * ```\n *\n * @example Custom ROND axis (partial roundness)\n * ```ts\n * const tokens = new TypographyTokens({ fontVariationAxes: { ROND: 50 } });\n * ```\n */\n\nimport { TypeScaleTokens } from \"./type-scale-tokens\";\n\n// ─── Font Variation ───────────────────────────────────────────────────────────\n\n/**\n * Configurable axes for CSS `font-variation-settings`.\n *\n * Each key maps to a named variable font axis. Any axis not specified falls\n * back to the font's own default value.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings\n *\n * @example\n * ```ts\n * const axes: FontVariationAxes = { ROND: 100, wght: 600 };\n * ```\n */\nexport interface FontVariationAxes {\n\t/**\n\t * Roundness axis of Google Sans Flex Variable Font.\n\t * Range: `0` (sharp corners) – `100` (fully rounded).\n\t * @default 100\n\t */\n\tROND?: number;\n\t/**\n\t * Weight axis. Overrides `font-weight` via variation settings.\n\t * @default font default\n\t */\n\twght?: number;\n\t/**\n\t * Width axis. Controls glyph condensation/expansion.\n\t * @default font default\n\t */\n\twdth?: number;\n\t/** Any additional named variation axis supported by the font. */\n\t[axis: string]: number | undefined;\n}\n\n/**\n * Default font variation axes for MD3 Expressive.\n * Sets `ROND` to `100` for maximum roundness; all other axes use font defaults.\n */\nexport const DEFAULT_FONT_VARIATION_AXES: Readonly<FontVariationAxes> =\n\tObject.freeze({ ROND: 100 });\n\n/**\n * Serializes a {@link FontVariationAxes} map into a CSS `font-variation-settings` string.\n *\n * @example\n * ```ts\n * serializeFontVariationAxes({ ROND: 100, wght: 700 });\n * // → '\"ROND\" 100, \"wght\" 700'\n * ```\n */\nexport function serializeFontVariationAxes(axes: FontVariationAxes): string {\n\treturn Object.entries(axes)\n\t\t.filter(([, v]) => v !== undefined)\n\t\t.map(([k, v]) => `\"${k}\" ${v}`)\n\t\t.join(\", \");\n}\n\n/**\n * Pre-computed default `font-variation-settings` string.\n * Equivalent to `'\"ROND\" 100'`.\n */\nexport const MD3_EXPRESSIVE_FONT_VARIATION: string = serializeFontVariationAxes(\n\tDEFAULT_FONT_VARIATION_AXES,\n);\n\n// ─── TextStyle ────────────────────────────────────────────────────────────────\n\n/**\n * Web equivalent of Compose's `TextStyle`.\n *\n * All properties are readonly and map directly to CSS font properties.\n * The `fontVariationSettings` field carries the serialized variable-font axes.\n */\nexport interface TextStyle {\n\t/** CSS `font-family` value. */\n\treadonly fontFamily: string;\n\t/** CSS `font-weight` numeric value (e.g. `400`, `700`). */\n\treadonly fontWeight: number;\n\t/** CSS `font-size` in `rem` units. */\n\treadonly fontSize: string;\n\t/** CSS `line-height` in `rem` units. */\n\treadonly lineHeight: string;\n\t/** CSS `letter-spacing` in `px` units. */\n\treadonly letterSpacing: string;\n\t/**\n\t * CSS `font-variation-settings` string.\n\t * @example '\"ROND\" 100'\n\t * @example '\"ROND\" 50, \"wght\" 600'\n\t */\n\treadonly fontVariationSettings: string;\n}\n\n// ─── TypographyTokens Options ─────────────────────────────────────────────────\n\n/**\n * Constructor options for {@link TypographyTokens}.\n */\nexport interface TypographyTokensOptions {\n\t/**\n\t * Custom CSS `font-family` string. When provided, overrides the default\n\t * Google Sans Flex font for all token styles.\n\t *\n\t * @example \"'Roboto', sans-serif\"\n\t */\n\tfontFamily?: string;\n\t/**\n\t * Variable font axes to apply via `font-variation-settings`.\n\t * Merged on top of {@link DEFAULT_FONT_VARIATION_AXES}.\n\t * Provide only the axes you want to override.\n\t *\n\t * @example { ROND: 0 } // sharp corners\n\t */\n\tfontVariationAxes?: FontVariationAxes;\n}\n\n// ─── Internal factory ─────────────────────────────────────────────────────────\n\ntype TokenRecord = Record<string, string | number>;\n\n/**\n * Creates a frozen {@link TextStyle} from the {@link TypeScaleTokens} lookup\n * using the given token prefix (e.g. `\"BodyLarge\"`).\n *\n * @internal\n */\nfunction buildStyle(\n\tprefix: string,\n\tfontFamily: string | undefined,\n\tfontVariationSettings: string,\n): TextStyle {\n\tconst t = TypeScaleTokens as TokenRecord;\n\treturn Object.freeze({\n\t\tfontFamily: fontFamily ?? (t[`${prefix}Font`] as string),\n\t\tfontWeight: t[`${prefix}Weight`] as number,\n\t\tfontSize: t[`${prefix}Size`] as string,\n\t\tlineHeight: t[`${prefix}LineHeight`] as string,\n\t\tletterSpacing: t[`${prefix}Tracking`] as string,\n\t\tfontVariationSettings,\n\t});\n}\n\n// ─── TypographyTokens ─────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive Typography Token class.\n *\n * Port of `internal class TypographyTokens(val fontFamily: FontFamily? = null)`\n * from `androidx.compose.material3.tokens.TypographyTokens`.\n *\n * Provides 30 pre-defined {@link TextStyle} properties (15 baseline + 15 emphasized),\n * each implemented as a **lazy getter** — computed once on first access, then cached.\n *\n * ### Customization\n * Pass {@link TypographyTokensOptions} to the constructor to override:\n * - `fontFamily` — swap the typeface\n * - `fontVariationAxes` — control variable font axes (e.g., `ROND`)\n *\n * @example Default\n * ```ts\n * const tokens = new TypographyTokens();\n * ```\n *\n * @example Custom font + half-rounded\n * ```ts\n * const tokens = new TypographyTokens({\n * fontFamily: \"'Inter', sans-serif\",\n * fontVariationAxes: { ROND: 50 },\n * });\n * ```\n */\nexport class TypographyTokens {\n\treadonly #fontFamily: string | undefined;\n\treadonly #fontVariationSettings: string;\n\n\tconstructor(options: TypographyTokensOptions | string = {}) {\n\t\t// Support legacy string signature: new TypographyTokens(\"'Inter', sans-serif\")\n\t\tif (typeof options === \"string\") {\n\t\t\tthis.#fontFamily = options;\n\t\t\tthis.#fontVariationSettings = MD3_EXPRESSIVE_FONT_VARIATION;\n\t\t} else {\n\t\t\tthis.#fontFamily = options.fontFamily;\n\t\t\tconst axes: FontVariationAxes = options.fontVariationAxes\n\t\t\t\t? { ...DEFAULT_FONT_VARIATION_AXES, ...options.fontVariationAxes }\n\t\t\t\t: DEFAULT_FONT_VARIATION_AXES;\n\t\t\tthis.#fontVariationSettings = serializeFontVariationAxes(axes);\n\t\t}\n\t}\n\n\t// Helper to lazily build + cache a style on first access\n\t#cache: Map<string, TextStyle> = new Map();\n\t#get(prefix: string): TextStyle {\n\t\tlet style = this.#cache.get(prefix);\n\t\tif (!style) {\n\t\t\tstyle = buildStyle(prefix, this.#fontFamily, this.#fontVariationSettings);\n\t\t\tthis.#cache.set(prefix, style);\n\t\t}\n\t\treturn style;\n\t}\n\n\t// ─── Baseline Styles (15) ──────────────────────────────────────────────────\n\t/** Display Large – `57px`, weight 400 */\n\tget DisplayLarge(): TextStyle {\n\t\treturn this.#get(\"DisplayLarge\");\n\t}\n\t/** Display Medium – `45px`, weight 400 */\n\tget DisplayMedium(): TextStyle {\n\t\treturn this.#get(\"DisplayMedium\");\n\t}\n\t/** Display Small – `36px`, weight 400 */\n\tget DisplaySmall(): TextStyle {\n\t\treturn this.#get(\"DisplaySmall\");\n\t}\n\t/** Headline Large – `32px`, weight 400 */\n\tget HeadlineLarge(): TextStyle {\n\t\treturn this.#get(\"HeadlineLarge\");\n\t}\n\t/** Headline Medium – `28px`, weight 400 */\n\tget HeadlineMedium(): TextStyle {\n\t\treturn this.#get(\"HeadlineMedium\");\n\t}\n\t/** Headline Small – `24px`, weight 400 */\n\tget HeadlineSmall(): TextStyle {\n\t\treturn this.#get(\"HeadlineSmall\");\n\t}\n\t/** Title Large – `22px`, weight 400 */\n\tget TitleLarge(): TextStyle {\n\t\treturn this.#get(\"TitleLarge\");\n\t}\n\t/** Title Medium – `16px`, weight 500 */\n\tget TitleMedium(): TextStyle {\n\t\treturn this.#get(\"TitleMedium\");\n\t}\n\t/** Title Small – `14px`, weight 500 */\n\tget TitleSmall(): TextStyle {\n\t\treturn this.#get(\"TitleSmall\");\n\t}\n\t/** Body Large – `16px`, weight 400 */\n\tget BodyLarge(): TextStyle {\n\t\treturn this.#get(\"BodyLarge\");\n\t}\n\t/** Body Medium – `14px`, weight 400 */\n\tget BodyMedium(): TextStyle {\n\t\treturn this.#get(\"BodyMedium\");\n\t}\n\t/** Body Small – `12px`, weight 400 */\n\tget BodySmall(): TextStyle {\n\t\treturn this.#get(\"BodySmall\");\n\t}\n\t/** Label Large – `14px`, weight 500 */\n\tget LabelLarge(): TextStyle {\n\t\treturn this.#get(\"LabelLarge\");\n\t}\n\t/** Label Medium – `12px`, weight 500 */\n\tget LabelMedium(): TextStyle {\n\t\treturn this.#get(\"LabelMedium\");\n\t}\n\t/** Label Small – `11px`, weight 500 */\n\tget LabelSmall(): TextStyle {\n\t\treturn this.#get(\"LabelSmall\");\n\t}\n\n\t// ─── Emphasized Styles (15) – MD3 Expressive ──────────────────────────────\n\t/** Display Large Emphasized – `57px`, weight 800 */\n\tget DisplayLargeEmphasized(): TextStyle {\n\t\treturn this.#get(\"DisplayLargeEmphasized\");\n\t}\n\t/** Display Medium Emphasized – `45px`, weight 800 */\n\tget DisplayMediumEmphasized(): TextStyle {\n\t\treturn this.#get(\"DisplayMediumEmphasized\");\n\t}\n\t/** Display Small Emphasized – `36px`, weight 800 */\n\tget DisplaySmallEmphasized(): TextStyle {\n\t\treturn this.#get(\"DisplaySmallEmphasized\");\n\t}\n\t/** Headline Large Emphasized – `32px`, weight 800 */\n\tget HeadlineLargeEmphasized(): TextStyle {\n\t\treturn this.#get(\"HeadlineLargeEmphasized\");\n\t}\n\t/** Headline Medium Emphasized – `28px`, weight 800 */\n\tget HeadlineMediumEmphasized(): TextStyle {\n\t\treturn this.#get(\"HeadlineMediumEmphasized\");\n\t}\n\t/** Headline Small Emphasized – `24px`, weight 800 */\n\tget HeadlineSmallEmphasized(): TextStyle {\n\t\treturn this.#get(\"HeadlineSmallEmphasized\");\n\t}\n\t/** Title Large Emphasized – `22px`, weight 700 */\n\tget TitleLargeEmphasized(): TextStyle {\n\t\treturn this.#get(\"TitleLargeEmphasized\");\n\t}\n\t/** Title Medium Emphasized – `16px`, weight 700 */\n\tget TitleMediumEmphasized(): TextStyle {\n\t\treturn this.#get(\"TitleMediumEmphasized\");\n\t}\n\t/** Title Small Emphasized – `14px`, weight 700 */\n\tget TitleSmallEmphasized(): TextStyle {\n\t\treturn this.#get(\"TitleSmallEmphasized\");\n\t}\n\t/** Body Large Emphasized – `16px`, weight 700 */\n\tget BodyLargeEmphasized(): TextStyle {\n\t\treturn this.#get(\"BodyLargeEmphasized\");\n\t}\n\t/** Body Medium Emphasized – `14px`, weight 700 */\n\tget BodyMediumEmphasized(): TextStyle {\n\t\treturn this.#get(\"BodyMediumEmphasized\");\n\t}\n\t/** Body Small Emphasized – `12px`, weight 700 */\n\tget BodySmallEmphasized(): TextStyle {\n\t\treturn this.#get(\"BodySmallEmphasized\");\n\t}\n\t/** Label Large Emphasized – `14px`, weight 800 */\n\tget LabelLargeEmphasized(): TextStyle {\n\t\treturn this.#get(\"LabelLargeEmphasized\");\n\t}\n\t/** Label Medium Emphasized – `12px`, weight 800 */\n\tget LabelMediumEmphasized(): TextStyle {\n\t\treturn this.#get(\"LabelMediumEmphasized\");\n\t}\n\t/** Label Small Emphasized – `11px`, weight 800 */\n\tget LabelSmallEmphasized(): TextStyle {\n\t\treturn this.#get(\"LabelSmallEmphasized\");\n\t}\n}\n","/**\n * @file typography.tsx\n * @description MD3 Expressive Typography System for React.\n *\n * Port of `androidx.compose.material3.Typography` (Kotlin `@Immutable` class).\n *\n * Provides 30 {@link TextStyle} definitions via the React Context API, mirroring\n * the Compose `LocalTypography` / `MaterialTheme.typography` pattern.\n *\n * ### Memory & Performance Optimizations\n * - The `Typography` class delegates all property access to a `TypographyTokens`\n * instance that uses **lazy getters**, so styles are computed only on first use.\n * - `TypographyProvider` memoizes the context value via `useMemo` to prevent\n * unnecessary re-renders downstream.\n *\n * @example Wrap your application\n * ```tsx\n * <TypographyProvider>\n * <App />\n * </TypographyProvider>\n * ```\n *\n * @example Consume in a component\n * ```tsx\n * const typography = useTypography();\n * <p style={typography.bodyLarge}>Hello</p>\n * ```\n *\n * @example Via token key\n * ```tsx\n * const style = typography.fromToken(TypographyKeyTokens.BodyLarge);\n * ```\n *\n * @example Custom font + half-rounded corners\n * ```tsx\n * <TypographyProvider\n * fontFamily=\"'Roboto', sans-serif\"\n * fontVariationAxes={{ ROND: 50 }}\n * >\n * <App />\n * </TypographyProvider>\n * ```\n */\n\nimport { createContext, type ReactNode, useContext, useMemo } from \"react\";\nimport { TypographyKeyTokens } from \"./typography-key-tokens\";\nimport {\n\ttype FontVariationAxes,\n\ttype TextStyle,\n\tTypographyTokens,\n} from \"./typography-tokens\";\n\n// ─── Typography Class ─────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive Typography — port of Compose's `@Immutable class Typography(...)`.\n *\n * All 30 style properties are **readonly** and lazily resolved from the\n * underlying {@link TypographyTokens} instance. Use {@link Typography.copy}\n * to create a customized variant without mutating the original.\n *\n * @example Default\n * ```ts\n * const typography = new Typography();\n * const style = typography.displayLarge; // lazy — computed on first access\n * ```\n *\n * @example Custom tokens\n * ```ts\n * const typography = new Typography(\n * new TypographyTokens({ fontFamily: \"'Inter', sans-serif\", fontVariationAxes: { ROND: 0 } })\n * );\n * ```\n */\nexport class Typography {\n\treadonly #tokens: TypographyTokens;\n\n\tconstructor(tokens: TypographyTokens = defaultTokens) {\n\t\tthis.#tokens = tokens;\n\t}\n\n\t// ─── Baseline Styles ────────────────────────────────────────────────────────\n\n\t/** Display Large text style (`57px`, weight `400`). */\n\tget displayLarge(): TextStyle {\n\t\treturn this.#tokens.DisplayLarge;\n\t}\n\t/** Display Medium text style (`45px`, weight `400`). */\n\tget displayMedium(): TextStyle {\n\t\treturn this.#tokens.DisplayMedium;\n\t}\n\t/** Display Small text style (`36px`, weight `400`). */\n\tget displaySmall(): TextStyle {\n\t\treturn this.#tokens.DisplaySmall;\n\t}\n\t/** Headline Large text style (`32px`, weight `400`). */\n\tget headlineLarge(): TextStyle {\n\t\treturn this.#tokens.HeadlineLarge;\n\t}\n\t/** Headline Medium text style (`28px`, weight `400`). */\n\tget headlineMedium(): TextStyle {\n\t\treturn this.#tokens.HeadlineMedium;\n\t}\n\t/** Headline Small text style (`24px`, weight `400`). */\n\tget headlineSmall(): TextStyle {\n\t\treturn this.#tokens.HeadlineSmall;\n\t}\n\t/** Title Large text style (`22px`, weight `400`). */\n\tget titleLarge(): TextStyle {\n\t\treturn this.#tokens.TitleLarge;\n\t}\n\t/** Title Medium text style (`16px`, weight `500`). */\n\tget titleMedium(): TextStyle {\n\t\treturn this.#tokens.TitleMedium;\n\t}\n\t/** Title Small text style (`14px`, weight `500`). */\n\tget titleSmall(): TextStyle {\n\t\treturn this.#tokens.TitleSmall;\n\t}\n\t/** Body Large text style (`16px`, weight `400`). */\n\tget bodyLarge(): TextStyle {\n\t\treturn this.#tokens.BodyLarge;\n\t}\n\t/** Body Medium text style (`14px`, weight `400`). */\n\tget bodyMedium(): TextStyle {\n\t\treturn this.#tokens.BodyMedium;\n\t}\n\t/** Body Small text style (`12px`, weight `400`). */\n\tget bodySmall(): TextStyle {\n\t\treturn this.#tokens.BodySmall;\n\t}\n\t/** Label Large text style (`14px`, weight `500`). */\n\tget labelLarge(): TextStyle {\n\t\treturn this.#tokens.LabelLarge;\n\t}\n\t/** Label Medium text style (`12px`, weight `500`). */\n\tget labelMedium(): TextStyle {\n\t\treturn this.#tokens.LabelMedium;\n\t}\n\t/** Label Small text style (`11px`, weight `500`). */\n\tget labelSmall(): TextStyle {\n\t\treturn this.#tokens.LabelSmall;\n\t}\n\n\t// ─── Emphasized Styles (MD3 Expressive) ─────────────────────────────────────\n\n\t/** Display Large Emphasized text style (`57px`, weight `800`). */\n\tget displayLargeEmphasized(): TextStyle {\n\t\treturn this.#tokens.DisplayLargeEmphasized;\n\t}\n\t/** Display Medium Emphasized text style (`45px`, weight `800`). */\n\tget displayMediumEmphasized(): TextStyle {\n\t\treturn this.#tokens.DisplayMediumEmphasized;\n\t}\n\t/** Display Small Emphasized text style (`36px`, weight `800`). */\n\tget displaySmallEmphasized(): TextStyle {\n\t\treturn this.#tokens.DisplaySmallEmphasized;\n\t}\n\t/** Headline Large Emphasized text style (`32px`, weight `800`). */\n\tget headlineLargeEmphasized(): TextStyle {\n\t\treturn this.#tokens.HeadlineLargeEmphasized;\n\t}\n\t/** Headline Medium Emphasized text style (`28px`, weight `800`). */\n\tget headlineMediumEmphasized(): TextStyle {\n\t\treturn this.#tokens.HeadlineMediumEmphasized;\n\t}\n\t/** Headline Small Emphasized text style (`24px`, weight `800`). */\n\tget headlineSmallEmphasized(): TextStyle {\n\t\treturn this.#tokens.HeadlineSmallEmphasized;\n\t}\n\t/** Title Large Emphasized text style (`22px`, weight `700`). */\n\tget titleLargeEmphasized(): TextStyle {\n\t\treturn this.#tokens.TitleLargeEmphasized;\n\t}\n\t/** Title Medium Emphasized text style (`16px`, weight `700`). */\n\tget titleMediumEmphasized(): TextStyle {\n\t\treturn this.#tokens.TitleMediumEmphasized;\n\t}\n\t/** Title Small Emphasized text style (`14px`, weight `700`). */\n\tget titleSmallEmphasized(): TextStyle {\n\t\treturn this.#tokens.TitleSmallEmphasized;\n\t}\n\t/** Body Large Emphasized text style (`16px`, weight `700`). */\n\tget bodyLargeEmphasized(): TextStyle {\n\t\treturn this.#tokens.BodyLargeEmphasized;\n\t}\n\t/** Body Medium Emphasized text style (`14px`, weight `700`). */\n\tget bodyMediumEmphasized(): TextStyle {\n\t\treturn this.#tokens.BodyMediumEmphasized;\n\t}\n\t/** Body Small Emphasized text style (`12px`, weight `700`). */\n\tget bodySmallEmphasized(): TextStyle {\n\t\treturn this.#tokens.BodySmallEmphasized;\n\t}\n\t/** Label Large Emphasized text style (`14px`, weight `800`). */\n\tget labelLargeEmphasized(): TextStyle {\n\t\treturn this.#tokens.LabelLargeEmphasized;\n\t}\n\t/** Label Medium Emphasized text style (`12px`, weight `800`). */\n\tget labelMediumEmphasized(): TextStyle {\n\t\treturn this.#tokens.LabelMediumEmphasized;\n\t}\n\t/** Label Small Emphasized text style (`11px`, weight `800`). */\n\tget labelSmallEmphasized(): TextStyle {\n\t\treturn this.#tokens.LabelSmallEmphasized;\n\t}\n\n\t// ─── Methods ─────────────────────────────────────────────────────────────────\n\n\t/**\n\t * Returns the `TextStyle` corresponding to the given {@link TypographyKeyTokens}.\n\t *\n\t * Port of `internal fun Typography.fromToken(value: TypographyKeyTokens): TextStyle`.\n\t *\n\t * @example\n\t * ```ts\n\t * const style = typography.fromToken(TypographyKeyTokens.BodyLarge);\n\t * ```\n\t */\n\tfromToken(value: TypographyKeyTokens): TextStyle {\n\t\treturn this[TOKEN_TO_PROP[value]];\n\t}\n\n\t/**\n\t * Creates a new `Typography` instance with the specified property overrides\n\t * merged on top of the current instance's styles.\n\t *\n\t * Port of Compose's `fun Typography.copy(...)`.\n\t *\n\t * Unlike a shallow `Object.assign`, this method preserves the lazy-getter\n\t * architecture — overridden styles are stored separately and looked up first\n\t * on each property access, while non-overridden styles continue to be\n\t * resolved from the underlying {@link TypographyTokens}.\n\t *\n\t * @param overrides - Map of camelCase property names to partial `TextStyle` overrides.\n\t * @returns A new `Typography` instance. The original is never mutated.\n\t *\n\t * @example\n\t * ```ts\n\t * const custom = typography.copy({ bodyLarge: { fontSize: \"2rem\" } });\n\t * custom.bodyLarge.fontSize; // \"2rem\"\n\t * custom.bodySmall.fontSize; // original token value — untouched\n\t * ```\n\t */\n\tcopy(\n\t\toverrides: Partial<Record<TypographyStyleKey, Partial<TextStyle>>>,\n\t): Typography {\n\t\treturn new OverriddenTypography(this.#tokens, this, overrides);\n\t}\n}\n\n// ─── TypographyStyleKey ───────────────────────────────────────────────────────\n\n/**\n * Union of all camelCase property names on {@link Typography} that return a\n * {@link TextStyle}. Used as the key type for `copy()` overrides and the\n * `OverriddenTypography` resolver.\n */\ntype TypographyStyleKey = {\n\t[K in keyof Typography]: Typography[K] extends TextStyle ? K : never;\n}[keyof Typography];\n\n// ─── OverriddenTypography ─────────────────────────────────────────────────────\n\n/**\n * Internal subclass used by {@link Typography.copy}.\n *\n * Holds a map of explicit style overrides. Each getter checks for an override\n * first; if none exists, it falls through to the parent {@link Typography}.\n *\n * @internal\n */\nclass OverriddenTypography extends Typography {\n\treadonly #base: Typography;\n\treadonly #overrides: Partial<Record<TypographyStyleKey, Partial<TextStyle>>>;\n\n\tconstructor(\n\t\ttokens: TypographyTokens,\n\t\tbase: Typography,\n\t\toverrides: Partial<Record<TypographyStyleKey, Partial<TextStyle>>>,\n\t) {\n\t\tsuper(tokens);\n\t\tthis.#base = base;\n\t\tthis.#overrides = overrides;\n\t}\n\n\t#resolve(key: TypographyStyleKey): TextStyle {\n\t\tconst override = this.#overrides[key];\n\t\tconst base = (this.#base as unknown as Record<string, TextStyle>)[key];\n\t\treturn override ? { ...base, ...override } : base;\n\t}\n\n\t// ─── Baseline\n\toverride get displayLarge() {\n\t\treturn this.#resolve(\"displayLarge\");\n\t}\n\toverride get displayMedium() {\n\t\treturn this.#resolve(\"displayMedium\");\n\t}\n\toverride get displaySmall() {\n\t\treturn this.#resolve(\"displaySmall\");\n\t}\n\toverride get headlineLarge() {\n\t\treturn this.#resolve(\"headlineLarge\");\n\t}\n\toverride get headlineMedium() {\n\t\treturn this.#resolve(\"headlineMedium\");\n\t}\n\toverride get headlineSmall() {\n\t\treturn this.#resolve(\"headlineSmall\");\n\t}\n\toverride get titleLarge() {\n\t\treturn this.#resolve(\"titleLarge\");\n\t}\n\toverride get titleMedium() {\n\t\treturn this.#resolve(\"titleMedium\");\n\t}\n\toverride get titleSmall() {\n\t\treturn this.#resolve(\"titleSmall\");\n\t}\n\toverride get bodyLarge() {\n\t\treturn this.#resolve(\"bodyLarge\");\n\t}\n\toverride get bodyMedium() {\n\t\treturn this.#resolve(\"bodyMedium\");\n\t}\n\toverride get bodySmall() {\n\t\treturn this.#resolve(\"bodySmall\");\n\t}\n\toverride get labelLarge() {\n\t\treturn this.#resolve(\"labelLarge\");\n\t}\n\toverride get labelMedium() {\n\t\treturn this.#resolve(\"labelMedium\");\n\t}\n\toverride get labelSmall() {\n\t\treturn this.#resolve(\"labelSmall\");\n\t}\n\t// ─── Emphasized\n\toverride get displayLargeEmphasized() {\n\t\treturn this.#resolve(\"displayLargeEmphasized\");\n\t}\n\toverride get displayMediumEmphasized() {\n\t\treturn this.#resolve(\"displayMediumEmphasized\");\n\t}\n\toverride get displaySmallEmphasized() {\n\t\treturn this.#resolve(\"displaySmallEmphasized\");\n\t}\n\toverride get headlineLargeEmphasized() {\n\t\treturn this.#resolve(\"headlineLargeEmphasized\");\n\t}\n\toverride get headlineMediumEmphasized() {\n\t\treturn this.#resolve(\"headlineMediumEmphasized\");\n\t}\n\toverride get headlineSmallEmphasized() {\n\t\treturn this.#resolve(\"headlineSmallEmphasized\");\n\t}\n\toverride get titleLargeEmphasized() {\n\t\treturn this.#resolve(\"titleLargeEmphasized\");\n\t}\n\toverride get titleMediumEmphasized() {\n\t\treturn this.#resolve(\"titleMediumEmphasized\");\n\t}\n\toverride get titleSmallEmphasized() {\n\t\treturn this.#resolve(\"titleSmallEmphasized\");\n\t}\n\toverride get bodyLargeEmphasized() {\n\t\treturn this.#resolve(\"bodyLargeEmphasized\");\n\t}\n\toverride get bodyMediumEmphasized() {\n\t\treturn this.#resolve(\"bodyMediumEmphasized\");\n\t}\n\toverride get bodySmallEmphasized() {\n\t\treturn this.#resolve(\"bodySmallEmphasized\");\n\t}\n\toverride get labelLargeEmphasized() {\n\t\treturn this.#resolve(\"labelLargeEmphasized\");\n\t}\n\toverride get labelMediumEmphasized() {\n\t\treturn this.#resolve(\"labelMediumEmphasized\");\n\t}\n\toverride get labelSmallEmphasized() {\n\t\treturn this.#resolve(\"labelSmallEmphasized\");\n\t}\n}\n\n// ─── Token → Property lookup (avoids recreating the map on every fromToken call) ──\n\ntype TypographyProp = {\n\t[K in keyof Typography]: Typography[K] extends TextStyle ? K : never;\n}[keyof Typography];\n\nconst TOKEN_TO_PROP: Record<TypographyKeyTokens, TypographyProp> = {\n\t[TypographyKeyTokens.DisplayLarge]: \"displayLarge\",\n\t[TypographyKeyTokens.DisplayMedium]: \"displayMedium\",\n\t[TypographyKeyTokens.DisplaySmall]: \"displaySmall\",\n\t[TypographyKeyTokens.HeadlineLarge]: \"headlineLarge\",\n\t[TypographyKeyTokens.HeadlineMedium]: \"headlineMedium\",\n\t[TypographyKeyTokens.HeadlineSmall]: \"headlineSmall\",\n\t[TypographyKeyTokens.TitleLarge]: \"titleLarge\",\n\t[TypographyKeyTokens.TitleMedium]: \"titleMedium\",\n\t[TypographyKeyTokens.TitleSmall]: \"titleSmall\",\n\t[TypographyKeyTokens.BodyLarge]: \"bodyLarge\",\n\t[TypographyKeyTokens.BodyMedium]: \"bodyMedium\",\n\t[TypographyKeyTokens.BodySmall]: \"bodySmall\",\n\t[TypographyKeyTokens.LabelLarge]: \"labelLarge\",\n\t[TypographyKeyTokens.LabelMedium]: \"labelMedium\",\n\t[TypographyKeyTokens.LabelSmall]: \"labelSmall\",\n\t[TypographyKeyTokens.DisplayLargeEmphasized]: \"displayLargeEmphasized\",\n\t[TypographyKeyTokens.DisplayMediumEmphasized]: \"displayMediumEmphasized\",\n\t[TypographyKeyTokens.DisplaySmallEmphasized]: \"displaySmallEmphasized\",\n\t[TypographyKeyTokens.HeadlineLargeEmphasized]: \"headlineLargeEmphasized\",\n\t[TypographyKeyTokens.HeadlineMediumEmphasized]: \"headlineMediumEmphasized\",\n\t[TypographyKeyTokens.HeadlineSmallEmphasized]: \"headlineSmallEmphasized\",\n\t[TypographyKeyTokens.TitleLargeEmphasized]: \"titleLargeEmphasized\",\n\t[TypographyKeyTokens.TitleMediumEmphasized]: \"titleMediumEmphasized\",\n\t[TypographyKeyTokens.TitleSmallEmphasized]: \"titleSmallEmphasized\",\n\t[TypographyKeyTokens.BodyLargeEmphasized]: \"bodyLargeEmphasized\",\n\t[TypographyKeyTokens.BodyMediumEmphasized]: \"bodyMediumEmphasized\",\n\t[TypographyKeyTokens.BodySmallEmphasized]: \"bodySmallEmphasized\",\n\t[TypographyKeyTokens.LabelLargeEmphasized]: \"labelLargeEmphasized\",\n\t[TypographyKeyTokens.LabelMediumEmphasized]: \"labelMediumEmphasized\",\n\t[TypographyKeyTokens.LabelSmallEmphasized]: \"labelSmallEmphasized\",\n};\n\n// ─── React Context API ────────────────────────────────────────────────────────\n\n/** Singleton default token instance (shared; never mutated). */\nconst defaultTokens = new TypographyTokens();\n\n/**\n * Default {@link Typography} instance used as the context fallback when no\n * `TypographyProvider` is present in the tree.\n *\n * Mirrors `private val LocalTypography = staticCompositionLocalOf { Typography() }`.\n */\nconst defaultTypography = new Typography();\n\n/**\n * React context that holds the current {@link Typography} instance.\n *\n * Port of `internal val LocalTypography = staticCompositionLocalOf { Typography() }`.\n *\n * @internal — Prefer {@link useTypography} and {@link TypographyProvider}.\n */\nexport const TypographyContext = createContext<Typography>(defaultTypography);\n\n/**\n * React hook to access the current {@link Typography} from the nearest\n * {@link TypographyProvider} in the tree. Falls back to the default\n * googleapis Typography when no provider is present.\n *\n * @returns The current `Typography` instance.\n *\n * @example\n * ```tsx\n * const typography = useTypography();\n * <p style={typography.bodyLarge}>Hello</p>\n * ```\n */\nexport function useTypography(): Typography {\n\treturn useContext(TypographyContext);\n}\n\n// ─── TypographyProvider ───────────────────────────────────────────────────────\n\n/**\n * Props for {@link TypographyProvider}.\n */\nexport interface TypographyProviderProps {\n\t/** The child tree that will have access to the provided typography. */\n\tchildren: ReactNode;\n\t/**\n\t * A fully custom {@link Typography} instance.\n\t * When provided, `fontFamily` and `fontVariationAxes` are ignored.\n\t */\n\ttypography?: Typography;\n\t/**\n\t * Shorthand to override the CSS `font-family` for all typography styles.\n\t * Ignored when `typography` is provided.\n\t *\n\t * @example \"'Roboto', sans-serif\"\n\t */\n\tfontFamily?: string;\n\t/**\n\t * Variable font axes to apply globally via `font-variation-settings`.\n\t * Merged on top of the defaults (`ROND: 100`). Only the axes you specify\n\t * will be overridden; unspecified axes retain font defaults.\n\t * Ignored when `typography` is provided.\n\t *\n\t * @example { ROND: 50 } // half-rounded\n\t * @example { ROND: 0 } // sharp corners\n\t */\n\tfontVariationAxes?: FontVariationAxes;\n}\n\n/**\n * Typography Provider component.\n *\n * Port of `CompositionLocalProvider(LocalTypography provides typography)`.\n * Wrap your application (or a subtree) to provide MD3 Expressive typography\n * to all descendant components that call {@link useTypography}.\n *\n * The context value is **memoized** — it is only re-computed when `typography`,\n * `fontFamily`, or `fontVariationAxes` change, preventing unnecessary re-renders.\n *\n * @example Default (Google Sans Flex, ROND = 100)\n * ```tsx\n * <TypographyProvider>\n * <App />\n * </TypographyProvider>\n * ```\n *\n * @example Custom font\n * ```tsx\n * <TypographyProvider fontFamily=\"'Inter', sans-serif\">\n * <App />\n * </TypographyProvider>\n * ```\n *\n * @example Partially rounded corners (ROND = 50)\n * ```tsx\n * <TypographyProvider fontVariationAxes={{ ROND: 50 }}>\n * <App />\n * </TypographyProvider>\n * ```\n *\n * @example Fully sharp (ROND = 0) with a custom font\n * ```tsx\n * <TypographyProvider\n * fontFamily=\"'Outfit', sans-serif\"\n * fontVariationAxes={{ ROND: 0 }}\n * >\n * <App />\n * </TypographyProvider>\n * ```\n */\nexport function TypographyProvider({\n\tchildren,\n\ttypography,\n\tfontFamily,\n\tfontVariationAxes,\n}: TypographyProviderProps) {\n\tconst value = useMemo<Typography>(() => {\n\t\tif (typography) return typography;\n\t\tif (fontFamily || fontVariationAxes) {\n\t\t\treturn new Typography(\n\t\t\t\tnew TypographyTokens({ fontFamily, fontVariationAxes }),\n\t\t\t);\n\t\t}\n\t\treturn defaultTypography;\n\t}, [typography, fontFamily, fontVariationAxes]);\n\n\treturn (\n\t\t<TypographyContext.Provider value={value}>\n\t\t\t{children}\n\t\t</TypographyContext.Provider>\n\t);\n}\n"]}
|