@bug-on/m3-expressive 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/buttons.d.mts +26 -5
- package/dist/buttons.d.ts +26 -5
- package/dist/buttons.js +1074 -765
- package/dist/buttons.js.map +1 -1
- package/dist/buttons.mjs +1066 -765
- package/dist/buttons.mjs.map +1 -1
- package/dist/core.js +133 -69
- package/dist/core.js.map +1 -1
- package/dist/core.mjs +133 -69
- package/dist/core.mjs.map +1 -1
- package/dist/feedback.js +132 -69
- package/dist/feedback.js.map +1 -1
- package/dist/feedback.mjs +132 -69
- package/dist/feedback.mjs.map +1 -1
- package/dist/forms.d.mts +2 -2
- package/dist/forms.d.ts +2 -2
- package/dist/forms.js +74 -9
- package/dist/forms.js.map +1 -1
- package/dist/forms.mjs +74 -9
- package/dist/forms.mjs.map +1 -1
- package/dist/{icon-button-D-gs0gfj.d.mts → icon-button-CSsDmuQC.d.mts} +19 -0
- package/dist/{icon-button-D-gs0gfj.d.ts → icon-button-CSsDmuQC.d.ts} +19 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2204 -1464
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2056 -1324
- package/dist/index.mjs.map +1 -1
- package/dist/layout.d.mts +18 -1
- package/dist/layout.d.ts +18 -1
- package/dist/layout.js +80 -15
- package/dist/layout.js.map +1 -1
- package/dist/layout.mjs +80 -15
- package/dist/layout.mjs.map +1 -1
- package/dist/navigation.d.mts +134 -9
- package/dist/navigation.d.ts +134 -9
- package/dist/navigation.js +461 -101
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +455 -102
- package/dist/navigation.mjs.map +1 -1
- package/dist/overlays.js +261 -197
- package/dist/overlays.js.map +1 -1
- package/dist/overlays.mjs +223 -159
- package/dist/overlays.mjs.map +1 -1
- package/dist/pickers.js +392 -301
- package/dist/pickers.js.map +1 -1
- package/dist/pickers.mjs +361 -270
- package/dist/pickers.mjs.map +1 -1
- package/dist/{split-button-trailing-uncheckable-BkPbiBo3.d.ts → split-button-trailing-uncheckable-C-qQlyZx.d.ts} +118 -25
- package/dist/{split-button-trailing-uncheckable-D_PLPb-u.d.mts → split-button-trailing-uncheckable-DHJqNeq_.d.mts} +118 -25
- package/dist/{text-field-eAIpz9z1.d.mts → text-field-T4Rg-9Bw.d.mts} +7 -0
- package/dist/{text-field-eAIpz9z1.d.ts → text-field-T4Rg-9Bw.d.ts} +7 -0
- package/package.json +3 -3
package/dist/core.js.map
CHANGED
|
@@ -1 +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/shared/motion-tokens.ts","../src/ui/shared/constants.ts","../src/ui/icon.tsx","../src/ui/ripple.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/shared/touch-target.tsx","../src/ui/buttons/icon-button/icon-button.tsx","../src/ui/snackbar/snackbar.tsx","../src/ui/typography/type-scale-tokens.ts","../src/ui/typography/typography-tokens.ts","../src/ui/typography/typography.tsx","../src/ui/theme-provider/index.tsx"],"names":["useState","useEffect","useRef","useCallback","jsxs","Fragment","jsx","Hct","SchemeTonalSpot","SchemeVibrant","SchemeFidelity","SchemeContent","SchemeMonochrome","SchemeNeutral","SchemeExpressive","hexFromArgb","m","twMerge","clsx","React","LazyMotion","domMax","React2","RippleItem","useReducedMotion","AnimatePresence","useRipple","React3","IndeterminateSvg","DeterminateSvg","React4","React5","React6","FlatLinearTrack","React7","WavyLinearTrack","useMotionValue","animate","useAnimationFrame","React8","React9","React10","_a","_b","React11","Snackbar","createContext","defaultTokens","defaultTypography","useMemo","useContext"],"mappings":"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","file":"core.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * useMediaQuery — SSR-safe responsive hook.\n *\n * Prevents hydration mismatch by initializing with `false`.\n *\n * @example\n * ```tsx\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * ```\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/** Ripple animation duration (ms). Default: 600 */\n\tduration?: number;\n\t/** Ripple color. Default: 'currentColor' */\n\tcolor?: string;\n\t/** Opacity. Default: 0.12 (MD3 standard) */\n\topacity?: number;\n\t/** Disable ripple (e.g. when component is disabled) */\n\tdisabled?: boolean;\n}\n\n/**\n * useRipple — Material Design 3 Expressive Ripple Effect\n *\n * Pure DOM hook with zero external animation dependencies.\n * Note: Requires element to have `position: relative` and `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// Next frame to 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 * Injects preconnect resource hints for Google Fonts CDN into <head>.\n * Place this component AS EARLY AS POSSIBLE in the app tree, ideally\n * directly inside <head> or root layout.\n *\n * WHY THIS MATTERS:\n * If @import url() is inside a CSS file, browser must:\n * 1. Parse HTML -> download JS bundle -> execute CSS -> hit @import -> start Google Fonts connection\n * Preconnect hints allow browser to establish TCP handshake + TLS connection early at step 1,\n * saving 100-500ms connection latency depending on network.\n *\n * USAGE:\n * ```tsx\n * // app/layout.tsx (Next.js) or index.html equivalent\n * import { MaterialSymbolsPreconnect } from '@bug-on/m3-expressive';\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: Use this component only with CDN mode.\n * Self-hosted fonts do not require preconnecting to external origins.\n */\nexport interface MaterialSymbolsPreconnectProps {\n\t/**\n\t * Array of Material Symbols font variants to load.\n\t * Include only variants used by application to minimize bandwidth.\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 for CSS stylesheet */}\n\t\t\t<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n\t\t\t{/* Preconnect for font files — crossorigin required for 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 selected font variants.\n\t\t\t Uses display=swap for performance optimization (Lighthouse/Next.js recommendation).\n\t\t\t Note: May cause brief ligature flicker during initial load. */}\n\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\tHct,\n\thexFromArgb,\n\tSchemeContent,\n\tSchemeExpressive,\n\tSchemeFidelity,\n\tSchemeMonochrome,\n\tSchemeNeutral,\n\tSchemeTonalSpot,\n\tSchemeVibrant,\n} from \"@material/material-color-utilities\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/**\n * Color scheme variants from Material Design 3.\n * - `expressive` — MD3 Expressive 2025: high-chroma, intentionally detached from\n * source color. **Default for this library.**\n * - `tonal_spot` — Standard Android 12+ theme: low-to-medium colorfulness.\n * - `vibrant` — More colorful than tonal_spot, hue from source.\n * - `fidelity` — Stays close to the source color's hue and chroma.\n * - `content` — Similar to fidelity, optimised for image-based content.\n * - `monochrome` — No hue; all grays.\n * - `neutral` — Near-neutral colors with subtle tint.\n */\nexport type SchemeVariant =\n\t| \"expressive\"\n\t| \"tonal_spot\"\n\t| \"vibrant\"\n\t| \"fidelity\"\n\t| \"content\"\n\t| \"monochrome\"\n\t| \"neutral\";\n\n/**\n * Contrast level for the generated scheme.\n * - `-1` — Minimum contrast (accessibility not guaranteed)\n * - `0` — Standard (design as spec'd)\n * - `0.5` — Medium contrast\n * - `1` — Maximum contrast (WCAG AAA)\n */\nexport type ContrastLevel = -1 | 0 | 0.5 | 1;\n\n/**\n * Resolves the effective color scheme from a ThemeMode.\n * When mode is \"system\", reads the OS preference via matchMedia.\n * Returns \"light\" as the safe default in SSR environments.\n */\nexport function resolveMode(mode: ThemeMode): \"light\" | \"dark\" {\n\tif (mode !== \"system\") return mode;\n\tif (typeof window === \"undefined\") return \"light\";\n\treturn window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n\t\t? \"dark\"\n\t\t: \"light\";\n}\n\n// ─── Color Scheme Interface ────────────────────────────────────────────────────\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\t/** Expressive dim tone for primary (v0.4.0+) */\n\tprimaryDim: 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\t/** Expressive dim tone for secondary (v0.4.0+) */\n\tsecondaryDim: 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\t/** Expressive dim tone for tertiary (v0.4.0+) */\n\ttertiaryDim: 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\t/** Dimmed surface — darker than surface, lighter than surface-container. */\n\tsurfaceDim: string;\n\t/** Brightened surface — lighter than surface. */\n\tsurfaceBright: 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// ─── Internal scheme factory ───────────────────────────────────────────────────\n\n/**\n * Creates a `DynamicScheme` subclass instance from a seed hex color using\n * Material Color Utilities v0.4.0. Defaults to Spec 2025 + Expressive variant.\n */\nfunction createDynamicScheme(\n\tsourceColorHex: string,\n\tisDark: boolean,\n\tvariant: SchemeVariant = \"expressive\",\n\tcontrastLevel: ContrastLevel = 0,\n) {\n\tconst hct = Hct.fromInt(argbFromHex(sourceColorHex));\n\tconst spec = \"2025\" as const;\n\n\tswitch (variant) {\n\t\tcase \"tonal_spot\":\n\t\t\treturn new SchemeTonalSpot(hct, isDark, contrastLevel, spec);\n\t\tcase \"vibrant\":\n\t\t\treturn new SchemeVibrant(hct, isDark, contrastLevel, spec);\n\t\tcase \"fidelity\":\n\t\t\treturn new SchemeFidelity(hct, isDark, contrastLevel, spec);\n\t\tcase \"content\":\n\t\t\treturn new SchemeContent(hct, isDark, contrastLevel, spec);\n\t\tcase \"monochrome\":\n\t\t\treturn new SchemeMonochrome(hct, isDark, contrastLevel, spec);\n\t\tcase \"neutral\":\n\t\t\treturn new SchemeNeutral(hct, isDark, contrastLevel, spec);\n\t\tdefault:\n\t\t\treturn new SchemeExpressive(hct, isDark, contrastLevel, spec);\n\t}\n}\n\n/** Parse a hex string (#rrggbb) to ARGB int. */\nfunction argbFromHex(hex: string): number {\n\tconst sanitized = hex.replace(/^#/, \"\");\n\tconst r = Number.parseInt(sanitized.substring(0, 2), 16);\n\tconst g = Number.parseInt(sanitized.substring(2, 4), 16);\n\tconst b = Number.parseInt(sanitized.substring(4, 6), 16);\n\treturn (0xff000000 | (r << 16) | (g << 8) | b) >>> 0;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface GenerateM3ThemeOptions {\n\tvariant?: SchemeVariant;\n\tcontrastLevel?: ContrastLevel;\n}\n\n/**\n * Generate a complete MD3 Expressive color scheme from a seed hex string.\n *\n * Uses Material Color Utilities v0.4.0 with SpecVersion 2025 by default.\n *\n * @param sourceColorHex - Seed color in hex format (e.g. `\"#6750A4\"`).\n * @param mode - Light or dark scheme. Defaults to `\"light\"`.\n * @param options - Optional variant + contrast overrides.\n * - `variant` — defaults to `\"expressive\"` (MD3 Expressive 2025)\n * - `contrastLevel` — defaults to `0` (standard)\n *\n * @example\n * // Backward-compatible call (no options required)\n * generateM3Theme(\"#6750A4\")\n *\n * @example\n * // Expressive with high contrast\n * generateM3Theme(\"#6750A4\", \"dark\", { contrastLevel: 1 })\n */\nexport function generateM3Theme(\n\tsourceColorHex: string,\n\tmode: \"light\" | \"dark\" = \"light\",\n\toptions: GenerateM3ThemeOptions = {},\n): MD3ColorScheme {\n\tconst { variant = \"expressive\", contrastLevel = 0 } = options;\n\tconst isDark = mode === \"dark\";\n\tconst scheme = createDynamicScheme(\n\t\tsourceColorHex,\n\t\tisDark,\n\t\tvariant,\n\t\tcontrastLevel,\n\t);\n\n\tconst hex = (argb: number) => hexFromArgb(argb);\n\n\treturn {\n\t\t// Primary\n\t\tprimary: hex(scheme.primary),\n\t\tonPrimary: hex(scheme.onPrimary),\n\t\tprimaryContainer: hex(scheme.primaryContainer),\n\t\tonPrimaryContainer: hex(scheme.onPrimaryContainer),\n\t\tinversePrimary: hex(scheme.inversePrimary),\n\t\tprimaryFixed: hex(scheme.primaryFixed),\n\t\tprimaryFixedDim: hex(scheme.primaryFixedDim),\n\t\tonPrimaryFixed: hex(scheme.onPrimaryFixed),\n\t\tonPrimaryFixedVariant: hex(scheme.onPrimaryFixedVariant),\n\t\tprimaryDim: hex(scheme.primaryDim),\n\n\t\t// Secondary\n\t\tsecondary: hex(scheme.secondary),\n\t\tonSecondary: hex(scheme.onSecondary),\n\t\tsecondaryContainer: hex(scheme.secondaryContainer),\n\t\tonSecondaryContainer: hex(scheme.onSecondaryContainer),\n\t\tsecondaryFixed: hex(scheme.secondaryFixed),\n\t\tsecondaryFixedDim: hex(scheme.secondaryFixedDim),\n\t\tonSecondaryFixed: hex(scheme.onSecondaryFixed),\n\t\tonSecondaryFixedVariant: hex(scheme.onSecondaryFixedVariant),\n\t\tsecondaryDim: hex(scheme.secondaryDim),\n\n\t\t// Tertiary\n\t\ttertiary: hex(scheme.tertiary),\n\t\tonTertiary: hex(scheme.onTertiary),\n\t\ttertiaryContainer: hex(scheme.tertiaryContainer),\n\t\tonTertiaryContainer: hex(scheme.onTertiaryContainer),\n\t\ttertiaryFixed: hex(scheme.tertiaryFixed),\n\t\ttertiaryFixedDim: hex(scheme.tertiaryFixedDim),\n\t\tonTertiaryFixed: hex(scheme.onTertiaryFixed),\n\t\tonTertiaryFixedVariant: hex(scheme.onTertiaryFixedVariant),\n\t\ttertiaryDim: hex(scheme.tertiaryDim),\n\n\t\t// Error\n\t\terror: hex(scheme.error),\n\t\tonError: hex(scheme.onError),\n\t\terrorContainer: hex(scheme.errorContainer),\n\t\tonErrorContainer: hex(scheme.onErrorContainer),\n\n\t\t// Surface\n\t\tsurface: hex(scheme.surface),\n\t\tonSurface: hex(scheme.onSurface),\n\t\tsurfaceVariant: hex(scheme.surfaceVariant),\n\t\tonSurfaceVariant: hex(scheme.onSurfaceVariant),\n\t\tsurfaceTint: hex(scheme.surfaceTint),\n\t\tsurfaceDim: hex(scheme.surfaceDim),\n\t\tsurfaceBright: hex(scheme.surfaceBright),\n\t\tsurfaceContainerLowest: hex(scheme.surfaceContainerLowest),\n\t\tsurfaceContainerLow: hex(scheme.surfaceContainerLow),\n\t\tsurfaceContainer: hex(scheme.surfaceContainer),\n\t\tsurfaceContainerHigh: hex(scheme.surfaceContainerHigh),\n\t\tsurfaceContainerHighest: hex(scheme.surfaceContainerHighest),\n\n\t\t// Inverse\n\t\tinverseSurface: hex(scheme.inverseSurface),\n\t\tinverseOnSurface: hex(scheme.inverseOnSurface),\n\n\t\t// Background\n\t\tbackground: hex(scheme.background),\n\t\tonBackground: hex(scheme.onBackground),\n\n\t\t// Outline\n\t\toutline: hex(scheme.outline),\n\t\toutlineVariant: hex(scheme.outlineVariant),\n\n\t\t// Utility\n\t\tshadow: hex(scheme.shadow),\n\t\tscrim: hex(scheme.scrim),\n\t};\n}\n\n/**\n * Apply an MD3 Expressive dynamic color scheme to the document root as CSS\n * custom properties.\n *\n * Sets `--md-sys-color-*` tokens (used by components) and\n * `--color-m3-*` tokens (used by Tailwind). Also sets the `data-theme`\n * attribute for dark mode CSS selectors.\n *\n * @param sourceColorHex - Seed color hex string.\n * @param mode - Light/dark/system mode. Defaults to `\"light\"`.\n * @param root - Target element. Defaults to `document.documentElement`.\n * @param options - Optional variant + contrast overrides.\n */\nexport function applyTheme(\n\tsourceColorHex: string,\n\tmode: ThemeMode = \"light\",\n\troot: HTMLElement = document.documentElement,\n\toptions: GenerateM3ThemeOptions = {},\n): void {\n\tconst resolved = resolveMode(mode);\n\tconst colors = generateM3Theme(sourceColorHex, resolved, options);\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\t// data-theme is always \"light\" or \"dark\" — never \"system\"\n\troot.setAttribute(\"data-theme\", resolved);\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 ui/shared/motion-tokens.ts\n *\n * Framer Motion spring presets derived from the official MD3 Expressive\n * motion physics system (May 2025).\n *\n * Usage hierarchy:\n * 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.\n * 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.\n * 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n * @see https://m3.material.io/styles/motion/overview/specs\n */\n\nimport type { Transition } from \"motion/react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Spring Token Structure\n//\n// MD3 defines springs as dampingRatio (0–1) + stiffness.\n// Framer Motion uses absolute `damping` coefficient.\n//\n// Conversion (with Framer's default mass = 1):\n// damping = 2 × dampingRatio × √stiffness\n//\n// Computed values (rounded to 2 decimal places):\n//\n// fast spatial: 2 × 0.6 × √800 = 2 × 0.6 × 28.28 ≈ 33.94\n// fast effects: 2 × 1.0 × √3800 = 2 × 61.64 ≈ 123.29\n// default spatial: 2 × 0.8 × √380 = 2 × 0.8 × 19.49 ≈ 31.19\n// default effects: 2 × 1.0 × √1600 = 2 × 40 = 80\n// slow spatial: 2 × 0.8 × √200 = 2 × 0.8 × 14.14 ≈ 22.63\n// slow effects: 2 × 1.0 × √800 = 2 × 28.28 ≈ 56.57\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Spatial springs — use for position, size, border-radius, rotation, scale ─\n\n/**\n * MD3 Expressive — Fast Spatial Spring\n * `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)\n *\n * Use for: small components (buttons, switches, chips).\n * Has notable bounce/overshoot — feels snappy and expressive.\n */\nexport const FAST_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 33.94,\n} as const;\n\n/**\n * MD3 Expressive — Default Spatial Spring\n * `md.sys.motion.spring.default.spatial` (dampingRatio: 0.8, stiffness: 380)\n *\n * Use for: medium elements (bottom sheets, menus, navigation rail).\n * Gentle overshoot — the go-to spring for most UI animations.\n */\nexport const DEFAULT_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 380,\n\tdamping: 31.19,\n} as const;\n\n/**\n * MD3 Expressive — Slow Spatial Spring\n * `md.sys.motion.spring.slow.spatial` (dampingRatio: 0.8, stiffness: 200)\n *\n * Use for: full-screen transitions and large layout shifts.\n * Subtle, slow overshoot.\n */\nexport const SLOW_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 22.63,\n} as const;\n\n// ── Effects springs — use for color, opacity (critically damped, no bounce) ──\n\n/**\n * MD3 Expressive — Fast Effects Spring\n * `md.sys.motion.spring.fast.effects` (dampingRatio: 1.0, stiffness: 3800)\n *\n * Use for: color changes on switches, icon swaps, badge counts.\n * Critically damped — very fast, no overshoot.\n */\nexport const FAST_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 3800,\n\tdamping: 123.29,\n} as const;\n\n/**\n * MD3 Expressive — Default Effects Spring\n * `md.sys.motion.spring.default.effects` (dampingRatio: 1.0, stiffness: 1600)\n *\n * Use for: opacity fades, color transitions for medium-sized elements.\n * Critically damped — smooth with no overshoot.\n */\nexport const DEFAULT_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 1600,\n\tdamping: 80,\n} as const;\n\n/**\n * MD3 Expressive — Slow Effects Spring\n * `md.sys.motion.spring.slow.effects` (dampingRatio: 1.0, stiffness: 800)\n *\n * Use for: full-screen opacity/color transitions.\n * Critically damped — slow and smooth.\n */\nexport const SLOW_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 56.57,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dynamic helper\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SpringSpeed = \"fast\" | \"default\" | \"slow\";\nexport type SpringAnimationType = \"spatial\" | \"effects\";\n\nconst springMap = {\n\tfast: { spatial: FAST_SPATIAL_SPRING, effects: FAST_EFFECTS_SPRING },\n\tdefault: { spatial: DEFAULT_SPATIAL_SPRING, effects: DEFAULT_EFFECTS_SPRING },\n\tslow: { spatial: SLOW_SPATIAL_SPRING, effects: SLOW_EFFECTS_SPRING },\n} as const;\n\n/**\n * Pick a Framer Motion spring by speed and type.\n *\n * @example\n * ```tsx\n * transition={getMotionSpring(\"fast\", \"spatial\")}\n * ```\n */\nexport function getMotionSpring(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n): Transition {\n\treturn springMap[speed][type];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS transition strings\n// For contexts where Framer Motion is not used (plain CSS / Tailwind).\n// Uses official Web spring → CSS cubic-bezier conversion table.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst CSS_CURVES = {\n\texpressive: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.42, 1.67, 0.21, 0.90)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.38, 1.21, 0.22, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.39, 1.29, 0.35, 0.98)\",\n\t\t\t\tdurationMs: 650,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n\tstandard: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 750,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n} as const;\n\nexport type MotionScheme = \"expressive\" | \"standard\";\n\n/**\n * Returns a CSS `transition` value string using the official MD3 web curve\n * conversion, e.g. `\"500ms cubic-bezier(0.38, 1.21, 0.22, 1.00)\"`.\n *\n * @example\n * ```ts\n * element.style.transition = `border-radius ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n * ```\n */\nexport function getMotionTransitionCSS(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n\tscheme: MotionScheme = \"expressive\",\n): string {\n\tconst { curve, durationMs } = CSS_CURVES[scheme][speed][type];\n\treturn `${durationMs}ms ${curve}`;\n}\n","/**\n * @file shared/constants.ts\n *\n * Shared animation constants for MD3 Expressive UI components.\n * Centralises spring transition configs and motion variant objects to avoid\n * duplication across button, icon-button, FAB, and other interactive components.\n *\n * @see https://m3.material.io/foundations/animation/overview\n */\n\nimport type { Target, TargetAndTransition, Transition } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n} from \"./motion-tokens\";\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tgetMotionSpring,\n\tgetMotionTransitionCSS,\n\tSLOW_EFFECTS_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"./motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast spring — used for border-radius morphing, icon swaps.\n * Maps to MD3 `fast.effects` (critically damped, stiffness 3800).\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Standard spring — used for icon/content scale animations.\n * Maps to MD3 `default.effects` (critically damped, stiffness 1600).\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = DEFAULT_EFFECTS_SPRING;\n\n/**\n * MD3 Expressive spring — active indicator expand/collapse.\n * Maps to MD3 `default.spatial` (dampingRatio: 0.8, stiffness: 380).\n * Gentle bounce for the \"pop\" effect per MD3 Expressive spec.\n */\nexport const SPRING_TRANSITION_EXPRESSIVE: Transition = DEFAULT_SPATIAL_SPRING;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon Span Motion Variants\n// Used for icon/loading indicator swap animation inside FAB and IconButton.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Framer Motion variants for animating icon spans in/out.\n *\n * Scale from near-zero → 1 on enter; back to near-zero on exit.\n * The near-zero value (0.01) avoids the SMIL freeze bug on Chromium\n * that occurs when an element starts at exactly `scale(0)`.\n *\n * @example\n * ```tsx\n * <AnimatePresence mode=\"wait\">\n * {loading ? (\n * <m.span key=\"loading\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * <LoadingIndicator />\n * </m.span>\n * ) : (\n * <m.span key=\"icon\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * {icon}\n * </m.span>\n * )}\n * </AnimatePresence>\n * ```\n */\nexport const ICON_SPAN_VARIANTS: {\n\tinitial: Target;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { scale: 0.01 },\n\tanimate: { scale: 1 },\n\texit: { scale: 0.01 },\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 TextField Animation Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Standard easing curve — used for label float, active indicator expand.\n * cubic-bezier(0.2, 0, 0, 1)\n *\n * @see https://m3.material.io/foundations/animation/easing-and-duration\n */\nexport const MD3_STANDARD_EASING: [number, number, number, number] = [\n\t0.2, 0, 0, 1,\n];\n\n/**\n * Duration for floating label transition: 150ms.\n * Used when label moves between inline position ↔ floated position.\n */\nexport const MD3_LABEL_FLOAT_DURATION = 0.15;\n\n/**\n * Duration for active indicator expand/collapse: 200ms.\n * Used for the bottom border (filled) and outline (outlined) on focus.\n */\nexport const MD3_INDICATOR_DURATION = 0.2;\n\n/**\n * Duration for supporting text / error text appear/disappear: 120ms.\n */\nexport const MD3_SUPPORTING_DURATION = 0.12;\n\n/**\n * Duration for trailing icon appear/disappear (clear button, password toggle): 100ms.\n */\nexport const MD3_ICON_SWAP_DURATION = 0.1;\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SPRING_TRANSITION_FAST } from \"./shared/constants\";\n\n// @internal — font must be loaded via '@bug-on/m3-expressive/material-symbols.css'\nconst VARIANT_FONT: Record<NonNullable<IconProps[\"variant\"]>, string> = {\n\toutlined: \"'Material Symbols Outlined'\",\n\trounded: \"'Material Symbols Rounded'\",\n\tsharp: \"'Material Symbols Sharp'\",\n};\n\n/**\n * Props cho component {@link Icon}.\n *\n * All variable font axes are mapped directly to `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Name of the Material Symbol in snake_case format.\n\t * @example \"home\", \"arrow_forward\", \"settings\"\n\t * @see https://fonts.google.com/icons\n\t */\n\tname: string;\n\n\t/**\n\t * Geometric style variant — maps to font family.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * `FILL` axis. `0` = outlined, `1` = filled.\n\t * Features spring animation when `animateFill` is true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * `wght` axis — stroke weight. Should match surrounding text weight.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * `GRAD` axis — fine-tunes visual weight without affecting layout dimensions.\n\t * Use `-25` on dark backgrounds to offset light halation effects.\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * `opsz` axis — optical size in dp. Used to set `font-size` if `size` is not specified.\n\t * Match rendered pixel size for best quality.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Direct `font-size` override in px. `opsz` axis still respects `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * Enables smooth spring animation when toggling FILL axis (uses `SPRING_TRANSITION_FAST`).\n\t * Requires `motion` dependency.\n\t * @default false\n\t * @example <Icon name=\"favorite\" fill={isLiked ? 1 : 0} animateFill />\n\t */\n\tanimateFill?: boolean;\n}\n\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvariant = \"outlined\",\n\t\t\tfill = 0,\n\t\t\tweight = 400,\n\t\t\tgrade = 0,\n\t\t\topticalSize = 24,\n\t\t\tsize,\n\t\t\tanimateFill = false,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst fontVariationSettings = `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' ${opticalSize}`;\n\n\t\tconst computedStyle: React.CSSProperties = {\n\t\t\tfontFamily: VARIANT_FONT[variant],\n\t\t\tfontSize:\n\t\t\t\tsize === \"inherit\"\n\t\t\t\t\t? \"inherit\"\n\t\t\t\t\t: size != null\n\t\t\t\t\t\t? `${size}px`\n\t\t\t\t\t\t: `${opticalSize}px`,\n\t\t\tfontVariationSettings,\n\t\t\t...style,\n\t\t};\n\n\t\tif (animateFill) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tanimate={{ fontVariationSettings }}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION_FAST}\n\t\t\t\t\t\tstyle={computedStyle}\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: motion v12 HTMLMotionProps conflicts with React's event types\n\t\t\t\t\t\t{...(restProps as any)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</m.span>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={computedStyle}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t);\n\t},\n);\n\nIconComponent.displayName = \"Icon\";\n\n/**\n * Material Symbols (variable font) Icon component.\n *\n * Make sure to import the icon font CSS before usage:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols-cdn.css';\n * ```\n *\n * @remarks\n * - Use snake_case for icon names: `\"arrow_forward\"`, NOT `\"ArrowForward\"`.\n * - `aria-hidden=\"true\"` is attached automatically — provide screen reader labels on parent elements.\n *\n * @example\n * ```tsx\n * // Basic Icon\n * <Icon name=\"home\" />\n *\n * // Visual customization (filled, heavy weight)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animated transition on state change\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // Custom size override\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Combination with other components\n * <Button icon={<Icon name=\"add\" />}>Add to cart</Button>\n * ```\n *\n * @see https://fonts.google.com/icons\n * @see https://m3.material.io/styles/icons/overview\n */\nexport const Icon = React.memo(IconComponent);\n","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","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// Delays <animate> tag insertion by 1 frame via requestAnimationFrame\n\t// to bypass Chromium SMIL freezing bugs when parent container executes CSS transforms/animations.\n\n\tconst [ready, setReady] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tconst raf = requestAnimationFrame(() => setReady(true));\n\t\treturn () => cancelAnimationFrame(raf);\n\t}, []);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t>\n\t\t\t<path d={SHAPE_VALUES.split(\";\")[0]}>\n\t\t\t\t{ready && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={SHAPE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={SHAPE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={SHAPE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<animateTransform\n\t\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\t\tattributeType=\"XML\"\n\t\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={ROTATE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={ROTATE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={ROTATE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</path>\n\t\t</svg>\n\t);\n});\n\n// ─── Determinate SVG (React-controlled morph + counterclockwise rotation) ────\n// Uses CSS transition for smooth d attribute changes where supported (Chromium),\n// with a style-based transform fallback for rotation.\nconst DeterminateSvg = React.memo(function DeterminateSvg({\n\tsize,\n\tprogress,\n}: {\n\tsize: number;\n\tprogress: number;\n}) {\n\t// Clamp and interpolate progress between 0 (circle) and 1 (soft burst)\n\tconst p = Math.min(1, Math.max(0, progress));\n\n\t// Counterclockwise rotation: 0° at 0% → -180° at 100% (per Android spec)\n\tconst rotation = -180 * p;\n\n\t// The path morphs from circle (p=0) to soft-burst (p=1).\n\t// We use a SMIL animate with begin=\"indefinite\" that we snap to progress.\n\t// For maximum compatibility, render the correct endpoint shape based on progress,\n\t// relying on the CSS `d` property transition for smooth animation.\n\tconst pathD = p < 0.5 ? DETERMINATE_CIRCLE : DETERMINATE_SOFT_BURST;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tstyle={{\n\t\t\t\ttransform: `rotate(${rotation}deg)`,\n\t\t\t\ttransition: \"transform 0.3s ease\",\n\t\t\t}}\n\t\t>\n\t\t\t<path d={pathD} style={{ transition: \"d 0.3s ease\" }} />\n\t\t</svg>\n\t);\n});\n\n// ─── Main Component ───────────────────────────────────────────────────────────\nexport const LoadingIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tLoadingIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"uncontained\",\n\t\t\tsize = 48,\n\t\t\tprogress,\n\t\t\tcolor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isContained = variant === \"contained\";\n\t\tconst isDeterminate = progress !== undefined;\n\n\t\t// MD3 spec: strict size range [24dp, 240dp]\n\t\tconst clampedSize = Math.min(240, Math.max(24, size));\n\n\t\t// Proportional scaling based on the default 48dp spec size\n\t\tconst scaleFactor = clampedSize / 48;\n\n\t\t// MD3 spec: contained → 38dp container, 24dp active indicator\n\t\t// Ratio: 38/24 = 1.583 — preserved at all sizes\n\t\tconst containerSize = isContained ? 38 * scaleFactor : undefined;\n\t\tconst indicatorSize = isContained ? 24 * scaleFactor : clampedSize;\n\n\t\t// MD3 color tokens (with per-variant defaults)\n\t\tconst activeColor = isContained\n\t\t\t? (color ?? \"var(--md-sys-color-indicator-contained-active)\")\n\t\t\t: (color ?? \"var(--md-sys-color-indicator-active)\");\n\n\t\t// aria-valuenow is only set in determinate mode (per ARIA spec)\n\t\tconst ariaNow = isDeterminate\n\t\t\t? Math.round(Math.min(1, Math.max(0, progress)) * 100)\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuenow={ariaNow}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: clampedSize,\n\t\t\t\t\theight: clampedSize,\n\t\t\t\t\tcolor: activeColor,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{isContained ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-center rounded-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: containerSize,\n\t\t\t\t\t\t\theight: containerSize,\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\"var(--md-sys-color-indicator-contained-container)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : isDeterminate ? (\n\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t) : (\n\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n","export function easeInOutCubic(x: number): number {\n\treturn x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function generateWavyCircularPath(\n\tcenter: number,\n\tradius: number,\n\tamplitude: number,\n\twavelength: number,\n): string {\n\tconst circumference = 2 * Math.PI * radius;\n\tconst numWaves = Math.max(\n\t\t3,\n\t\tMath.round(circumference / Math.max(1, wavelength)),\n\t);\n\tconst steps = numWaves * 4;\n\tconst dt = (2 * Math.PI) / steps;\n\n\tconst rAt = (t: number) => radius + amplitude * Math.sin(numWaves * t);\n\tconst drAt = (t: number) => amplitude * numWaves * Math.cos(numWaves * t);\n\tconst xAt = (t: number) => center + rAt(t) * Math.cos(t);\n\tconst yAt = (t: number) => center + rAt(t) * Math.sin(t);\n\tconst dxAt = (t: number) => drAt(t) * Math.cos(t) - rAt(t) * Math.sin(t);\n\tconst dyAt = (t: number) => drAt(t) * Math.sin(t) + rAt(t) * Math.cos(t);\n\n\tlet d = \"\";\n\tconst tStart = 0;\n\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst t0 = tStart + i * dt;\n\t\tconst t1 = tStart + (i + 1) * dt;\n\n\t\tconst scale = dt / 3;\n\t\tconst cp1x = xAt(t0) + scale * dxAt(t0);\n\t\tconst cp1y = yAt(t0) + scale * dyAt(t0);\n\t\tconst cp2x = xAt(t1) - scale * dxAt(t1);\n\t\tconst cp2y = yAt(t1) - scale * dyAt(t1);\n\n\t\tif (i === 0) d += `M ${xAt(t0).toFixed(2)} ${yAt(t0).toFixed(2)}`;\n\t\td += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${xAt(t1).toFixed(2)} ${yAt(t1).toFixed(2)}`;\n\t}\n\td += \" Z\";\n\treturn d;\n}\n\nexport function getSinePath(\n\tstartX: number,\n\tendX: number,\n\tphase: number,\n\twl: number,\n\tamp: number,\n) {\n\tif (startX >= endX) return \"\";\n\tlet d = \"\";\n\tconst step = amp === 0 ? Math.max(10, endX - startX) : 1;\n\n\tconst yStart = Math.sin(((startX + phase) / wl) * 2 * Math.PI) * amp;\n\td += `M ${startX.toFixed(2)} ${yStart.toFixed(2)}`;\n\n\tlet nextX = Math.ceil(startX / step) * step;\n\tif (nextX === startX) nextX += step;\n\n\twhile (nextX < endX) {\n\t\tconst y = Math.sin(((nextX + phase) / wl) * 2 * Math.PI) * amp;\n\t\td += ` L ${nextX.toFixed(2)} ${y.toFixed(2)}`;\n\t\tnextX += step;\n\t}\n\n\tconst yEnd = Math.sin(((endX + phase) / wl) * 2 * Math.PI) * amp;\n\td += ` L ${endX.toFixed(2)} ${yEnd.toFixed(2)}`;\n\n\treturn d;\n}\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CircularProgressProps } from \"./types\";\nimport { generateWavyCircularPath } from \"./utils\";\n\nexport const CircularProgress = React.forwardRef<\n\tHTMLDivElement,\n\tCircularProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tsize = 48,\n\t\t\ttrackHeight = 4,\n\t\t\tshape = \"flat\",\n\t\t\tamplitude,\n\t\t\twavelength,\n\t\t\tgapSize = 4,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst radius = (size - trackHeight) / 2;\n\t\tconst center = size / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\tconst isWavy = shape === \"wavy\";\n\n\t\tconst BASELINE_SIZE = 48;\n\t\tconst scaleFactor = size / BASELINE_SIZE;\n\t\tconst effectiveAmplitude = React.useMemo(\n\t\t\t() => amplitude ?? 1.6 * scaleFactor,\n\t\t\t[amplitude, scaleFactor],\n\t\t);\n\t\tconst effectiveWavelength = React.useMemo(\n\t\t\t() => wavelength ?? 15 * scaleFactor,\n\t\t\t[wavelength, scaleFactor],\n\t\t);\n\n\t\tconst wavyActivePath = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisWavy\n\t\t\t\t\t? generateWavyCircularPath(\n\t\t\t\t\t\t\tcenter,\n\t\t\t\t\t\t\tradius,\n\t\t\t\t\t\t\teffectiveAmplitude,\n\t\t\t\t\t\t\teffectiveWavelength,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t[isWavy, center, radius, effectiveAmplitude, effectiveWavelength],\n\t\t);\n\n\t\tconst circumference = React.useMemo(() => 2 * Math.PI * radius, [radius]);\n\t\tconst gapForTrack = React.useMemo(\n\t\t\t() => (gapSize + trackHeight) / circumference,\n\t\t\t[gapSize, trackHeight, circumference],\n\t\t);\n\t\tconst activeAngularFraction = isDeterminate ? clampedValue / 100 : 0;\n\n\t\tconst trackOffset = isDeterminate ? activeAngularFraction + gapForTrack : 0;\n\t\tconst trackLength = isDeterminate\n\t\t\t? Math.max(0.001, 1 - activeAngularFraction - 2 * gapForTrack)\n\t\t\t: 1;\n\n\t\tconst ActiveCircleElem = m.circle;\n\t\tconst ActivePathElem = m.path;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{ transform: \"rotate(-90deg)\", overflow: \"visible\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tinitial={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\tanimate={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{isDeterminate &&\n\t\t\t\t\t\t\t(isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{!isDeterminate && (\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\t\trotate: \"-90deg\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{ rotate: [\"-90deg\", \"270deg\"] }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\trotate: {\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tpathLength: [\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.75 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\trotate: [\n\t\t\t\t\t\t\t\t\t\t`${(0.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.0 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.svg>\n\t\t\t\t\t)}\n\t\t\t\t</LazyMotion>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCircularProgress.displayName = \"CircularProgress\";\n","import * as React from \"react\";\n\nexport function useContainerWidth() {\n\tconst [width, setWidth] = React.useState(0);\n\tconst observerRef = React.useRef<ResizeObserver | null>(null);\n\n\tconst ref = React.useCallback((node: HTMLDivElement | null) => {\n\t\tif (observerRef.current) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\n\t\tif (node) {\n\t\t\tconst obs = new ResizeObserver((entries) => {\n\t\t\t\tconst contentRect = entries[0].contentRect;\n\t\t\t\tsetWidth(contentRect.width);\n\t\t\t});\n\t\t\tobs.observe(node);\n\t\t\tobserverRef.current = obs;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (observerRef.current) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn [ref, width] as const;\n}\n\nexport function useMergedRef<T>(\n\t...refs: (React.Ref<T> | undefined | null)[]\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\tfor (const ref of refs) {\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t\t(ref as React.MutableRefObject<T | null>).current = node;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[refs],\n\t);\n}\n","import { m } from \"motion/react\";\nimport * as React from \"react\";\n\nexport const FlatLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\tcrawlerSpeed: number;\n}>(function FlatLinearTrack({\n\ttrackHeight,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\tcrawlerSpeed,\n}) {\n\tconst isDeterminate = value !== undefined;\n\tconst radius = trackHeight / 2;\n\tconst minActiveWidth = trackHeight;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: trackHeight, borderRadius: radius }}\n\t\t>\n\t\t\t{isDeterminate ? (\n\t\t\t\t<>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: trackColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, 0%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, ${value}%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: activeColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\tminWidth: minActiveWidth,\n\t\t\t\t\t\t\t...(isRtl ? { right: 0 } : { left: 0 }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{ width: `${minActiveWidth}px` }}\n\t\t\t\t\t\tanimate={{ width: `${value}%` }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: trackColor, borderRadius: radius }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: activeColor, borderRadius: radius }}\n\t\t\t\t\t\tinitial={{ left: \"-40%\", width: \"40%\" }}\n\t\t\t\t\t\tanimate={{ left: [\"-40%\", \"100%\"], width: [\"40%\", \"20%\", \"40%\"] }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { animate, useAnimationFrame, useMotionValue } from \"motion/react\";\nimport * as React from \"react\";\nimport { useContainerWidth } from \"./hooks\";\nimport { easeInOutCubic, getSinePath } from \"./utils\";\n\nexport const WavyLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tsvgHeight: number;\n\tamplitude: number;\n\twavelength: number;\n\tindeterminateWavelength: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\twaveSpeed: number;\n\tcrawlerSpeed: number;\n\tdeterminateAnimation: \"md3\" | \"continuous\";\n\tindeterminateAnimation: \"md3\" | \"continuous\";\n\ttrackShape: \"flat\" | \"wavy\";\n}>(function WavyLinearTrack({\n\ttrackHeight,\n\tsvgHeight,\n\tamplitude,\n\twavelength,\n\tindeterminateWavelength,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\twaveSpeed,\n\tcrawlerSpeed,\n\tdeterminateAnimation,\n\tindeterminateAnimation,\n\ttrackShape,\n}) {\n\tconst isDeterminate = typeof value === \"number\";\n\tconst clampedValue = isDeterminate ? Math.max(0, Math.min(100, value)) : 100;\n\tconst titleId = React.useId();\n\n\tconst [containerRef, width] = useContainerWidth();\n\n\tconst activePathRef = React.useRef<SVGPathElement>(null);\n\tconst trackPathRef = React.useRef<SVGPathElement>(null);\n\n\tconst amplitudeMV = useMotionValue(amplitude);\n\tconst fractionMV = useMotionValue(isDeterminate ? clampedValue / 100 : 1);\n\n\tReact.useEffect(() => {\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = clampedValue / 100;\n\n\t\t\t// Handle Flattening Logic based on determinateAnimation prop\n\t\t\tlet targetAmp = amplitude;\n\t\t\tif (determinateAnimation === \"md3\") {\n\t\t\t\ttargetAmp = fraction <= 0.1 || fraction >= 0.95 ? 0 : amplitude;\n\t\t\t}\n\n\t\t\tanimate(amplitudeMV, targetAmp, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tbounce: 0,\n\t\t\t\tduration: 0.5,\n\t\t\t});\n\t\t\tanimate(fractionMV, fraction, { duration: 0.4, ease: [0.2, 0, 0, 1] });\n\t\t}\n\t}, [\n\t\tclampedValue,\n\t\tisDeterminate,\n\t\tamplitude,\n\t\tamplitudeMV,\n\t\tfractionMV,\n\t\tdeterminateAnimation,\n\t]);\n\n\tconst activeWavelength = Math.max(\n\t\t1,\n\t\tisDeterminate ? wavelength : indeterminateWavelength,\n\t);\n\tconst trackAmp = trackShape === \"wavy\" ? amplitude : 0;\n\n\tuseAnimationFrame((time) => {\n\t\tif (width === 0) return;\n\n\t\tconst currentAmp = amplitudeMV.get();\n\t\tconst phase = (time / 1000) * waveSpeed * activeWavelength;\n\t\tconst capWidth = trackHeight / 2;\n\n\t\tlet activePathD = \"\";\n\t\tlet trackD = \"\";\n\t\tconst totalGap = gapSize + trackHeight;\n\n\t\t// 1. DETERMINATE MODE\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = fractionMV.get();\n\t\t\tconst barHead = fraction * width;\n\n\t\t\tconst adjHead = Math.max(capWidth, Math.min(width - capWidth, barHead));\n\t\t\tconst adjTail = capWidth;\n\n\t\t\tif (fraction > 0 && adjHead - adjTail > 0.1) {\n\t\t\t\tactivePathD = getSinePath(\n\t\t\t\t\tadjTail,\n\t\t\t\t\tadjHead,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\tcurrentAmp,\n\t\t\t\t);\n\t\t\t} else if (fraction === 0) {\n\t\t\t\tactivePathD = `M ${capWidth} 0 L ${capWidth + 0.01} 0`;\n\t\t\t}\n\n\t\t\tconst trackStart = adjHead + totalGap;\n\t\t\tif (trackStart < width - capWidth) {\n\t\t\t\ttrackD = getSinePath(\n\t\t\t\t\ttrackStart,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// 2. INDETERMINATE MODE\n\t\telse {\n\t\t\tconst safeCrawlerSpeed = Math.max(0.1, crawlerSpeed);\n\t\t\tconst activeLines: { tail: number; head: number }[] = [];\n\n\t\t\tif (indeterminateAnimation === \"continuous\") {\n\t\t\t\tconst cycle = 2000 / safeCrawlerSpeed;\n\t\t\t\tconst fraction = (time % cycle) / cycle;\n\t\t\t\tactiveLines.push({\n\t\t\t\t\ttail: easeInOutCubic(Math.max(0, fraction * 1.5 - 0.5)),\n\t\t\t\t\thead: easeInOutCubic(Math.min(1, fraction * 1.5)),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cycle = 1750 / safeCrawlerSpeed;\n\t\t\t\tconst t = (time % cycle) * safeCrawlerSpeed;\n\n\t\t\t\tconst l1H = easeInOutCubic(Math.max(0, Math.min(1, t / 1000)));\n\t\t\t\tconst l1T = easeInOutCubic(Math.max(0, Math.min(1, (t - 250) / 1000)));\n\t\t\t\tconst l2H = easeInOutCubic(Math.max(0, Math.min(1, (t - 650) / 850)));\n\t\t\t\tconst l2T = easeInOutCubic(Math.max(0, Math.min(1, (t - 900) / 850)));\n\n\t\t\t\tactiveLines.push({ tail: l1T, head: l1H });\n\t\t\t\tactiveLines.push({ tail: l2T, head: l2H });\n\t\t\t}\n\n\t\t\tconst segments = activeLines\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst barTail = line.tail * width;\n\t\t\t\t\tconst barHead = line.head * width;\n\t\t\t\t\tconst adjTail = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barTail),\n\t\t\t\t\t);\n\t\t\t\t\tconst adjHead = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barHead),\n\t\t\t\t\t);\n\t\t\t\t\treturn { adjTail, adjHead };\n\t\t\t\t})\n\t\t\t\t.filter((seg) => seg.adjHead - seg.adjTail > 0.1);\n\n\t\t\tactivePathD = segments\n\t\t\t\t.map((seg) =>\n\t\t\t\t\tgetSinePath(\n\t\t\t\t\t\tseg.adjTail,\n\t\t\t\t\t\tseg.adjHead,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tactiveWavelength,\n\t\t\t\t\t\tcurrentAmp,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.join(\" \");\n\n\t\t\tlet currentTrackX = capWidth;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst trackEnd = seg.adjTail - totalGap;\n\t\t\t\tif (trackEnd > currentTrackX) {\n\t\t\t\t\ttrackD += `${getSinePath(currentTrackX, trackEnd, phase, activeWavelength, trackAmp)} `;\n\t\t\t\t}\n\t\t\t\tcurrentTrackX = Math.max(currentTrackX, seg.adjHead + totalGap);\n\t\t\t}\n\t\t\tif (currentTrackX < width - capWidth) {\n\t\t\t\ttrackD += getSinePath(\n\t\t\t\t\tcurrentTrackX,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (activePathRef.current)\n\t\t\tactivePathRef.current.setAttribute(\"d\", activePathD);\n\t\tif (trackPathRef.current)\n\t\t\ttrackPathRef.current.setAttribute(\"d\", trackD.trim());\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: svgHeight }}\n\t\t>\n\t\t\t{width > 0 && (\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"absolute inset-0 w-full h-full\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\ttransform: isRtl ? \"scaleX(-1)\" : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t>\n\t\t\t\t\t<title id={titleId}>\n\t\t\t\t\t\t{isDeterminate\n\t\t\t\t\t\t\t? `Progress: ${clampedValue}%`\n\t\t\t\t\t\t\t: \"Indeterminate loading progress\"}\n\t\t\t\t\t</title>\n\t\t\t\t\t<g transform={`translate(0, ${svgHeight / 2})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={trackPathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={trackColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={activePathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMergedRef } from \"./hooks\";\nimport { FlatLinearTrack } from \"./linear-flat\";\nimport { WavyLinearTrack } from \"./linear-wavy\";\nimport type { LinearProgressProps } from \"./types\";\n\nexport const LinearProgress = React.forwardRef<\n\tHTMLDivElement,\n\tLinearProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tshape = \"flat\",\n\t\t\ttrackShape,\n\t\t\ttrackHeight = 4,\n\t\t\tamplitude,\n\t\t\twavelength = 40,\n\t\t\tindeterminateWavelength = 20,\n\t\t\twaveSpeed = 1,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tdeterminateAnimation = \"md3\",\n\t\t\tindeterminateAnimation = \"continuous\",\n\t\t\tgapSize = 4,\n\t\t\tshowStopIndicator = \"auto\",\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, containerRef);\n\t\tconst [isRtl, setIsRtl] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (containerRef.current) {\n\t\t\t\tconst dir = getComputedStyle(containerRef.current).direction;\n\t\t\t\tsetIsRtl(dir === \"rtl\");\n\t\t\t}\n\t\t}, []);\n\n\t\tconst isWavy = shape === \"wavy\";\n\t\tconst resolvedTrackShape = trackShape ?? shape;\n\n\t\tconst effectiveAmplitude = React.useMemo(() => amplitude ?? 3, [amplitude]);\n\t\tconst svgHeight = React.useMemo(\n\t\t\t() => (isWavy ? trackHeight + effectiveAmplitude * 2 : trackHeight),\n\t\t\t[isWavy, trackHeight, effectiveAmplitude],\n\t\t);\n\n\t\tconst shouldShowStop = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisDeterminate &&\n\t\t\t\tresolvedTrackShape === \"flat\" &&\n\t\t\t\t(showStopIndicator === true ||\n\t\t\t\t\t(showStopIndicator === \"auto\" && isDeterminate)),\n\t\t\t[isDeterminate, resolvedTrackShape, showStopIndicator],\n\t\t);\n\n\t\tconst stopSize = React.useMemo(\n\t\t\t() => Math.max(2, trackHeight > 4 ? 4 : trackHeight / 2),\n\t\t\t[trackHeight],\n\t\t);\n\n\t\tconst stopOffset = (trackHeight - stopSize) / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex w-full flex-col justify-center\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: svgHeight }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t<WavyLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tsvgHeight={svgHeight}\n\t\t\t\t\t\t\tamplitude={effectiveAmplitude}\n\t\t\t\t\t\t\twavelength={wavelength}\n\t\t\t\t\t\t\tindeterminateWavelength={indeterminateWavelength}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\twaveSpeed={waveSpeed}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t\tdeterminateAnimation={determinateAnimation}\n\t\t\t\t\t\t\tindeterminateAnimation={indeterminateAnimation}\n\t\t\t\t\t\t\ttrackShape={resolvedTrackShape}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlatLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowStop && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute rounded-full\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: stopSize,\n\t\t\t\t\t\t\t\theight: stopSize,\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-indicator-stop)\",\n\t\t\t\t\t\t\t\ttop: svgHeight / 2 - stopSize / 2,\n\t\t\t\t\t\t\t\t...(isRtl ? { left: stopOffset } : { right: stopOffset }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nLinearProgress.displayName = \"LinearProgress\";\n","import * as React from \"react\";\nimport { CircularProgress } from \"./circular\";\nimport { LinearProgress } from \"./linear\";\nimport type { ProgressIndicatorProps } from \"./types\";\n\n/**\n * Progress Indicator component based on Material Design 3 Expressive guidelines.\n * Flexible support for 2 presentation variants: Linear and Circular,\n * with smooth dynamic Wavy shape profiles.\n *\n * @example\n * ```tsx\n * // Determinate Flat Linear\n * <ProgressIndicator variant=\"linear\" value={60} aria-label=\"Loading profile...\" />\n *\n * // Indeterminate Wavy Linear\n * <ProgressIndicator variant=\"linear\" shape=\"wavy\" aria-label=\"Connecting to server...\" />\n *\n * // Determinate Flat Circular\n * <ProgressIndicator variant=\"circular\" value={45} size={48} aria-label=\"Syncing...\" />\n * ```\n */\n\nexport const ProgressIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tProgressIndicatorProps\n>((props, ref) => {\n\tif (props.variant === \"circular\") {\n\t\treturn <CircularProgress ref={ref} {...props} />;\n\t}\n\treturn <LinearProgress ref={ref} {...props} />;\n});\n\nProgressIndicator.displayName = \"ProgressIndicator\";\n\nexport type {\n\tCircularProgressProps,\n\tLinearProgressProps,\n\tProgressIndicatorProps,\n} from \"./types\";\n","/**\n * @file shared/touch-target.tsx\n *\n * Invisible 48×48dp touch-target expander for small interactive elements.\n *\n * WCAG 2.5.5 (Level AA) requires interactive targets to be at least 44×44 CSS pixels.\n * MD3 specifies a minimum 48dp touch target for all interactive components.\n * For button sizes XS (32dp) and SM (40dp) that are smaller than this minimum,\n * an invisible absolutely-positioned `<span>` is overlaid to extend the\n * effective tap area without affecting visual layout.\n *\n * @see https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n * @see https://m3.material.io/foundations/accessible-design/accessibility-basics\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TouchTarget Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invisible 48×48dp touch area expander — satisfies WCAG 2.5.5 + MD3 spec.\n *\n * Place as a direct child of any interactive element whose visual size is\n * smaller than 48dp (e.g. `xs`/`sm` buttons and icon buttons).\n * The parent element **must** have `position: relative`.\n *\n * @remarks\n * - Hidden from assistive technologies via `aria-hidden=\"true\"`.\n * - `pointer-events: none` ensures it does not intercept click events.\n * - Centred with `left: 50% / top: 50%` + negative translate for symmetry.\n *\n * @example\n * ```tsx\n * // Used inside a 32dp XS button:\n * <button className=\"relative h-8 w-auto ...\">\n * <TouchTarget />\n * Label\n * </button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/specs (Touch target section)\n */\nexport function TouchTarget() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 min-w-12 min-h-12 cursor-pointer pointer-events-none\"\n\t\t/>\n\t);\n}\n","/**\n * @file icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size container dimensions (Tailwind utility classes).\n * MD3 Expressive sizing tokens (v14.1.0): XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n * @internal\n */\nconst SIZE_STYLES: Record<string, string> = {\n\txs: \"h-8 w-8\",\n\tsm: \"h-10 w-10\",\n\tmd: \"h-14 w-14\",\n\tlg: \"h-24 w-24\",\n\txl: \"h-[8.5rem] w-[8.5rem]\",\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tbaseIconButtonClasses,\n\t\t\t\t\t\tresolvedColorClass,\n\t\t\t\t\t\toutlineWidthClass,\n\t\t\t\t\t\tdisabledBgClass,\n\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\tSIZE_STYLES[size],\n\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"content\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","/**\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 { IconButton } from \"../buttons/icon-button\";\nimport { Icon } from \"../icon\";\nimport { DEFAULT_SPATIAL_SPRING } from \"../shared/motion-tokens\";\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\n// MD3 default.spatial: stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19\nconst SNACKBAR_SPRING = DEFAULT_SPATIAL_SPRING;\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\nexport const SnackbarContext = React.createContext<SnackbarContextValue | null>(\n\tnull,\n);\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 * 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 * @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","\"use client\";\n\nimport { domMax, LazyMotion } from \"motion/react\";\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport {\n\tapplyTheme,\n\ttype ContrastLevel,\n\ttype SchemeVariant,\n\ttype ThemeMode,\n} from \"../../lib/theme-utils\";\n\nimport {\n\tSnackbarContext,\n\tSnackbarHost,\n\tuseSnackbarState,\n} from \"../snackbar/snackbar\";\nimport { Typography, TypographyContext } from \"../typography/typography\";\nimport {\n\ttype FontVariationAxes,\n\tTypographyTokens,\n} from \"../typography/typography-tokens\";\n\n// ─── Theme Context ─────────────────────────────────────────────────────────────\n\ninterface ThemeContextValue {\n\tsourceColor: string;\n\tsetSourceColor: (color: string) => void;\n\tmode: ThemeMode;\n\tsetMode: (mode: ThemeMode) => void;\n\t/** The resolved color scheme actually applied — always \"light\" or \"dark\". */\n\teffectiveMode: \"light\" | \"dark\";\n\t/** Active color scheme variant. */\n\tvariant: SchemeVariant;\n\t/** Active contrast level. */\n\tcontrastLevel: ContrastLevel;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nconst STORAGE_KEY_COLOR = \"md3-source-color\";\nconst STORAGE_KEY_MODE = \"md3-theme-mode\";\n\n// ─── Singleton defaults (computed once) ───────────────────────────────────────\n\nconst defaultTokens = new TypographyTokens();\nconst defaultTypography = new Typography(defaultTokens);\n\n// ─── MD3ThemeProvider ──────────────────────────────────────────────────────────\n\nexport interface MD3ThemeProviderProps {\n\tchildren: ReactNode;\n\t// ── Theme ─────────────────────────────────────────────────────────────────\n\tsourceColor?: string;\n\tdefaultMode?: ThemeMode;\n\tpersistToLocalStorage?: boolean;\n\t/**\n\t * Color scheme variant controlling hue and chroma behaviour.\n\t * - `\"expressive\"` — MD3 Expressive 2025 (high-chroma, detached from seed). **Default.**\n\t * - `\"tonal_spot\"` — Standard Android 12+ theme.\n\t * - `\"vibrant\"` | `\"fidelity\"` | `\"content\"` | `\"monochrome\"` | `\"neutral\"`\n\t * @default \"expressive\"\n\t */\n\tvariant?: SchemeVariant;\n\t/**\n\t * Contrast level for the generated scheme.\n\t * - `0` — Standard (default)\n\t * - `0.5` — Medium contrast\n\t * - `1` — Maximum contrast (WCAG AAA)\n\t * @default 0\n\t */\n\tcontrastLevel?: ContrastLevel;\n\t// ── Typography ────────────────────────────────────────────────────────────\n\t/**\n\t * A fully custom `Typography` instance.\n\t * When provided, `fontFamily` and `fontVariationAxes` are ignored.\n\t */\n\ttypography?: Typography;\n\t/**\n\t * Override the CSS `font-family` for all typography styles.\n\t * Ignored when `typography` prop is provided.\n\t * @example \"'Inter', sans-serif\"\n\t */\n\tfontFamily?: string;\n\t/**\n\t * Variable font axes applied globally via `font-variation-settings`.\n\t * Merged on top of defaults (`ROND: 100`). Ignored when `typography` is provided.\n\t * @example { ROND: 50 }\n\t */\n\tfontVariationAxes?: FontVariationAxes;\n\t// ── Snackbar ──────────────────────────────────────────────────────────────\n\t/**\n\t * When `true`, mounts `SnackbarHost` inside the provider and exposes\n\t * `useSnackbar()` to all descendants — no separate `<SnackbarProvider>` needed.\n\t *\n\t * Opt-in, default `false`. For advanced usage (e.g., scoped snackbars or\n\t * custom host positioning), keep this `false` and use `<SnackbarProvider>`\n\t * or `<SnackbarHost>` directly.\n\t *\n\t * @default false\n\t */\n\tenableSnackbar?: boolean;\n}\n\nexport function MD3ThemeProvider({\n\tchildren,\n\tsourceColor: initialSourceColor = \"#6750A4\",\n\tdefaultMode = \"light\",\n\tpersistToLocalStorage = false,\n\tvariant = \"expressive\",\n\tcontrastLevel = 0,\n\ttypography: typographyProp,\n\tfontFamily,\n\tfontVariationAxes,\n\tenableSnackbar = false,\n}: MD3ThemeProviderProps) {\n\t// ── Theme state ──────────────────────────────────────────────────────────\n\tconst [sourceColor, setSourceColor] = useState(initialSourceColor);\n\tconst [mode, setMode] = useState<ThemeMode>(defaultMode);\n\tconst [isHydrated, setIsHydrated] = useState(!persistToLocalStorage);\n\tconst [systemMode, setSystemMode] = useState<\"light\" | \"dark\">(\"light\");\n\n\t// Listen for OS prefers-color-scheme changes and keep systemMode state in sync\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\t\tconst updateSystemMode = () => {\n\t\t\tsetSystemMode(mediaQuery.matches ? \"dark\" : \"light\");\n\t\t};\n\n\t\tupdateSystemMode();\n\t\tmediaQuery.addEventListener(\"change\", updateSystemMode);\n\t\treturn () => mediaQuery.removeEventListener(\"change\", updateSystemMode);\n\t}, []);\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\" || savedMode === \"system\")\n\t\t\tsetMode(savedMode);\n\n\t\tsetIsHydrated(true);\n\t}, [persistToLocalStorage]);\n\n\t// Derived effective mode (resolves \"system\" to real-time systemMode)\n\tconst effectiveMode = mode === \"system\" ? systemMode : mode;\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\n\t\tapplyTheme(sourceColor, effectiveMode, document.documentElement, {\n\t\t\tvariant,\n\t\t\tcontrastLevel,\n\t\t});\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}, [\n\t\tsourceColor,\n\t\tmode,\n\t\teffectiveMode,\n\t\tpersistToLocalStorage,\n\t\tisHydrated,\n\t\tvariant,\n\t\tcontrastLevel,\n\t]);\n\n\tconst themeValue = useMemo<ThemeContextValue>(\n\t\t() => ({\n\t\t\tsourceColor,\n\t\t\tsetSourceColor,\n\t\t\tmode,\n\t\t\tsetMode,\n\t\t\teffectiveMode,\n\t\t\tvariant,\n\t\t\tcontrastLevel,\n\t\t}),\n\t\t[sourceColor, mode, effectiveMode, variant, contrastLevel],\n\t);\n\n\t// ── Typography value ─────────────────────────────────────────────────────\n\tconst typographyValue = useMemo<Typography>(() => {\n\t\tif (typographyProp) return typographyProp;\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}, [typographyProp, fontFamily, fontVariationAxes]);\n\n\t// ── Snackbar — mounted as isolated subtree so hook only allocates when needed\n\n\treturn (\n\t\t<LazyMotion features={domMax}>\n\t\t\t<ThemeContext.Provider value={themeValue}>\n\t\t\t\t<TypographyContext.Provider value={typographyValue}>\n\t\t\t\t\t{enableSnackbar ? (\n\t\t\t\t\t\t<SnackbarMountedProvider>{children}</SnackbarMountedProvider>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tchildren\n\t\t\t\t\t)}\n\t\t\t\t</TypographyContext.Provider>\n\t\t\t</ThemeContext.Provider>\n\t\t</LazyMotion>\n\t);\n}\n\n// ─── SnackbarMountedProvider ──────────────────────────────────────────────────\n\n/**\n * Internal helper component — renders only when `enableSnackbar={true}`.\n * Isolates `useSnackbarState` so the hook is never allocated unnecessarily.\n */\nfunction SnackbarMountedProvider({ children }: { children: ReactNode }) {\n\tconst state = useSnackbarState();\n\tconst contextValue = useMemo(\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\n// ─── Hooks ────────────────────────────────────────────────────────────────────\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<\n\tThemeContextValue,\n\t\"mode\" | \"setMode\" | \"effectiveMode\"\n> {\n\tconst { mode, setMode, effectiveMode } = useTheme();\n\treturn { mode, setMode, effectiveMode };\n}\n"]}
|
|
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/shared/motion-tokens.ts","../src/ui/shared/constants.ts","../src/ui/icon.tsx","../src/ui/ripple.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/shared/touch-target.tsx","../src/ui/buttons/icon-button/icon-button.tsx","../src/ui/snackbar/snackbar.tsx","../src/ui/typography/type-scale-tokens.ts","../src/ui/typography/typography-tokens.ts","../src/ui/typography/typography.tsx","../src/ui/theme-provider/index.tsx"],"names":["useState","useEffect","useRef","useCallback","jsxs","Fragment","jsx","Hct","SchemeTonalSpot","SchemeVibrant","SchemeFidelity","SchemeContent","SchemeMonochrome","SchemeNeutral","SchemeExpressive","hexFromArgb","m","twMerge","clsx","React","LazyMotion","domMax","React2","RippleItem","useReducedMotion","AnimatePresence","useRipple","React3","IndeterminateSvg","DeterminateSvg","React4","React5","React6","FlatLinearTrack","React7","WavyLinearTrack","useMotionValue","animate","useAnimationFrame","React8","React9","React10","_a","_b","Slot","React11","Snackbar","createContext","defaultTokens","defaultTypography","useMemo","useContext"],"mappings":"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","file":"core.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * useMediaQuery — SSR-safe responsive hook.\n *\n * Prevents hydration mismatch by initializing with `false`.\n *\n * @example\n * ```tsx\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * ```\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/** Ripple animation duration (ms). Default: 600 */\n\tduration?: number;\n\t/** Ripple color. Default: 'currentColor' */\n\tcolor?: string;\n\t/** Opacity. Default: 0.12 (MD3 standard) */\n\topacity?: number;\n\t/** Disable ripple (e.g. when component is disabled) */\n\tdisabled?: boolean;\n}\n\n/**\n * useRipple — Material Design 3 Expressive Ripple Effect\n *\n * Pure DOM hook with zero external animation dependencies.\n * Note: Requires element to have `position: relative` and `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// Next frame to 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 * Injects preconnect resource hints for Google Fonts CDN into <head>.\n * Place this component AS EARLY AS POSSIBLE in the app tree, ideally\n * directly inside <head> or root layout.\n *\n * WHY THIS MATTERS:\n * If @import url() is inside a CSS file, browser must:\n * 1. Parse HTML -> download JS bundle -> execute CSS -> hit @import -> start Google Fonts connection\n * Preconnect hints allow browser to establish TCP handshake + TLS connection early at step 1,\n * saving 100-500ms connection latency depending on network.\n *\n * USAGE:\n * ```tsx\n * // app/layout.tsx (Next.js) or index.html equivalent\n * import { MaterialSymbolsPreconnect } from '@bug-on/m3-expressive';\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: Use this component only with CDN mode.\n * Self-hosted fonts do not require preconnecting to external origins.\n */\nexport interface MaterialSymbolsPreconnectProps {\n\t/**\n\t * Array of Material Symbols font variants to load.\n\t * Include only variants used by application to minimize bandwidth.\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 for CSS stylesheet */}\n\t\t\t<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n\t\t\t{/* Preconnect for font files — crossorigin required for 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 selected font variants.\n\t\t\t Uses display=swap for performance optimization (Lighthouse/Next.js recommendation).\n\t\t\t Note: May cause brief ligature flicker during initial load. */}\n\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\tHct,\n\thexFromArgb,\n\tSchemeContent,\n\tSchemeExpressive,\n\tSchemeFidelity,\n\tSchemeMonochrome,\n\tSchemeNeutral,\n\tSchemeTonalSpot,\n\tSchemeVibrant,\n} from \"@material/material-color-utilities\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/**\n * Color scheme variants from Material Design 3.\n * - `expressive` — MD3 Expressive 2025: high-chroma, intentionally detached from\n * source color. **Default for this library.**\n * - `tonal_spot` — Standard Android 12+ theme: low-to-medium colorfulness.\n * - `vibrant` — More colorful than tonal_spot, hue from source.\n * - `fidelity` — Stays close to the source color's hue and chroma.\n * - `content` — Similar to fidelity, optimised for image-based content.\n * - `monochrome` — No hue; all grays.\n * - `neutral` — Near-neutral colors with subtle tint.\n */\nexport type SchemeVariant =\n\t| \"expressive\"\n\t| \"tonal_spot\"\n\t| \"vibrant\"\n\t| \"fidelity\"\n\t| \"content\"\n\t| \"monochrome\"\n\t| \"neutral\";\n\n/**\n * Contrast level for the generated scheme.\n * - `-1` — Minimum contrast (accessibility not guaranteed)\n * - `0` — Standard (design as spec'd)\n * - `0.5` — Medium contrast\n * - `1` — Maximum contrast (WCAG AAA)\n */\nexport type ContrastLevel = -1 | 0 | 0.5 | 1;\n\n/**\n * Resolves the effective color scheme from a ThemeMode.\n * When mode is \"system\", reads the OS preference via matchMedia.\n * Returns \"light\" as the safe default in SSR environments.\n */\nexport function resolveMode(mode: ThemeMode): \"light\" | \"dark\" {\n\tif (mode !== \"system\") return mode;\n\tif (typeof window === \"undefined\") return \"light\";\n\treturn window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n\t\t? \"dark\"\n\t\t: \"light\";\n}\n\n// ─── Color Scheme Interface ────────────────────────────────────────────────────\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\t/** Expressive dim tone for primary (v0.4.0+) */\n\tprimaryDim: 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\t/** Expressive dim tone for secondary (v0.4.0+) */\n\tsecondaryDim: 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\t/** Expressive dim tone for tertiary (v0.4.0+) */\n\ttertiaryDim: 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\t/** Dimmed surface — darker than surface, lighter than surface-container. */\n\tsurfaceDim: string;\n\t/** Brightened surface — lighter than surface. */\n\tsurfaceBright: 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// ─── Internal scheme factory ───────────────────────────────────────────────────\n\n/**\n * Creates a `DynamicScheme` subclass instance from a seed hex color using\n * Material Color Utilities v0.4.0. Defaults to Spec 2025 + Expressive variant.\n */\nfunction createDynamicScheme(\n\tsourceColorHex: string,\n\tisDark: boolean,\n\tvariant: SchemeVariant = \"expressive\",\n\tcontrastLevel: ContrastLevel = 0,\n) {\n\tconst hct = Hct.fromInt(argbFromHex(sourceColorHex));\n\tconst spec = \"2025\" as const;\n\n\tswitch (variant) {\n\t\tcase \"tonal_spot\":\n\t\t\treturn new SchemeTonalSpot(hct, isDark, contrastLevel, spec);\n\t\tcase \"vibrant\":\n\t\t\treturn new SchemeVibrant(hct, isDark, contrastLevel, spec);\n\t\tcase \"fidelity\":\n\t\t\treturn new SchemeFidelity(hct, isDark, contrastLevel, spec);\n\t\tcase \"content\":\n\t\t\treturn new SchemeContent(hct, isDark, contrastLevel, spec);\n\t\tcase \"monochrome\":\n\t\t\treturn new SchemeMonochrome(hct, isDark, contrastLevel, spec);\n\t\tcase \"neutral\":\n\t\t\treturn new SchemeNeutral(hct, isDark, contrastLevel, spec);\n\t\tdefault:\n\t\t\treturn new SchemeExpressive(hct, isDark, contrastLevel, spec);\n\t}\n}\n\n/** Parse a hex string (#rrggbb) to ARGB int. */\nfunction argbFromHex(hex: string): number {\n\tconst sanitized = hex.replace(/^#/, \"\");\n\tconst r = Number.parseInt(sanitized.substring(0, 2), 16);\n\tconst g = Number.parseInt(sanitized.substring(2, 4), 16);\n\tconst b = Number.parseInt(sanitized.substring(4, 6), 16);\n\treturn (0xff000000 | (r << 16) | (g << 8) | b) >>> 0;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface GenerateM3ThemeOptions {\n\tvariant?: SchemeVariant;\n\tcontrastLevel?: ContrastLevel;\n}\n\n/**\n * Generate a complete MD3 Expressive color scheme from a seed hex string.\n *\n * Uses Material Color Utilities v0.4.0 with SpecVersion 2025 by default.\n *\n * @param sourceColorHex - Seed color in hex format (e.g. `\"#6750A4\"`).\n * @param mode - Light or dark scheme. Defaults to `\"light\"`.\n * @param options - Optional variant + contrast overrides.\n * - `variant` — defaults to `\"expressive\"` (MD3 Expressive 2025)\n * - `contrastLevel` — defaults to `0` (standard)\n *\n * @example\n * // Backward-compatible call (no options required)\n * generateM3Theme(\"#6750A4\")\n *\n * @example\n * // Expressive with high contrast\n * generateM3Theme(\"#6750A4\", \"dark\", { contrastLevel: 1 })\n */\nexport function generateM3Theme(\n\tsourceColorHex: string,\n\tmode: \"light\" | \"dark\" = \"light\",\n\toptions: GenerateM3ThemeOptions = {},\n): MD3ColorScheme {\n\tconst { variant = \"expressive\", contrastLevel = 0 } = options;\n\tconst isDark = mode === \"dark\";\n\tconst scheme = createDynamicScheme(\n\t\tsourceColorHex,\n\t\tisDark,\n\t\tvariant,\n\t\tcontrastLevel,\n\t);\n\n\tconst hex = (argb: number) => hexFromArgb(argb);\n\n\treturn {\n\t\t// Primary\n\t\tprimary: hex(scheme.primary),\n\t\tonPrimary: hex(scheme.onPrimary),\n\t\tprimaryContainer: hex(scheme.primaryContainer),\n\t\tonPrimaryContainer: hex(scheme.onPrimaryContainer),\n\t\tinversePrimary: hex(scheme.inversePrimary),\n\t\tprimaryFixed: hex(scheme.primaryFixed),\n\t\tprimaryFixedDim: hex(scheme.primaryFixedDim),\n\t\tonPrimaryFixed: hex(scheme.onPrimaryFixed),\n\t\tonPrimaryFixedVariant: hex(scheme.onPrimaryFixedVariant),\n\t\tprimaryDim: hex(scheme.primaryDim),\n\n\t\t// Secondary\n\t\tsecondary: hex(scheme.secondary),\n\t\tonSecondary: hex(scheme.onSecondary),\n\t\tsecondaryContainer: hex(scheme.secondaryContainer),\n\t\tonSecondaryContainer: hex(scheme.onSecondaryContainer),\n\t\tsecondaryFixed: hex(scheme.secondaryFixed),\n\t\tsecondaryFixedDim: hex(scheme.secondaryFixedDim),\n\t\tonSecondaryFixed: hex(scheme.onSecondaryFixed),\n\t\tonSecondaryFixedVariant: hex(scheme.onSecondaryFixedVariant),\n\t\tsecondaryDim: hex(scheme.secondaryDim),\n\n\t\t// Tertiary\n\t\ttertiary: hex(scheme.tertiary),\n\t\tonTertiary: hex(scheme.onTertiary),\n\t\ttertiaryContainer: hex(scheme.tertiaryContainer),\n\t\tonTertiaryContainer: hex(scheme.onTertiaryContainer),\n\t\ttertiaryFixed: hex(scheme.tertiaryFixed),\n\t\ttertiaryFixedDim: hex(scheme.tertiaryFixedDim),\n\t\tonTertiaryFixed: hex(scheme.onTertiaryFixed),\n\t\tonTertiaryFixedVariant: hex(scheme.onTertiaryFixedVariant),\n\t\ttertiaryDim: hex(scheme.tertiaryDim),\n\n\t\t// Error\n\t\terror: hex(scheme.error),\n\t\tonError: hex(scheme.onError),\n\t\terrorContainer: hex(scheme.errorContainer),\n\t\tonErrorContainer: hex(scheme.onErrorContainer),\n\n\t\t// Surface\n\t\tsurface: hex(scheme.surface),\n\t\tonSurface: hex(scheme.onSurface),\n\t\tsurfaceVariant: hex(scheme.surfaceVariant),\n\t\tonSurfaceVariant: hex(scheme.onSurfaceVariant),\n\t\tsurfaceTint: hex(scheme.surfaceTint),\n\t\tsurfaceDim: hex(scheme.surfaceDim),\n\t\tsurfaceBright: hex(scheme.surfaceBright),\n\t\tsurfaceContainerLowest: hex(scheme.surfaceContainerLowest),\n\t\tsurfaceContainerLow: hex(scheme.surfaceContainerLow),\n\t\tsurfaceContainer: hex(scheme.surfaceContainer),\n\t\tsurfaceContainerHigh: hex(scheme.surfaceContainerHigh),\n\t\tsurfaceContainerHighest: hex(scheme.surfaceContainerHighest),\n\n\t\t// Inverse\n\t\tinverseSurface: hex(scheme.inverseSurface),\n\t\tinverseOnSurface: hex(scheme.inverseOnSurface),\n\n\t\t// Background\n\t\tbackground: hex(scheme.background),\n\t\tonBackground: hex(scheme.onBackground),\n\n\t\t// Outline\n\t\toutline: hex(scheme.outline),\n\t\toutlineVariant: hex(scheme.outlineVariant),\n\n\t\t// Utility\n\t\tshadow: hex(scheme.shadow),\n\t\tscrim: hex(scheme.scrim),\n\t};\n}\n\n/**\n * Apply an MD3 Expressive dynamic color scheme to the document root as CSS\n * custom properties.\n *\n * Sets `--md-sys-color-*` tokens (used by components) and\n * `--color-m3-*` tokens (used by Tailwind). Also sets the `data-theme`\n * attribute for dark mode CSS selectors.\n *\n * @param sourceColorHex - Seed color hex string.\n * @param mode - Light/dark/system mode. Defaults to `\"light\"`.\n * @param root - Target element. Defaults to `document.documentElement`.\n * @param options - Optional variant + contrast overrides.\n */\nexport function applyTheme(\n\tsourceColorHex: string,\n\tmode: ThemeMode = \"light\",\n\troot: HTMLElement = document.documentElement,\n\toptions: GenerateM3ThemeOptions = {},\n): void {\n\tconst resolved = resolveMode(mode);\n\tconst colors = generateM3Theme(sourceColorHex, resolved, options);\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\t// data-theme is always \"light\" or \"dark\" — never \"system\"\n\troot.setAttribute(\"data-theme\", resolved);\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 ui/shared/motion-tokens.ts\n *\n * Framer Motion spring presets derived from the official MD3 Expressive\n * motion physics system (May 2025).\n *\n * Usage hierarchy:\n * 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.\n * 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.\n * 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n * @see https://m3.material.io/styles/motion/overview/specs\n */\n\nimport type { Transition } from \"motion/react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Spring Token Structure\n//\n// MD3 defines springs as dampingRatio (0–1) + stiffness.\n// Framer Motion uses absolute `damping` coefficient.\n//\n// Conversion (with Framer's default mass = 1):\n// damping = 2 × dampingRatio × √stiffness\n//\n// Computed values (rounded to 2 decimal places):\n//\n// fast spatial: 2 × 0.6 × √800 = 2 × 0.6 × 28.28 ≈ 33.94\n// fast effects: 2 × 1.0 × √3800 = 2 × 61.64 ≈ 123.29\n// default spatial: 2 × 0.8 × √380 = 2 × 0.8 × 19.49 ≈ 31.19\n// default effects: 2 × 1.0 × √1600 = 2 × 40 = 80\n// slow spatial: 2 × 0.8 × √200 = 2 × 0.8 × 14.14 ≈ 22.63\n// slow effects: 2 × 1.0 × √800 = 2 × 28.28 ≈ 56.57\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Spatial springs — use for position, size, border-radius, rotation, scale ─\n\n/**\n * MD3 Expressive — Fast Spatial Spring\n * `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)\n *\n * Use for: small components (buttons, switches, chips).\n * Has notable bounce/overshoot — feels snappy and expressive.\n */\nexport const FAST_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 33.94,\n} as const;\n\n/**\n * MD3 Expressive — Default Spatial Spring\n * `md.sys.motion.spring.default.spatial` (dampingRatio: 0.8, stiffness: 380)\n *\n * Use for: medium elements (bottom sheets, menus, navigation rail).\n * Gentle overshoot — the go-to spring for most UI animations.\n */\nexport const DEFAULT_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 380,\n\tdamping: 31.19,\n} as const;\n\n/**\n * MD3 Expressive — Slow Spatial Spring\n * `md.sys.motion.spring.slow.spatial` (dampingRatio: 0.8, stiffness: 200)\n *\n * Use for: full-screen transitions and large layout shifts.\n * Subtle, slow overshoot.\n */\nexport const SLOW_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 22.63,\n} as const;\n\n// ── Effects springs — use for color, opacity (critically damped, no bounce) ──\n\n/**\n * MD3 Expressive — Fast Effects Spring\n * `md.sys.motion.spring.fast.effects` (dampingRatio: 1.0, stiffness: 3800)\n *\n * Use for: color changes on switches, icon swaps, badge counts.\n * Critically damped — very fast, no overshoot.\n */\nexport const FAST_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 3800,\n\tdamping: 123.29,\n} as const;\n\n/**\n * MD3 Expressive — Default Effects Spring\n * `md.sys.motion.spring.default.effects` (dampingRatio: 1.0, stiffness: 1600)\n *\n * Use for: opacity fades, color transitions for medium-sized elements.\n * Critically damped — smooth with no overshoot.\n */\nexport const DEFAULT_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 1600,\n\tdamping: 80,\n} as const;\n\n/**\n * MD3 Expressive — Slow Effects Spring\n * `md.sys.motion.spring.slow.effects` (dampingRatio: 1.0, stiffness: 800)\n *\n * Use for: full-screen opacity/color transitions.\n * Critically damped — slow and smooth.\n */\nexport const SLOW_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 56.57,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dynamic helper\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SpringSpeed = \"fast\" | \"default\" | \"slow\";\nexport type SpringAnimationType = \"spatial\" | \"effects\";\n\nconst springMap = {\n\tfast: { spatial: FAST_SPATIAL_SPRING, effects: FAST_EFFECTS_SPRING },\n\tdefault: { spatial: DEFAULT_SPATIAL_SPRING, effects: DEFAULT_EFFECTS_SPRING },\n\tslow: { spatial: SLOW_SPATIAL_SPRING, effects: SLOW_EFFECTS_SPRING },\n} as const;\n\n/**\n * Pick a Framer Motion spring by speed and type.\n *\n * @example\n * ```tsx\n * transition={getMotionSpring(\"fast\", \"spatial\")}\n * ```\n */\nexport function getMotionSpring(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n): Transition {\n\treturn springMap[speed][type];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS transition strings\n// For contexts where Framer Motion is not used (plain CSS / Tailwind).\n// Uses official Web spring → CSS cubic-bezier conversion table.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst CSS_CURVES = {\n\texpressive: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.42, 1.67, 0.21, 0.90)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.38, 1.21, 0.22, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.39, 1.29, 0.35, 0.98)\",\n\t\t\t\tdurationMs: 650,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n\tstandard: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 750,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n} as const;\n\nexport type MotionScheme = \"expressive\" | \"standard\";\n\n/**\n * Returns a CSS `transition` value string using the official MD3 web curve\n * conversion, e.g. `\"500ms cubic-bezier(0.38, 1.21, 0.22, 1.00)\"`.\n *\n * @example\n * ```ts\n * element.style.transition = `border-radius ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n * ```\n */\nexport function getMotionTransitionCSS(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n\tscheme: MotionScheme = \"expressive\",\n): string {\n\tconst { curve, durationMs } = CSS_CURVES[scheme][speed][type];\n\treturn `${durationMs}ms ${curve}`;\n}\n","/**\n * @file shared/constants.ts\n *\n * Shared animation constants for MD3 Expressive UI components.\n * Centralises spring transition configs and motion variant objects to avoid\n * duplication across button, icon-button, FAB, and other interactive components.\n *\n * @see https://m3.material.io/foundations/animation/overview\n */\n\nimport type { Target, TargetAndTransition, Transition } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n} from \"./motion-tokens\";\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tgetMotionSpring,\n\tgetMotionTransitionCSS,\n\tSLOW_EFFECTS_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"./motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast spring — used for border-radius morphing, icon swaps.\n * Maps to MD3 `fast.effects` (critically damped, stiffness 3800).\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Standard spring — used for icon/content scale animations.\n * Maps to MD3 `default.effects` (critically damped, stiffness 1600).\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = DEFAULT_EFFECTS_SPRING;\n\n/**\n * MD3 Expressive spring — active indicator expand/collapse.\n * Maps to MD3 `default.spatial` (dampingRatio: 0.8, stiffness: 380).\n * Gentle bounce for the \"pop\" effect per MD3 Expressive spec.\n */\nexport const SPRING_TRANSITION_EXPRESSIVE: Transition = DEFAULT_SPATIAL_SPRING;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon Span Motion Variants\n// Used for icon/loading indicator swap animation inside FAB and IconButton.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Framer Motion variants for animating icon spans in/out.\n *\n * Scale from near-zero → 1 on enter; back to near-zero on exit.\n * The near-zero value (0.01) avoids the SMIL freeze bug on Chromium\n * that occurs when an element starts at exactly `scale(0)`.\n *\n * @example\n * ```tsx\n * <AnimatePresence mode=\"wait\">\n * {loading ? (\n * <m.span key=\"loading\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * <LoadingIndicator />\n * </m.span>\n * ) : (\n * <m.span key=\"icon\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * {icon}\n * </m.span>\n * )}\n * </AnimatePresence>\n * ```\n */\nexport const ICON_SPAN_VARIANTS: {\n\tinitial: Target;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { scale: 0.01 },\n\tanimate: { scale: 1 },\n\texit: { scale: 0.01 },\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 TextField Animation Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Standard easing curve — used for label float, active indicator expand.\n * cubic-bezier(0.2, 0, 0, 1)\n *\n * @see https://m3.material.io/foundations/animation/easing-and-duration\n */\nexport const MD3_STANDARD_EASING: [number, number, number, number] = [\n\t0.2, 0, 0, 1,\n];\n\n/**\n * Duration for floating label transition: 150ms.\n * Used when label moves between inline position ↔ floated position.\n */\nexport const MD3_LABEL_FLOAT_DURATION = 0.15;\n\n/**\n * Duration for active indicator expand/collapse: 200ms.\n * Used for the bottom border (filled) and outline (outlined) on focus.\n */\nexport const MD3_INDICATOR_DURATION = 0.2;\n\n/**\n * Duration for supporting text / error text appear/disappear: 120ms.\n */\nexport const MD3_SUPPORTING_DURATION = 0.12;\n\n/**\n * Duration for trailing icon appear/disappear (clear button, password toggle): 100ms.\n */\nexport const MD3_ICON_SWAP_DURATION = 0.1;\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SPRING_TRANSITION_FAST } from \"./shared/constants\";\n\n// @internal — font must be loaded via '@bug-on/m3-expressive/material-symbols.css'\nconst VARIANT_FONT: Record<NonNullable<IconProps[\"variant\"]>, string> = {\n\toutlined: \"'Material Symbols Outlined'\",\n\trounded: \"'Material Symbols Rounded'\",\n\tsharp: \"'Material Symbols Sharp'\",\n};\n\n/**\n * Props cho component {@link Icon}.\n *\n * All variable font axes are mapped directly to `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Name of the Material Symbol in snake_case format.\n\t * @example \"home\", \"arrow_forward\", \"settings\"\n\t * @see https://fonts.google.com/icons\n\t */\n\tname: string;\n\n\t/**\n\t * Geometric style variant — maps to font family.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * `FILL` axis. `0` = outlined, `1` = filled.\n\t * Features spring animation when `animateFill` is true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * `wght` axis — stroke weight. Should match surrounding text weight.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * `GRAD` axis — fine-tunes visual weight without affecting layout dimensions.\n\t * Use `-25` on dark backgrounds to offset light halation effects.\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * `opsz` axis — optical size in dp. Used to set `font-size` if `size` is not specified.\n\t * Match rendered pixel size for best quality.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Direct `font-size` override in px. `opsz` axis still respects `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * Enables smooth spring animation when toggling FILL axis (uses `SPRING_TRANSITION_FAST`).\n\t * Requires `motion` dependency.\n\t * @default false\n\t * @example <Icon name=\"favorite\" fill={isLiked ? 1 : 0} animateFill />\n\t */\n\tanimateFill?: boolean;\n}\n\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvariant = \"outlined\",\n\t\t\tfill = 0,\n\t\t\tweight = 400,\n\t\t\tgrade = 0,\n\t\t\topticalSize = 24,\n\t\t\tsize,\n\t\t\tanimateFill = false,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst fontVariationSettings = `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' ${opticalSize}`;\n\n\t\tconst computedStyle: React.CSSProperties = {\n\t\t\tfontFamily: VARIANT_FONT[variant],\n\t\t\tfontSize:\n\t\t\t\tsize === \"inherit\"\n\t\t\t\t\t? \"inherit\"\n\t\t\t\t\t: size != null\n\t\t\t\t\t\t? `${size}px`\n\t\t\t\t\t\t: `${opticalSize}px`,\n\t\t\tfontVariationSettings,\n\t\t\t...style,\n\t\t};\n\n\t\tif (animateFill) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tanimate={{ fontVariationSettings }}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION_FAST}\n\t\t\t\t\t\tstyle={computedStyle}\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: motion v12 HTMLMotionProps conflicts with React's event types\n\t\t\t\t\t\t{...(restProps as any)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</m.span>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={computedStyle}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t);\n\t},\n);\n\nIconComponent.displayName = \"Icon\";\n\n/**\n * Material Symbols (variable font) Icon component.\n *\n * Make sure to import the icon font CSS before usage:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols-cdn.css';\n * ```\n *\n * @remarks\n * - Use snake_case for icon names: `\"arrow_forward\"`, NOT `\"ArrowForward\"`.\n * - `aria-hidden=\"true\"` is attached automatically — provide screen reader labels on parent elements.\n *\n * @example\n * ```tsx\n * // Basic Icon\n * <Icon name=\"home\" />\n *\n * // Visual customization (filled, heavy weight)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animated transition on state change\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // Custom size override\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Combination with other components\n * <Button icon={<Icon name=\"add\" />}>Add to cart</Button>\n * ```\n *\n * @see https://fonts.google.com/icons\n * @see https://m3.material.io/styles/icons/overview\n */\nexport const Icon = React.memo(IconComponent);\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.max(\n\t\t\t\tMath.hypot(rect.width, rect.height) * 2.5,\n\t\t\t\t320,\n\t\t\t);\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// Delays <animate> tag insertion by 1 frame via requestAnimationFrame\n\t// to bypass Chromium SMIL freezing bugs when parent container executes CSS transforms/animations.\n\n\tconst [ready, setReady] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tconst raf = requestAnimationFrame(() => setReady(true));\n\t\treturn () => cancelAnimationFrame(raf);\n\t}, []);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t>\n\t\t\t<path d={SHAPE_VALUES.split(\";\")[0]}>\n\t\t\t\t{ready && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={SHAPE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={SHAPE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={SHAPE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<animateTransform\n\t\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\t\tattributeType=\"XML\"\n\t\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={ROTATE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={ROTATE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={ROTATE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</path>\n\t\t</svg>\n\t);\n});\n\n// ─── Determinate SVG (React-controlled morph + counterclockwise rotation) ────\n// Uses CSS transition for smooth d attribute changes where supported (Chromium),\n// with a style-based transform fallback for rotation.\nconst DeterminateSvg = React.memo(function DeterminateSvg({\n\tsize,\n\tprogress,\n}: {\n\tsize: number;\n\tprogress: number;\n}) {\n\t// Clamp and interpolate progress between 0 (circle) and 1 (soft burst)\n\tconst p = Math.min(1, Math.max(0, progress));\n\n\t// Counterclockwise rotation: 0° at 0% → -180° at 100% (per Android spec)\n\tconst rotation = -180 * p;\n\n\t// The path morphs from circle (p=0) to soft-burst (p=1).\n\t// We use a SMIL animate with begin=\"indefinite\" that we snap to progress.\n\t// For maximum compatibility, render the correct endpoint shape based on progress,\n\t// relying on the CSS `d` property transition for smooth animation.\n\tconst pathD = p < 0.5 ? DETERMINATE_CIRCLE : DETERMINATE_SOFT_BURST;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tstyle={{\n\t\t\t\ttransform: `rotate(${rotation}deg)`,\n\t\t\t\ttransition: \"transform 0.3s ease\",\n\t\t\t}}\n\t\t>\n\t\t\t<path d={pathD} style={{ transition: \"d 0.3s ease\" }} />\n\t\t</svg>\n\t);\n});\n\n// ─── Main Component ───────────────────────────────────────────────────────────\nexport const LoadingIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tLoadingIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"uncontained\",\n\t\t\tsize = 48,\n\t\t\tprogress,\n\t\t\tcolor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isContained = variant === \"contained\";\n\t\tconst isDeterminate = progress !== undefined;\n\n\t\t// MD3 spec: strict size range [24dp, 240dp]\n\t\tconst clampedSize = Math.min(240, Math.max(24, size));\n\n\t\t// Proportional scaling based on the default 48dp spec size\n\t\tconst scaleFactor = clampedSize / 48;\n\n\t\t// MD3 spec: contained → 38dp container, 24dp active indicator\n\t\t// Ratio: 38/24 = 1.583 — preserved at all sizes\n\t\tconst containerSize = isContained ? 38 * scaleFactor : undefined;\n\t\tconst indicatorSize = isContained ? 24 * scaleFactor : clampedSize;\n\n\t\t// MD3 color tokens (with per-variant defaults)\n\t\tconst activeColor = isContained\n\t\t\t? (color ?? \"var(--md-sys-color-indicator-contained-active)\")\n\t\t\t: (color ?? \"var(--md-sys-color-indicator-active)\");\n\n\t\t// aria-valuenow is only set in determinate mode (per ARIA spec)\n\t\tconst ariaNow = isDeterminate\n\t\t\t? Math.round(Math.min(1, Math.max(0, progress)) * 100)\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuenow={ariaNow}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: clampedSize,\n\t\t\t\t\theight: clampedSize,\n\t\t\t\t\tcolor: activeColor,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{isContained ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-center rounded-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: containerSize,\n\t\t\t\t\t\t\theight: containerSize,\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\"var(--md-sys-color-indicator-contained-container)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : isDeterminate ? (\n\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t) : (\n\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n","export function easeInOutCubic(x: number): number {\n\treturn x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function generateWavyCircularPath(\n\tcenter: number,\n\tradius: number,\n\tamplitude: number,\n\twavelength: number,\n): string {\n\tconst circumference = 2 * Math.PI * radius;\n\tconst numWaves = Math.max(\n\t\t3,\n\t\tMath.round(circumference / Math.max(1, wavelength)),\n\t);\n\tconst steps = numWaves * 4;\n\tconst dt = (2 * Math.PI) / steps;\n\n\tconst rAt = (t: number) => radius + amplitude * Math.sin(numWaves * t);\n\tconst drAt = (t: number) => amplitude * numWaves * Math.cos(numWaves * t);\n\tconst xAt = (t: number) => center + rAt(t) * Math.cos(t);\n\tconst yAt = (t: number) => center + rAt(t) * Math.sin(t);\n\tconst dxAt = (t: number) => drAt(t) * Math.cos(t) - rAt(t) * Math.sin(t);\n\tconst dyAt = (t: number) => drAt(t) * Math.sin(t) + rAt(t) * Math.cos(t);\n\n\tlet d = \"\";\n\tconst tStart = 0;\n\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst t0 = tStart + i * dt;\n\t\tconst t1 = tStart + (i + 1) * dt;\n\n\t\tconst scale = dt / 3;\n\t\tconst cp1x = xAt(t0) + scale * dxAt(t0);\n\t\tconst cp1y = yAt(t0) + scale * dyAt(t0);\n\t\tconst cp2x = xAt(t1) - scale * dxAt(t1);\n\t\tconst cp2y = yAt(t1) - scale * dyAt(t1);\n\n\t\tif (i === 0) d += `M ${xAt(t0).toFixed(2)} ${yAt(t0).toFixed(2)}`;\n\t\td += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${xAt(t1).toFixed(2)} ${yAt(t1).toFixed(2)}`;\n\t}\n\td += \" Z\";\n\treturn d;\n}\n\nexport function getSinePath(\n\tstartX: number,\n\tendX: number,\n\tphase: number,\n\twl: number,\n\tamp: number,\n) {\n\tif (startX >= endX) return \"\";\n\tlet d = \"\";\n\tconst step = amp === 0 ? Math.max(10, endX - startX) : 1;\n\n\tconst yStart = Math.sin(((startX + phase) / wl) * 2 * Math.PI) * amp;\n\td += `M ${startX.toFixed(2)} ${yStart.toFixed(2)}`;\n\n\tlet nextX = Math.ceil(startX / step) * step;\n\tif (nextX === startX) nextX += step;\n\n\twhile (nextX < endX) {\n\t\tconst y = Math.sin(((nextX + phase) / wl) * 2 * Math.PI) * amp;\n\t\td += ` L ${nextX.toFixed(2)} ${y.toFixed(2)}`;\n\t\tnextX += step;\n\t}\n\n\tconst yEnd = Math.sin(((endX + phase) / wl) * 2 * Math.PI) * amp;\n\td += ` L ${endX.toFixed(2)} ${yEnd.toFixed(2)}`;\n\n\treturn d;\n}\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CircularProgressProps } from \"./types\";\nimport { generateWavyCircularPath } from \"./utils\";\n\nexport const CircularProgress = React.forwardRef<\n\tHTMLDivElement,\n\tCircularProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tsize = 48,\n\t\t\ttrackHeight = 4,\n\t\t\tshape = \"flat\",\n\t\t\tamplitude,\n\t\t\twavelength,\n\t\t\tgapSize = 4,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst radius = (size - trackHeight) / 2;\n\t\tconst center = size / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\tconst isWavy = shape === \"wavy\";\n\n\t\tconst BASELINE_SIZE = 48;\n\t\tconst scaleFactor = size / BASELINE_SIZE;\n\t\tconst effectiveAmplitude = React.useMemo(\n\t\t\t() => amplitude ?? 1.6 * scaleFactor,\n\t\t\t[amplitude, scaleFactor],\n\t\t);\n\t\tconst effectiveWavelength = React.useMemo(\n\t\t\t() => wavelength ?? 15 * scaleFactor,\n\t\t\t[wavelength, scaleFactor],\n\t\t);\n\n\t\tconst wavyActivePath = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisWavy\n\t\t\t\t\t? generateWavyCircularPath(\n\t\t\t\t\t\t\tcenter,\n\t\t\t\t\t\t\tradius,\n\t\t\t\t\t\t\teffectiveAmplitude,\n\t\t\t\t\t\t\teffectiveWavelength,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t[isWavy, center, radius, effectiveAmplitude, effectiveWavelength],\n\t\t);\n\n\t\tconst circumference = React.useMemo(() => 2 * Math.PI * radius, [radius]);\n\t\tconst gapForTrack = React.useMemo(\n\t\t\t() => (gapSize + trackHeight) / circumference,\n\t\t\t[gapSize, trackHeight, circumference],\n\t\t);\n\t\tconst activeAngularFraction = isDeterminate ? clampedValue / 100 : 0;\n\n\t\tconst trackOffset = isDeterminate ? activeAngularFraction + gapForTrack : 0;\n\t\tconst trackLength = isDeterminate\n\t\t\t? Math.max(0.001, 1 - activeAngularFraction - 2 * gapForTrack)\n\t\t\t: 1;\n\n\t\tconst ActiveCircleElem = m.circle;\n\t\tconst ActivePathElem = m.path;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{ transform: \"rotate(-90deg)\", overflow: \"visible\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tinitial={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\tanimate={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{isDeterminate &&\n\t\t\t\t\t\t\t(isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{!isDeterminate && (\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\t\trotate: \"-90deg\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{ rotate: [\"-90deg\", \"270deg\"] }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\trotate: {\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tpathLength: [\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.75 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\trotate: [\n\t\t\t\t\t\t\t\t\t\t`${(0.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.0 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.svg>\n\t\t\t\t\t)}\n\t\t\t\t</LazyMotion>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCircularProgress.displayName = \"CircularProgress\";\n","import * as React from \"react\";\n\nexport function useContainerWidth() {\n\tconst [width, setWidth] = React.useState(0);\n\tconst observerRef = React.useRef<ResizeObserver | null>(null);\n\n\tconst ref = React.useCallback((node: HTMLDivElement | null) => {\n\t\tif (observerRef.current) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\n\t\tif (node) {\n\t\t\tconst obs = new ResizeObserver((entries) => {\n\t\t\t\tconst contentRect = entries[0].contentRect;\n\t\t\t\tsetWidth(contentRect.width);\n\t\t\t});\n\t\t\tobs.observe(node);\n\t\t\tobserverRef.current = obs;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (observerRef.current) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn [ref, width] as const;\n}\n\nexport function useMergedRef<T>(\n\t...refs: (React.Ref<T> | undefined | null)[]\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\tfor (const ref of refs) {\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t\t(ref as React.MutableRefObject<T | null>).current = node;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[refs],\n\t);\n}\n","import { m } from \"motion/react\";\nimport * as React from \"react\";\n\nexport const FlatLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\tcrawlerSpeed: number;\n}>(function FlatLinearTrack({\n\ttrackHeight,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\tcrawlerSpeed,\n}) {\n\tconst isDeterminate = value !== undefined;\n\tconst radius = trackHeight / 2;\n\tconst minActiveWidth = trackHeight;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: trackHeight, borderRadius: radius }}\n\t\t>\n\t\t\t{isDeterminate ? (\n\t\t\t\t<>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: trackColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, 0%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, ${value}%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: activeColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\tminWidth: minActiveWidth,\n\t\t\t\t\t\t\t...(isRtl ? { right: 0 } : { left: 0 }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{ width: `${minActiveWidth}px` }}\n\t\t\t\t\t\tanimate={{ width: `${value}%` }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: trackColor, borderRadius: radius }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: activeColor, borderRadius: radius }}\n\t\t\t\t\t\tinitial={{ left: \"-40%\", width: \"40%\" }}\n\t\t\t\t\t\tanimate={{ left: [\"-40%\", \"100%\"], width: [\"40%\", \"20%\", \"40%\"] }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { animate, useAnimationFrame, useMotionValue } from \"motion/react\";\nimport * as React from \"react\";\nimport { useContainerWidth } from \"./hooks\";\nimport { easeInOutCubic, getSinePath } from \"./utils\";\n\nexport const WavyLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tsvgHeight: number;\n\tamplitude: number;\n\twavelength: number;\n\tindeterminateWavelength: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\twaveSpeed: number;\n\tcrawlerSpeed: number;\n\tdeterminateAnimation: \"md3\" | \"continuous\";\n\tindeterminateAnimation: \"md3\" | \"continuous\";\n\ttrackShape: \"flat\" | \"wavy\";\n}>(function WavyLinearTrack({\n\ttrackHeight,\n\tsvgHeight,\n\tamplitude,\n\twavelength,\n\tindeterminateWavelength,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\twaveSpeed,\n\tcrawlerSpeed,\n\tdeterminateAnimation,\n\tindeterminateAnimation,\n\ttrackShape,\n}) {\n\tconst isDeterminate = typeof value === \"number\";\n\tconst clampedValue = isDeterminate ? Math.max(0, Math.min(100, value)) : 100;\n\tconst titleId = React.useId();\n\n\tconst [containerRef, width] = useContainerWidth();\n\n\tconst activePathRef = React.useRef<SVGPathElement>(null);\n\tconst trackPathRef = React.useRef<SVGPathElement>(null);\n\n\tconst amplitudeMV = useMotionValue(amplitude);\n\tconst fractionMV = useMotionValue(isDeterminate ? clampedValue / 100 : 1);\n\n\tReact.useEffect(() => {\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = clampedValue / 100;\n\n\t\t\t// Handle Flattening Logic based on determinateAnimation prop\n\t\t\tlet targetAmp = amplitude;\n\t\t\tif (determinateAnimation === \"md3\") {\n\t\t\t\ttargetAmp = fraction <= 0.1 || fraction >= 0.95 ? 0 : amplitude;\n\t\t\t}\n\n\t\t\tanimate(amplitudeMV, targetAmp, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tbounce: 0,\n\t\t\t\tduration: 0.5,\n\t\t\t});\n\t\t\tanimate(fractionMV, fraction, { duration: 0.4, ease: [0.2, 0, 0, 1] });\n\t\t}\n\t}, [\n\t\tclampedValue,\n\t\tisDeterminate,\n\t\tamplitude,\n\t\tamplitudeMV,\n\t\tfractionMV,\n\t\tdeterminateAnimation,\n\t]);\n\n\tconst activeWavelength = Math.max(\n\t\t1,\n\t\tisDeterminate ? wavelength : indeterminateWavelength,\n\t);\n\tconst trackAmp = trackShape === \"wavy\" ? amplitude : 0;\n\n\tuseAnimationFrame((time) => {\n\t\tif (width === 0) return;\n\n\t\tconst currentAmp = amplitudeMV.get();\n\t\tconst phase = (time / 1000) * waveSpeed * activeWavelength;\n\t\tconst capWidth = trackHeight / 2;\n\n\t\tlet activePathD = \"\";\n\t\tlet trackD = \"\";\n\t\tconst totalGap = gapSize + trackHeight;\n\n\t\t// 1. DETERMINATE MODE\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = fractionMV.get();\n\t\t\tconst barHead = fraction * width;\n\n\t\t\tconst adjHead = Math.max(capWidth, Math.min(width - capWidth, barHead));\n\t\t\tconst adjTail = capWidth;\n\n\t\t\tif (fraction > 0 && adjHead - adjTail > 0.1) {\n\t\t\t\tactivePathD = getSinePath(\n\t\t\t\t\tadjTail,\n\t\t\t\t\tadjHead,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\tcurrentAmp,\n\t\t\t\t);\n\t\t\t} else if (fraction === 0) {\n\t\t\t\tactivePathD = `M ${capWidth} 0 L ${capWidth + 0.01} 0`;\n\t\t\t}\n\n\t\t\tconst trackStart = adjHead + totalGap;\n\t\t\tif (trackStart < width - capWidth) {\n\t\t\t\ttrackD = getSinePath(\n\t\t\t\t\ttrackStart,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// 2. INDETERMINATE MODE\n\t\telse {\n\t\t\tconst safeCrawlerSpeed = Math.max(0.1, crawlerSpeed);\n\t\t\tconst activeLines: { tail: number; head: number }[] = [];\n\n\t\t\tif (indeterminateAnimation === \"continuous\") {\n\t\t\t\tconst cycle = 2000 / safeCrawlerSpeed;\n\t\t\t\tconst fraction = (time % cycle) / cycle;\n\t\t\t\tactiveLines.push({\n\t\t\t\t\ttail: easeInOutCubic(Math.max(0, fraction * 1.5 - 0.5)),\n\t\t\t\t\thead: easeInOutCubic(Math.min(1, fraction * 1.5)),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cycle = 1750 / safeCrawlerSpeed;\n\t\t\t\tconst t = (time % cycle) * safeCrawlerSpeed;\n\n\t\t\t\tconst l1H = easeInOutCubic(Math.max(0, Math.min(1, t / 1000)));\n\t\t\t\tconst l1T = easeInOutCubic(Math.max(0, Math.min(1, (t - 250) / 1000)));\n\t\t\t\tconst l2H = easeInOutCubic(Math.max(0, Math.min(1, (t - 650) / 850)));\n\t\t\t\tconst l2T = easeInOutCubic(Math.max(0, Math.min(1, (t - 900) / 850)));\n\n\t\t\t\tactiveLines.push({ tail: l1T, head: l1H });\n\t\t\t\tactiveLines.push({ tail: l2T, head: l2H });\n\t\t\t}\n\n\t\t\tconst segments = activeLines\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst barTail = line.tail * width;\n\t\t\t\t\tconst barHead = line.head * width;\n\t\t\t\t\tconst adjTail = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barTail),\n\t\t\t\t\t);\n\t\t\t\t\tconst adjHead = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barHead),\n\t\t\t\t\t);\n\t\t\t\t\treturn { adjTail, adjHead };\n\t\t\t\t})\n\t\t\t\t.filter((seg) => seg.adjHead - seg.adjTail > 0.1);\n\n\t\t\tactivePathD = segments\n\t\t\t\t.map((seg) =>\n\t\t\t\t\tgetSinePath(\n\t\t\t\t\t\tseg.adjTail,\n\t\t\t\t\t\tseg.adjHead,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tactiveWavelength,\n\t\t\t\t\t\tcurrentAmp,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.join(\" \");\n\n\t\t\tlet currentTrackX = capWidth;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst trackEnd = seg.adjTail - totalGap;\n\t\t\t\tif (trackEnd > currentTrackX) {\n\t\t\t\t\ttrackD += `${getSinePath(currentTrackX, trackEnd, phase, activeWavelength, trackAmp)} `;\n\t\t\t\t}\n\t\t\t\tcurrentTrackX = Math.max(currentTrackX, seg.adjHead + totalGap);\n\t\t\t}\n\t\t\tif (currentTrackX < width - capWidth) {\n\t\t\t\ttrackD += getSinePath(\n\t\t\t\t\tcurrentTrackX,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (activePathRef.current)\n\t\t\tactivePathRef.current.setAttribute(\"d\", activePathD);\n\t\tif (trackPathRef.current)\n\t\t\ttrackPathRef.current.setAttribute(\"d\", trackD.trim());\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: svgHeight }}\n\t\t>\n\t\t\t{width > 0 && (\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"absolute inset-0 w-full h-full\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\ttransform: isRtl ? \"scaleX(-1)\" : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t>\n\t\t\t\t\t<title id={titleId}>\n\t\t\t\t\t\t{isDeterminate\n\t\t\t\t\t\t\t? `Progress: ${clampedValue}%`\n\t\t\t\t\t\t\t: \"Indeterminate loading progress\"}\n\t\t\t\t\t</title>\n\t\t\t\t\t<g transform={`translate(0, ${svgHeight / 2})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={trackPathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={trackColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={activePathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMergedRef } from \"./hooks\";\nimport { FlatLinearTrack } from \"./linear-flat\";\nimport { WavyLinearTrack } from \"./linear-wavy\";\nimport type { LinearProgressProps } from \"./types\";\n\nexport const LinearProgress = React.forwardRef<\n\tHTMLDivElement,\n\tLinearProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tshape = \"flat\",\n\t\t\ttrackShape,\n\t\t\ttrackHeight = 4,\n\t\t\tamplitude,\n\t\t\twavelength = 40,\n\t\t\tindeterminateWavelength = 20,\n\t\t\twaveSpeed = 1,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tdeterminateAnimation = \"md3\",\n\t\t\tindeterminateAnimation = \"continuous\",\n\t\t\tgapSize = 4,\n\t\t\tshowStopIndicator = \"auto\",\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, containerRef);\n\t\tconst [isRtl, setIsRtl] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (containerRef.current) {\n\t\t\t\tconst dir = getComputedStyle(containerRef.current).direction;\n\t\t\t\tsetIsRtl(dir === \"rtl\");\n\t\t\t}\n\t\t}, []);\n\n\t\tconst isWavy = shape === \"wavy\";\n\t\tconst resolvedTrackShape = trackShape ?? shape;\n\n\t\tconst effectiveAmplitude = React.useMemo(() => amplitude ?? 3, [amplitude]);\n\t\tconst svgHeight = React.useMemo(\n\t\t\t() => (isWavy ? trackHeight + effectiveAmplitude * 2 : trackHeight),\n\t\t\t[isWavy, trackHeight, effectiveAmplitude],\n\t\t);\n\n\t\tconst shouldShowStop = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisDeterminate &&\n\t\t\t\tresolvedTrackShape === \"flat\" &&\n\t\t\t\t(showStopIndicator === true ||\n\t\t\t\t\t(showStopIndicator === \"auto\" && isDeterminate)),\n\t\t\t[isDeterminate, resolvedTrackShape, showStopIndicator],\n\t\t);\n\n\t\tconst stopSize = React.useMemo(\n\t\t\t() => Math.max(2, trackHeight > 4 ? 4 : trackHeight / 2),\n\t\t\t[trackHeight],\n\t\t);\n\n\t\tconst stopOffset = (trackHeight - stopSize) / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex w-full flex-col justify-center\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: svgHeight }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t<WavyLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tsvgHeight={svgHeight}\n\t\t\t\t\t\t\tamplitude={effectiveAmplitude}\n\t\t\t\t\t\t\twavelength={wavelength}\n\t\t\t\t\t\t\tindeterminateWavelength={indeterminateWavelength}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\twaveSpeed={waveSpeed}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t\tdeterminateAnimation={determinateAnimation}\n\t\t\t\t\t\t\tindeterminateAnimation={indeterminateAnimation}\n\t\t\t\t\t\t\ttrackShape={resolvedTrackShape}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlatLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowStop && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute rounded-full\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: stopSize,\n\t\t\t\t\t\t\t\theight: stopSize,\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-indicator-stop)\",\n\t\t\t\t\t\t\t\ttop: svgHeight / 2 - stopSize / 2,\n\t\t\t\t\t\t\t\t...(isRtl ? { left: stopOffset } : { right: stopOffset }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nLinearProgress.displayName = \"LinearProgress\";\n","import * as React from \"react\";\nimport { CircularProgress } from \"./circular\";\nimport { LinearProgress } from \"./linear\";\nimport type { ProgressIndicatorProps } from \"./types\";\n\n/**\n * Progress Indicator component based on Material Design 3 Expressive guidelines.\n * Flexible support for 2 presentation variants: Linear and Circular,\n * with smooth dynamic Wavy shape profiles.\n *\n * @example\n * ```tsx\n * // Determinate Flat Linear\n * <ProgressIndicator variant=\"linear\" value={60} aria-label=\"Loading profile...\" />\n *\n * // Indeterminate Wavy Linear\n * <ProgressIndicator variant=\"linear\" shape=\"wavy\" aria-label=\"Connecting to server...\" />\n *\n * // Determinate Flat Circular\n * <ProgressIndicator variant=\"circular\" value={45} size={48} aria-label=\"Syncing...\" />\n * ```\n */\n\nexport const ProgressIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tProgressIndicatorProps\n>((props, ref) => {\n\tif (props.variant === \"circular\") {\n\t\treturn <CircularProgress ref={ref} {...props} />;\n\t}\n\treturn <LinearProgress ref={ref} {...props} />;\n});\n\nProgressIndicator.displayName = \"ProgressIndicator\";\n\nexport type {\n\tCircularProgressProps,\n\tLinearProgressProps,\n\tProgressIndicatorProps,\n} from \"./types\";\n","/**\n * @file shared/touch-target.tsx\n *\n * Invisible 48×48dp touch-target expander for small interactive elements.\n *\n * WCAG 2.5.5 (Level AA) requires interactive targets to be at least 44×44 CSS pixels.\n * MD3 specifies a minimum 48dp touch target for all interactive components.\n * For button sizes XS (32dp) and SM (40dp) that are smaller than this minimum,\n * an invisible absolutely-positioned `<span>` is overlaid to extend the\n * effective tap area without affecting visual layout.\n *\n * @see https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n * @see https://m3.material.io/foundations/accessible-design/accessibility-basics\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TouchTarget Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invisible 48×48dp touch area expander — satisfies WCAG 2.5.5 + MD3 spec.\n *\n * Place as a direct child of any interactive element whose visual size is\n * smaller than 48dp (e.g. `xs`/`sm` buttons and icon buttons).\n * The parent element **must** have `position: relative`.\n *\n * @remarks\n * - Hidden from assistive technologies via `aria-hidden=\"true\"`.\n * - `pointer-events: none` ensures it does not intercept click events.\n * - Centred with `left: 50% / top: 50%` + negative translate for symmetry.\n *\n * @example\n * ```tsx\n * // Used inside a 32dp XS button:\n * <button className=\"relative h-8 w-auto ...\">\n * <TouchTarget />\n * Label\n * </button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/specs (Touch target section)\n */\nexport function TouchTarget() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 min-w-12 min-h-12 cursor-pointer pointer-events-none\"\n\t\t/>\n\t);\n}\n","/**\n * @file icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SIZE_HEIGHT_STYLES: Record<string, string> = {\n\txs: \"h-8\",\n\tsm: \"h-10\",\n\tmd: \"h-14\",\n\tlg: \"h-24\",\n\txl: \"h-[8.5rem]\",\n};\n\n/**\n * Per-size container width variants (Tailwind utility classes).\n * MD3 Expressive width variants: default (1:1), narrow, wide.\n * @internal\n */\nconst WIDTH_SIZE_STYLES: Record<string, Record<string, string>> = {\n\txs: {\n\t\tdefault: \"w-8\",\n\t\tnarrow: \"w-8\",\n\t\twide: \"w-12\",\n\t},\n\tsm: {\n\t\tdefault: \"w-10\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[3.25rem]\",\n\t},\n\tmd: {\n\t\tdefault: \"w-14\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[4.5rem]\",\n\t},\n\tlg: {\n\t\tdefault: \"w-24\",\n\t\tnarrow: \"w-16\",\n\t\twide: \"w-32\",\n\t},\n\txl: {\n\t\tdefault: \"w-[8.5rem]\",\n\t\tnarrow: \"w-[6.5rem]\",\n\t\twide: \"w-[11.5rem]\",\n\t},\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container width variant following MD3 Expressive specification.\n\t * - `default`: 1:1 aspect ratio square/round container.\n\t * - `narrow`: compressed width.\n\t * - `wide`: extended width.\n\t * @default \"default\"\n\t */\n\twidthVariant?: \"default\" | \"narrow\" | \"wide\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * An optional icon to display when the icon button is in a selected toggle state (`variant=\"toggle\"` and `selected={true}`).\n\t * If omitted, falls back to `children`.\n\t */\n\tselectedIcon?: React.ReactNode;\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n\t/**\n\t * Change the component to the underlying child element and merge props/behavior.\n\t * Useful when wrapping in Next.js `<Link>` or custom anchor tags.\n\t * @default false\n\t */\n\tasChild?: boolean;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\twidthVariant = \"default\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tselectedIcon,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\tconst heightClass = SIZE_HEIGHT_STYLES[size] ?? SIZE_HEIGHT_STYLES.sm;\n\t\tconst widthClass =\n\t\t\t(WIDTH_SIZE_STYLES[size] ?? WIDTH_SIZE_STYLES.sm)[widthVariant] ??\n\t\t\tWIDTH_SIZE_STYLES.sm.default;\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey={isSelected && selectedIcon ? \"selected-content\" : \"content\"}\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelected && selectedIcon\n\t\t\t\t\t\t\t\t? selectedIcon\n\t\t\t\t\t\t\t\t: asChild\n\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\tReact.Children.only(children) as React.ReactElement<{\n\t\t\t\t\t\t\t\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t).props.children\n\t\t\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst containerClassName = cn(\n\t\t\tbaseIconButtonClasses,\n\t\t\tresolvedColorClass,\n\t\t\toutlineWidthClass,\n\t\t\tdisabledBgClass,\n\t\t\t\"overflow-hidden\",\n\t\t\theightClass,\n\t\t\twidthClass,\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(style as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t{...(restProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","/**\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 { IconButton } from \"../buttons/icon-button\";\nimport { Icon } from \"../icon\";\nimport { DEFAULT_SPATIAL_SPRING } from \"../shared/motion-tokens\";\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\n// MD3 default.spatial: stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19\nconst SNACKBAR_SPRING = DEFAULT_SPATIAL_SPRING;\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\nexport const SnackbarContext = React.createContext<SnackbarContextValue | null>(\n\tnull,\n);\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 * 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 * @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","import { domMax, LazyMotion } from \"motion/react\";\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport {\n\tapplyTheme,\n\ttype ContrastLevel,\n\ttype SchemeVariant,\n\ttype ThemeMode,\n} from \"../../lib/theme-utils\";\n\nimport {\n\tSnackbarContext,\n\tSnackbarHost,\n\tuseSnackbarState,\n} from \"../snackbar/snackbar\";\nimport { Typography, TypographyContext } from \"../typography/typography\";\nimport {\n\ttype FontVariationAxes,\n\tTypographyTokens,\n} from \"../typography/typography-tokens\";\n\n// ─── Theme Context ─────────────────────────────────────────────────────────────\n\ninterface ThemeContextValue {\n\tsourceColor: string;\n\tsetSourceColor: (color: string) => void;\n\tmode: ThemeMode;\n\tsetMode: (mode: ThemeMode) => void;\n\t/** The resolved color scheme actually applied — always \"light\" or \"dark\". */\n\teffectiveMode: \"light\" | \"dark\";\n\t/** Active color scheme variant. */\n\tvariant: SchemeVariant;\n\t/** Active contrast level. */\n\tcontrastLevel: ContrastLevel;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nconst STORAGE_KEY_COLOR = \"md3-source-color\";\nconst STORAGE_KEY_MODE = \"md3-theme-mode\";\n\n// ─── Singleton defaults (computed once) ───────────────────────────────────────\n\nconst defaultTokens = new TypographyTokens();\nconst defaultTypography = new Typography(defaultTokens);\n\n// ─── MD3ThemeProvider ──────────────────────────────────────────────────────────\n\nexport interface MD3ThemeProviderProps {\n\tchildren: ReactNode;\n\t// ── Theme ─────────────────────────────────────────────────────────────────\n\tsourceColor?: string;\n\tdefaultMode?: ThemeMode;\n\tpersistToLocalStorage?: boolean;\n\t/**\n\t * Color scheme variant controlling hue and chroma behaviour.\n\t * - `\"expressive\"` — MD3 Expressive 2025 (high-chroma, detached from seed). **Default.**\n\t * - `\"tonal_spot\"` — Standard Android 12+ theme.\n\t * - `\"vibrant\"` | `\"fidelity\"` | `\"content\"` | `\"monochrome\"` | `\"neutral\"`\n\t * @default \"expressive\"\n\t */\n\tvariant?: SchemeVariant;\n\t/**\n\t * Contrast level for the generated scheme.\n\t * - `0` — Standard (default)\n\t * - `0.5` — Medium contrast\n\t * - `1` — Maximum contrast (WCAG AAA)\n\t * @default 0\n\t */\n\tcontrastLevel?: ContrastLevel;\n\t// ── Typography ────────────────────────────────────────────────────────────\n\t/**\n\t * A fully custom `Typography` instance.\n\t * When provided, `fontFamily` and `fontVariationAxes` are ignored.\n\t */\n\ttypography?: Typography;\n\t/**\n\t * Override the CSS `font-family` for all typography styles.\n\t * Ignored when `typography` prop is provided.\n\t * @example \"'Inter', sans-serif\"\n\t */\n\tfontFamily?: string;\n\t/**\n\t * Variable font axes applied globally via `font-variation-settings`.\n\t * Merged on top of defaults (`ROND: 100`). Ignored when `typography` is provided.\n\t * @example { ROND: 50 }\n\t */\n\tfontVariationAxes?: FontVariationAxes;\n\t// ── Snackbar ──────────────────────────────────────────────────────────────\n\t/**\n\t * When `true`, mounts `SnackbarHost` inside the provider and exposes\n\t * `useSnackbar()` to all descendants — no separate `<SnackbarProvider>` needed.\n\t *\n\t * Opt-in, default `false`. For advanced usage (e.g., scoped snackbars or\n\t * custom host positioning), keep this `false` and use `<SnackbarProvider>`\n\t * or `<SnackbarHost>` directly.\n\t *\n\t * @default false\n\t */\n\tenableSnackbar?: boolean;\n}\n\nexport function MD3ThemeProvider({\n\tchildren,\n\tsourceColor: initialSourceColor = \"#6750A4\",\n\tdefaultMode = \"light\",\n\tpersistToLocalStorage = false,\n\tvariant = \"expressive\",\n\tcontrastLevel = 0,\n\ttypography: typographyProp,\n\tfontFamily,\n\tfontVariationAxes,\n\tenableSnackbar = false,\n}: MD3ThemeProviderProps) {\n\t// ── Theme state ──────────────────────────────────────────────────────────\n\tconst [sourceColor, setSourceColor] = useState(initialSourceColor);\n\tconst [mode, setMode] = useState<ThemeMode>(defaultMode);\n\tconst [isHydrated, setIsHydrated] = useState(!persistToLocalStorage);\n\tconst [systemMode, setSystemMode] = useState<\"light\" | \"dark\">(\"light\");\n\n\t// Listen for OS prefers-color-scheme changes and keep systemMode state in sync\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\t\tconst updateSystemMode = () => {\n\t\t\tsetSystemMode(mediaQuery.matches ? \"dark\" : \"light\");\n\t\t};\n\n\t\tupdateSystemMode();\n\t\tmediaQuery.addEventListener(\"change\", updateSystemMode);\n\t\treturn () => mediaQuery.removeEventListener(\"change\", updateSystemMode);\n\t}, []);\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\" || savedMode === \"system\")\n\t\t\tsetMode(savedMode);\n\n\t\tsetIsHydrated(true);\n\t}, [persistToLocalStorage]);\n\n\t// Derived effective mode (resolves \"system\" to real-time systemMode)\n\tconst effectiveMode = mode === \"system\" ? systemMode : mode;\n\n\tuseEffect(() => {\n\t\tif (!isHydrated) return;\n\n\t\tapplyTheme(sourceColor, effectiveMode, document.documentElement, {\n\t\t\tvariant,\n\t\t\tcontrastLevel,\n\t\t});\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}, [\n\t\tsourceColor,\n\t\tmode,\n\t\teffectiveMode,\n\t\tpersistToLocalStorage,\n\t\tisHydrated,\n\t\tvariant,\n\t\tcontrastLevel,\n\t]);\n\n\tconst themeValue = useMemo<ThemeContextValue>(\n\t\t() => ({\n\t\t\tsourceColor,\n\t\t\tsetSourceColor,\n\t\t\tmode,\n\t\t\tsetMode,\n\t\t\teffectiveMode,\n\t\t\tvariant,\n\t\t\tcontrastLevel,\n\t\t}),\n\t\t[sourceColor, mode, effectiveMode, variant, contrastLevel],\n\t);\n\n\t// ── Typography value ─────────────────────────────────────────────────────\n\tconst typographyValue = useMemo<Typography>(() => {\n\t\tif (typographyProp) return typographyProp;\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}, [typographyProp, fontFamily, fontVariationAxes]);\n\n\t// ── Snackbar — mounted as isolated subtree so hook only allocates when needed\n\n\treturn (\n\t\t<LazyMotion features={domMax}>\n\t\t\t<ThemeContext.Provider value={themeValue}>\n\t\t\t\t<TypographyContext.Provider value={typographyValue}>\n\t\t\t\t\t{enableSnackbar ? (\n\t\t\t\t\t\t<SnackbarMountedProvider>{children}</SnackbarMountedProvider>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tchildren\n\t\t\t\t\t)}\n\t\t\t\t</TypographyContext.Provider>\n\t\t\t</ThemeContext.Provider>\n\t\t</LazyMotion>\n\t);\n}\n\n// ─── SnackbarMountedProvider ──────────────────────────────────────────────────\n\n/**\n * Internal helper component — renders only when `enableSnackbar={true}`.\n * Isolates `useSnackbarState` so the hook is never allocated unnecessarily.\n */\nfunction SnackbarMountedProvider({ children }: { children: ReactNode }) {\n\tconst state = useSnackbarState();\n\tconst contextValue = useMemo(\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\n// ─── Hooks ────────────────────────────────────────────────────────────────────\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<\n\tThemeContextValue,\n\t\"mode\" | \"setMode\" | \"effectiveMode\"\n> {\n\tconst { mode, setMode, effectiveMode } = useTheme();\n\treturn { mode, setMode, effectiveMode };\n}\n"]}
|