@bug-on/m3-expressive 1.2.2 → 1.2.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/shared/motion-tokens.ts","../src/ui/app-bar/app-bar.tokens.ts","../src/lib/utils.ts","../src/ui/app-bar/app-bar-item-button.tsx","../src/ui/menu/menu-animations.ts","../src/ui/menu/menu-context.tsx","../src/ui/menu/menu-tokens.ts","../src/ui/menu/context-menu.tsx","../src/ui/menu/menu.tsx","../src/ui/menu/menu-divider.tsx","../src/ui/menu/menu-group.tsx","../src/ui/shared/constants.ts","../src/ui/icon.tsx","../src/ui/menu/menu-item.tsx","../src/ui/menu/sub-menu.tsx","../src/ui/menu/vertical-menu.tsx","../src/ui/app-bar/app-bar-overflow-indicator.tsx","../src/ui/app-bar/app-bar-column.tsx","../src/ui/app-bar/app-bar-row.tsx","../src/ui/app-bar/hooks/use-app-bar-scroll.ts","../src/ui/app-bar/bottom-app-bar.tsx","../src/ui/app-bar/docked-toolbar.tsx","../src/ui/app-bar/hooks/use-flexible-app-bar.ts","../src/ui/app-bar/large-flexible-app-bar.tsx","../src/ui/app-bar/medium-flexible-app-bar.tsx","../src/ui/app-bar/search-app-bar.tsx","../src/ui/app-bar/search-view.tsx","../src/ui/app-bar/small-app-bar.tsx","../src/ui/ripple.tsx","../src/ui/shared/touch-target.tsx","../src/ui/navigation-bar.tsx","../src/ui/navigation-rail.tsx","../src/ui/search/hooks/use-search-keyboard.ts","../src/ui/search/search.tokens.ts","../src/ui/search/animated-placeholder.tsx","../src/ui/search/search-bar.tsx","../src/ui/search/search-context.tsx","../src/hooks/useClickOutside.ts","../src/ui/search/hooks/use-search-view-focus.ts","../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/buttons/icon-button/icon-button.tsx","../src/ui/search/trailing-action.tsx","../src/ui/search/search-view-docked.tsx","../src/ui/search/search-view-fullscreen.tsx","../src/ui/search/search.tsx","../src/ui/badge.tsx","../src/ui/tabs/tabs.tsx","../src/ui/tabs/tabs.tokens.ts","../src/ui/tabs/tab.tsx","../src/ui/tabs/tabs-content.tsx","../src/ui/tabs/tabs-list.tsx","../src/ui/toolbar/toolbar-colors.ts","../src/ui/toolbar/toolbar-context.tsx","../src/ui/toolbar/docked-toolbar.tsx","../src/ui/toolbar/toolbar-tokens.ts","../src/ui/toolbar/floating-toolbar.tsx","../src/ui/toolbar/floating-toolbar-with-fab.tsx","../src/ui/toolbar/toolbar-divider.tsx","../src/ui/toolbar/toolbar-icon-button.tsx","../src/ui/toolbar/toolbar-scroll-behavior.ts","../src/ui/toolbar/toolbar-toggle-button.tsx"],"names":["React","jsx","React2","_a","React3","AnimatePresence","m","React4","DropdownMenu2","React5","children","itemPosition","React6","React7","ContextMenu2","DropdownMenu3","jsxs","React8","Sub","ContextMenu3","DropdownMenu4","SubTrigger","SubContent","Portal","React9","Fragment","React10","React11","React12","useReducedMotion","React13","React14","React15","React16","RippleItem","React17","LazyMotion","domMax","React18","cva","cloneIconWithFill","ActivePill","HoverStateLayer","RippleLayer","IconContainer","React19","React20","React21","React22","useRef","useEffect","React23","React24","IndeterminateSvg","DeterminateSvg","React25","React26","React27","FlatLinearTrack","React28","WavyLinearTrack","useMotionValue","React29","React30","React31","_b","Slot","React32","ArrowBackIcon","React33","createPortal","React34","React35","React37","React38","React39","React40","React41","React42","React43","React44","useState","useScroll","useMotionValueEvent","React45"],"mappings":"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","file":"navigation.mjs","sourcesContent":["/**\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 app-bar.tokens.ts\n * MD3 Expressive App Bar — Design tokens ported from:\n * - AppBarTokens.kt (shared tokens)\n * - AppBarSmallTokens.kt\n * - AppBarMediumFlexibleTokens.kt\n * - AppBarLargeFlexibleTokens.kt\n * - BottomAppBarTokens.kt\n * - DockedToolbarTokens.kt\n * - FabSecondaryContainerTokens.kt\n *\n * All dimensional values are in px (dp equivalents for web at 1dp = 1px).\n * Colors reference CSS custom properties — do NOT hardcode hex.\n * @see docs/m3/app-bars/\n */\n\nimport { DEFAULT_SPATIAL_SPRING } from \"../shared/motion-tokens\";\n\n// ─── Dimensional Tokens ───────────────────────────────────────────────────────\n\n/**\n * Height and spacing tokens for all App Bar variants.\n * Maps directly from MD3 Kotlin token files.\n */\nexport const AppBarTokens = {\n\t// ── Heights ─────────────────────────────────────────────────────────────\n\theights: {\n\t\t/** SmallAppBar height. AppBarSmallTokens.ContainerHeight = 64dp */\n\t\tsmall: 64,\n\t\t/** Collapsed height for flexible variants. = SmallAppBar height. */\n\t\tflexibleCollapsed: 64,\n\t\t/** MediumFlexibleAppBar expanded height (without subtitle). AppBarMediumFlexibleTokens */\n\t\tmediumFlexExpanded: 112,\n\t\t/** MediumFlexibleAppBar expanded height (with subtitle). */\n\t\tmediumFlexWithSubtitleExpanded: 136,\n\t\t/** LargeFlexibleAppBar expanded height (without subtitle). AppBarLargeFlexibleTokens */\n\t\tlargeFlexExpanded: 120,\n\t\t/** LargeFlexibleAppBar expanded height (with subtitle). */\n\t\tlargeFlexWithSubtitleExpanded: 152,\n\t\t/** BottomAppBar height. BottomAppBarTokens.ContainerHeight = 80dp */\n\t\tbottom: 80,\n\t\t/** DockedToolbar height. DockedToolbarTokens.ContainerHeight = 64dp */\n\t\tdockedToolbar: 64,\n\t},\n\n\t// ── Icon and Avatar sizes ──────────────────────────────────────────────\n\t/** AppBarTokens.IconSize = 24dp */\n\ticonSize: 24,\n\t/** AppBarTokens.AvatarSize = 32dp */\n\tavatarSize: 32,\n\n\t// ── Spacing ──────────────────────────────────────────────────────────────\n\t/** AppBarTokens.LeadingSpace = 4dp */\n\tleadingSpace: 4,\n\t/** AppBarTokens.TrailingSpace = 4dp */\n\ttrailingSpace: 4,\n\t/** AppBarTokens.IconButtonSpace = 0dp (no gap between icon buttons) */\n\ticonButtonSpace: 0,\n\n\t// ── Docked Toolbar spacing ────────────────────────────────────────────\n\tdockedToolbar: {\n\t\t/** DockedToolbarTokens.ContainerLeadingSpace = 16dp */\n\t\tleadingSpace: 16,\n\t\t/** DockedToolbarTokens.ContainerTrailingSpace = 16dp */\n\t\ttrailingSpace: 16,\n\t\t/** DockedToolbarTokens.ContainerMinSpacing = 4dp */\n\t\tminSpacing: 4,\n\t\t/** DockedToolbarTokens.ContainerMaxSpacing = 32dp */\n\t\tmaxSpacing: 32,\n\t},\n\n\t// ── Touch targets ─────────────────────────────────────────────────────\n\t/** Minimum 48px touch target for icon buttons per MD3 accessibility spec. */\n\ticonButtonTouchTarget: 48,\n} as const;\n\n// ─── Typography Tokens ────────────────────────────────────────────────────────\n\n/**\n * MD3 type scale values mapped to Tailwind CSS class strings.\n * Used across App Bar variants for consistent typography.\n *\n * Values derived from MD3 Material Type Scale specification.\n */\nexport const appBarTypography = {\n\t/**\n\t * SmallAppBar title (collapsed state for flexible variants).\n\t * AppBarSmallTokens.TitleFont = TitleLarge\n\t * Spec: 22sp / 28sp line-height / medium weight\n\t */\n\ttitleLarge: \"text-[22px] leading-[28px] font-medium tracking-[0px]\",\n\n\t/**\n\t * SmallAppBar subtitle.\n\t * AppBarSmallTokens.SubtitleFont = LabelMedium\n\t * Spec: 12sp / 16sp line-height / medium weight / 0.5px tracking\n\t */\n\tlabelMedium: \"text-[12px] leading-[16px] font-medium tracking-[0.5px]\",\n\n\t/**\n\t * MediumFlexibleAppBar expanded title.\n\t * AppBarMediumFlexibleTokens.TitleFont = HeadlineMedium\n\t * Spec: 28sp / 36sp line-height / normal weight\n\t */\n\theadlineMedium: \"text-[28px] leading-[36px] font-normal tracking-[0px]\",\n\n\t/**\n\t * MediumFlexibleAppBar subtitle.\n\t * AppBarMediumFlexibleTokens.SubtitleFont = LabelLarge\n\t * Spec: 14sp / 20sp line-height / medium weight / 0.1px tracking\n\t */\n\tlabelLarge: \"text-[14px] leading-[20px] font-medium tracking-[0.1px]\",\n\n\t/**\n\t * LargeFlexibleAppBar expanded title.\n\t * AppBarLargeFlexibleTokens.TitleFont = DisplaySmall\n\t * Spec: 36sp / 44sp line-height / normal weight / -0.25px tracking\n\t */\n\tdisplaySmall: \"text-[36px] leading-[44px] font-normal tracking-[-0.25px]\",\n\n\t/**\n\t * LargeFlexibleAppBar subtitle.\n\t * AppBarLargeFlexibleTokens.SubtitleFont = TitleMedium\n\t * Spec: 16sp / 24sp line-height / medium weight / 0.15px tracking\n\t */\n\ttitleMedium: \"text-[16px] leading-6 font-medium tracking-[0.15px]\",\n} as const;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/**\n * CSS custom property references for App Bar colors.\n * Maps to --md-sys-color-* tokens in the MD3 theme system.\n *\n * IMPORTANT: Never hardcode hex/rgba values here — these references\n * automatically adapt to light/dark theme via the MD3ThemeProvider.\n *\n * AppBarTokens.kt spec:\n * - ContainerColor → md-sys-color-surface\n * - OnScrollContainerColor → md-sys-color-surface-container\n */\nexport const APP_BAR_COLORS = {\n\t// ── Container ────────────────────────────────────────────────────────────\n\t/** Default background. AppBarTokens.ContainerColor → surface */\n\tcontainer: \"var(--md-sys-color-surface)\",\n\t/** Background when content is scrolled. AppBarTokens.OnScrollContainerColor → surface-container */\n\tscrolledContainer: \"var(--md-sys-color-surface-container)\",\n\n\t// ── Content ──────────────────────────────────────────────────────────────\n\t/** Title color. AppBarTokens.TitleColor → on-surface */\n\ttitle: \"var(--md-sys-color-on-surface)\",\n\t/** Subtitle color. AppBarTokens.SubtitleColor → on-surface-variant */\n\tsubtitle: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Navigation icon color. AppBarTokens.LeadingIconColor → on-surface */\n\tnavigationIcon: \"var(--md-sys-color-on-surface)\",\n\t/** Action icon color. AppBarTokens.TrailingIconColor → on-surface-variant */\n\tactionIcon: \"var(--md-sys-color-on-surface-variant)\",\n\n\t// ── Search Bar ───────────────────────────────────────────────────────────\n\t/** Search bar pill background. → surface-container-high */\n\tsearchBarBg: \"var(--md-sys-color-surface-container-high)\",\n\t/** Search bar text/icon color. */\n\tsearchBarContent: \"var(--md-sys-color-on-surface-variant)\",\n\n\t// ── Bottom App Bar ───────────────────────────────────────────────────────\n\t/** BottomAppBarTokens.ContainerColor → surface-container */\n\tbottomContainer: \"var(--md-sys-color-surface-container)\",\n\n\t// ── FAB on Bottom App Bar ────────────────────────────────────────────────\n\t/** FabSecondaryContainerTokens.ContainerColor → secondary-container */\n\tfabContainer: \"var(--md-sys-color-secondary-container)\",\n\t/** FabSecondaryContainerTokens.IconColor → on-secondary-container */\n\tfabIcon: \"var(--md-sys-color-on-secondary-container)\",\n} as const;\n\n// ─── Animation Constants ──────────────────────────────────────────────────────\n\n/**\n * Color transition when App Bar background changes on scroll.\n * MD3 Standard easing: cubic-bezier(0.2, 0, 0, 1), 200ms.\n */\nexport const APP_BAR_COLOR_TRANSITION = {\n\tduration: 0.2,\n\tease: [0.2, 0, 0, 1] as [number, number, number, number],\n} as const;\n\n/**\n * Spring animation for enterAlways behavior (hide/show on scroll direction).\n * Equivalent to MD3 FastSpatial motion scheme.\n */\nexport const APP_BAR_ENTER_ALWAYS_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const APP_BAR_BOTTOM_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const SEARCH_VIEW_SPRING = DEFAULT_SPATIAL_SPRING;\n\n/**\n * Title crossfade transition for flexible App Bars.\n * Short duration keeps the collapse feeling snappy.\n */\nexport const APP_BAR_TITLE_FADE = {\n\tduration: 0.15,\n\tease: \"easeInOut\",\n} as const;\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 app-bar-item-button.tsx\n * Shared icon button renderer for AppBarRow and AppBarColumn items.\n *\n * Extracted from duplicate RowItem/ColumnItem implementations.\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { APP_BAR_COLORS, AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarItem } from \"./app-bar.types\";\n\ninterface AppBarItemButtonProps {\n\titem: AppBarItem;\n}\n\n/**\n * Renders a single App Bar action item as an icon button.\n * Handles clickable, toggleable, and custom item types.\n */\nexport function AppBarItemButton({ item }: AppBarItemButtonProps) {\n\tconst isDisabled = item.enabled === false;\n\n\tif (item.type === \"custom\" && item.appBarContent) {\n\t\treturn <>{item.appBarContent}</>;\n\t}\n\n\tconst buttonClassName = cn(\n\t\t\"flex items-center justify-center rounded-full\",\n\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\tisDisabled && \"opacity-38 pointer-events-none\",\n\t);\n\n\tconst buttonStyle = {\n\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t};\n\n\tif (item.type === \"toggleable\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={buttonClassName}\n\t\t\t\tstyle={{\n\t\t\t\t\t...buttonStyle,\n\t\t\t\t\tcolor: item.checked\n\t\t\t\t\t\t? APP_BAR_COLORS.navigationIcon\n\t\t\t\t\t\t: APP_BAR_COLORS.actionIcon,\n\t\t\t\t}}\n\t\t\t\taria-label={item.label}\n\t\t\t\taria-pressed={item.checked}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tonClick={() => item.onCheckedChange?.(!item.checked)}\n\t\t\t>\n\t\t\t\t{item.icon}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={buttonClassName}\n\t\t\tstyle={{ ...buttonStyle, color: APP_BAR_COLORS.actionIcon }}\n\t\t\taria-label={item.label}\n\t\t\tdisabled={isDisabled}\n\t\t\tonClick={item.onClick}\n\t\t>\n\t\t\t{item.icon}\n\t\t</button>\n\t);\n}\n","// ─── MD3 Expressive Menu — Framer Motion Animation Variants ──────────────────\n// FastSpatial: md.sys.motion.spring.fast.spatial\n// MD3: stiffness=800, dampingRatio=0.6 → Framer damping ≈ 33.94\n// FastEffects: md.sys.motion.spring.fast.effects (CSS fallback used for exit)\n// MD3: duration=150ms, cubic-bezier(0.31, 0.94, 0.34, 1.00)\n\nimport type { Variants } from \"motion/react\";\nimport {\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n} from \"../shared/motion-tokens\";\n\nexport { FAST_EFFECTS_SPRING, FAST_SPATIAL_SPRING };\n\n/** FastEffects CSS-fallback transition — used for opacity/exit animations */\nexport const FAST_EFFECTS_TRANSITION = {\n\tduration: 0.15,\n\tease: [0.31, 0.94, 0.34, 1.0] as [number, number, number, number],\n} as const;\n\n// ─── Menu popup container ─────────────────────────────────────────────────────\n\n/**\n * Enter/exit animation for the menu popup container.\n * Scale from 0.8→1.0 with FastSpatial spring.\n * Transform-origin is driven by the Radix CSS variable\n * `--radix-dropdown-menu-content-transform-origin`.\n */\nexport const MENU_CONTAINER_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\tscale: 0.8,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.8,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n\n// ─── Selected check icon ──────────────────────────────────────────────────────\n\n/** Size of the check icon in px (20dp per SegmentedMenuTokens.ItemLeadingIconSize) */\nexport const MENU_CHECK_ICON_SIZE = 20;\n\n/**\n * Expand/collapse animation for the check icon that appears when a MenuItem is\n * selected. Uses horizontal expansion (width + marginInlineEnd) with FastSpatial.\n *\n * ONLY used for the animated check ↔ selectedIcon swap in selectable items.\n * Regular (static) leading icons should NOT use these variants.\n */\nexport const CHECK_ICON_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\twidth: 0,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\twidth: MENU_CHECK_ICON_SIZE,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\twidth: 0,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n\n// ─── SubMenu content ──────────────────────────────────────────────────────────\n\n/** SubMenu popup uses the same FastSpatial/FastEffects pattern as root menu */\nexport const SUBMENU_CONTAINER_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\tscale: 0.9,\n\t\tx: -4,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\tx: 0,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.9,\n\t\tx: -4,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n","// ─── MD3 Expressive Menu — React Context ──────────────────────────────────────\nimport * as React from \"react\";\nimport type {\n\tMenuColorVariant,\n\tMenuPrimitive,\n\tMenuVariant,\n} from \"./menu-types\";\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\ninterface MenuContextValue {\n\t/** Visual variant: baseline (M3 standard) or expressive (shape-morphing) */\n\tvariant: MenuVariant;\n\t/** Color variant inherited by all children unless overridden */\n\tcolorVariant: MenuColorVariant;\n\t/**\n\t * Which Radix primitive family drives this menu:\n\t * - \"dropdown\" → @radix-ui/react-dropdown-menu (button/field trigger)\n\t * - \"context\" → @radix-ui/react-context-menu (right-click trigger)\n\t * - \"static\" → plain HTML via Slot (VerticalMenu, always-visible)\n\t */\n\tmenuPrimitive: MenuPrimitive;\n\t/**\n\t * Whether the menu popup is currently open.\n\t * Used by MenuContent to drive AnimatePresence for exit animations.\n\t */\n\topen: boolean;\n\t/** Setter forwarded from Menu root — kept in sync with Radix Root open state */\n\tonOpenChange: (open: boolean) => void;\n}\n\n// ─── Backward-compat derived getter ───────────────────────────────────────────\n// Components that still reference `isStatic` (MenuGroup, etc.) use this helper\n// during the incremental migration period.\nexport function isStaticPrimitive(primitive: MenuPrimitive): boolean {\n\treturn primitive === \"static\";\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst MenuContext = React.createContext<MenuContextValue>({\n\tvariant: \"baseline\",\n\tcolorVariant: \"standard\",\n\tmenuPrimitive: \"dropdown\",\n\topen: false,\n\tonOpenChange: () => {},\n});\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nexport interface MenuProviderProps {\n\tvariant?: MenuVariant;\n\tcolorVariant?: MenuColorVariant;\n\tmenuPrimitive?: MenuPrimitive;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: React.ReactNode;\n}\n\nexport function MenuProvider({\n\tvariant = \"baseline\",\n\tcolorVariant = \"standard\",\n\tmenuPrimitive = \"dropdown\",\n\topen,\n\tonOpenChange,\n\tchildren,\n}: MenuProviderProps) {\n\tconst value = React.useMemo<MenuContextValue>(\n\t\t() => ({ variant, colorVariant, menuPrimitive, open, onOpenChange }),\n\t\t[variant, colorVariant, menuPrimitive, open, onOpenChange],\n\t);\n\n\treturn <MenuContext.Provider value={value}>{children}</MenuContext.Provider>;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the nearest MenuContext value.\n * Safe to use outside a MenuProvider (returns default: baseline, dropdown, closed).\n *\n * Includes backward-compat shims:\n * - `menuVariant` → alias for `variant` (deprecated, will be removed)\n * - `isStatic` → `menuPrimitive === \"static\"`\n */\nexport function useMenuContext(): MenuContextValue & {\n\tisStatic: boolean;\n\tmenuVariant: MenuVariant;\n} {\n\tconst ctx = React.useContext(MenuContext);\n\treturn React.useMemo(\n\t\t() => ({\n\t\t\t...ctx,\n\t\t\tisStatic: ctx.menuPrimitive === \"static\",\n\t\t\tmenuVariant: ctx.variant,\n\t\t}),\n\t\t[ctx],\n\t);\n}\n","// ─── MD3 Expressive Menu — Design Token Constants ─────────────────────────────\n// Sourced from: SegmentedMenuTokens.kt, StandardMenuTokens.kt, VibrantMenuTokens.kt,\n// MenuTokens.kt, MenuDefaults.kt, ListTokens.kt\n\nimport { cornerRadius } from \"@bug-on/m3-tokens\";\n\n// ─── Spacing (px → dp) ────────────────────────────────────────────────────────\n\n/** Horizontal padding for menu items: 16dp (ItemLeadingSpace / ItemTrailingSpace) */\nexport const MENU_ITEM_HORIZONTAL_PADDING = \"px-4\"; // 16dp\n\n/** Horizontal padding for baseline menu items: 12dp */\nexport const MENU_BASELINE_ITEM_HORIZONTAL_PADDING = \"px-3\"; // 12dp\n\n/** Min height for selectable items: 44dp (SegmentedMenuTokens.Item) */\nexport const MENU_ITEM_MIN_HEIGHT = \"min-h-11\"; // 44dp = 11 * 4px\n\n/** Min height for standard list items: 48dp (MenuListItemContainerHeight) */\nexport const MENU_LIST_ITEM_MIN_HEIGHT = \"min-h-12\"; // 48dp\n\n/** Min width of menu container: 112dp (DropdownMenuItemDefaultMinWidth) */\nexport const MENU_MIN_WIDTH = \"min-w-28\"; // 112dp\n\n/** Max width of menu container: 280dp (DropdownMenuItemDefaultMaxWidth) */\nexport const MENU_MAX_WIDTH = \"max-w-70\"; // 280dp\n\n/** Gap between MenuGroup segments: 2dp (SegmentedMenuTokens.SegmentedGap) */\nexport const MENU_GROUP_GAP = \"gap-0.5\"; // 2dp\n\n/** Internal group vertical padding: 4dp (DropdownMenuGroupVerticalPadding) */\nexport const MENU_GROUP_PADDING_Y = \"py-1\"; // 4dp\n\n/** Popup container vertical padding: 8dp (DropdownMenuVerticalPadding) */\nexport const MENU_POPUP_PADDING_Y = \"py-2\"; // 8dp\n\n/** Leading icon size: 20dp (SegmentedMenuTokens.ItemLeadingIconSize) */\nexport const MENU_ICON_SIZE = 20;\n\n// ─── Container Shape ──────────────────────────────────────────────────────────\n\n/**\n * Menu popup container shape: CornerExtraSmall = 4px.\n * Source: MenuTokens.ContainerShape = ShapeKeyTokens.CornerExtraSmall\n */\nexport const MENU_CONTAINER_SHAPE = \"rounded-[4px]\"; // CornerExtraSmall\n\n/**\n * Shape for Baseline menu item (no shape morphing, edge-to-edge state layer).\n */\nexport const BASELINE_ITEM_SHAPE = \"rounded-none\";\n\n// ─── Shape: CSS border-radius values (used with motion/react `animate`) ────────\n// These are used for animated shape morphing via Framer Motion's `borderRadius`\n// property — NOT as Tailwind classes (Tailwind cannot animate between values).\n\n/**\n * Shape values for MenuGroup container (borderRadius CSS shorthand string).\n * Format: \"topLeft topRight bottomRight bottomLeft\"\n *\n * Source: MenuDefaults.kt groupShape() + SegmentedMenuTokens/ShapeTokens\n * - ContainerShape (standalone) = CornerLarge (16px) all corners\n * - InactiveContainerShape = CornerSmall (8px) all corners\n * - Leading group: topStart=CornerLarge, topEnd=CornerLarge, bottomStart=CornerSmall, bottomEnd=CornerSmall\n * - Middle group: GroupShape = CornerSmall (8px)\n * - Trailing group: topStart=CornerSmall, topEnd=CornerSmall, bottomStart=CornerLarge, bottomEnd=CornerLarge\n */\nexport const GROUP_SHAPES = {\n\t/** Active standalone group shape: CornerLarge all corners (16px) */\n\tstandaloneActive: `${cornerRadius.large}px`,\n\t/**\n\t * Active leading group shape: top=CornerLarge(16px), bottom=CornerSmall(8px)\n\t * Source: SegmentedMenuTokens — LeadingContainerShape:\n\t * topStart=CornerLarge, topEnd=CornerLarge, bottomStart=CornerSmall, bottomEnd=CornerSmall\n\t */\n\tleadingActive: `${cornerRadius.large}px ${cornerRadius.large}px ${cornerRadius.small}px ${cornerRadius.small}px`,\n\t/** Active middle group shape: CornerExtraSmall all corners (4px) */\n\tmiddleActive: `${cornerRadius.extraSmall}px`,\n\t/**\n\t * Active trailing group shape: top=CornerSmall(8px), bottom=CornerLarge(16px)\n\t * Source: SegmentedMenuTokens — TrailingContainerShape:\n\t * topStart=CornerSmall, topEnd=CornerSmall, bottomStart=CornerLarge, bottomEnd=CornerLarge\n\t */\n\ttrailingActive: `${cornerRadius.small}px ${cornerRadius.small}px ${cornerRadius.large}px ${cornerRadius.large}px`,\n\t/** Inactive (default, pre-hover) shape for all groups: CornerExtraSmall (4px) */\n\tinactive: `${cornerRadius.extraSmall}px`,\n} as const;\n\n/**\n * Shape values for MenuItem (borderRadius CSS shorthand string).\n * Used as Tailwind classes via arbitrary values for static rendering.\n * Animated shape (selected ↔ unselected) is handled via `transition-[border-radius]`.\n *\n * Source: MenuDefaults.kt itemShape() + SegmentedMenuTokens/ShapeTokens\n * - leading item: topStart/topEnd=CornerMedium(12px), bottomStart/bottomEnd=CornerExtraSmall(4px)\n * - middle item: CornerExtraSmall all (ItemShape = 4px)\n * - trailing item: topStart/topEnd=CornerExtraSmall(4px), bottomStart/bottomEnd=CornerMedium(12px)\n * - standalone item: same as middle (ItemShape = 4px)\n * - selected (all positions): CornerMedium all (ItemSelectedShape = 12px)\n */\nexport const ITEM_SHAPE_CLASSES = {\n\tleading: \"rounded-t-[12px] rounded-b-[4px]\",\n\tmiddle: \"rounded-[4px]\",\n\ttrailing: \"rounded-t-[4px] rounded-b-[12px]\",\n\tstandalone: \"rounded-[4px]\",\n\tselected: \"rounded-[12px]\",\n} as const;\n\n// ─── Color token Tailwind classes ─────────────────────────────────────────────\n\n/**\n * Standard color variant tokens (SurfaceContainerLow-based).\n * Source: StandardMenuTokens.kt\n *\n * Container: SurfaceContainerLow\n * Text: OnSurface\n * Icons: OnSurfaceVariant\n * Selected container: TertiaryContainer\n * Selected text/icons: OnTertiaryContainer\n */\nexport const STANDARD_COLORS = {\n\t/** Group/popup container background (StandardMenuTokens.ContainerColor) */\n\tcontainerBg: \"bg-m3-surface-container-low\",\n\t/** Label text color (StandardMenuTokens.ItemLabelTextColor) */\n\tlabelText: \"text-m3-on-surface\",\n\t/** Leading/trailing icon color (StandardMenuTokens.ItemLeadingIconColor) */\n\ticonColor: \"text-m3-on-surface-variant\",\n\t/** Supporting text below label (StandardMenuTokens.ItemSupportingTextColor) */\n\tsupportingTextColor: \"text-m3-on-surface-variant\",\n\t/** Trailing supporting text (StandardMenuTokens.ItemTrailingSupportingTextColor) */\n\ttrailingSupportingTextColor: \"text-m3-on-surface-variant\",\n\t/** Trailing icon color (StandardMenuTokens.ItemTrailingIconColor) */\n\ttrailingIconColor: \"text-m3-on-surface-variant\",\n\t/** Hover state layer (OnSurface @ 8% opacity) */\n\thoverLayer: \"hover:bg-m3-on-surface/8\",\n\t/** Focus state layer (OnSurface @ 12% opacity) */\n\tfocusLayer: \"focus:bg-m3-on-surface/12\",\n\t/** Selected item background (StandardMenuTokens.ItemSelectedContainerColor) */\n\tselectedBg: \"bg-m3-tertiary-container\",\n\t/** Selected item text (StandardMenuTokens.ItemSelectedLabelTextColor) */\n\tselectedText: \"text-m3-on-tertiary-container\",\n\t/** Selected item icon (StandardMenuTokens.ItemSelectedLeadingIconColor) */\n\tselectedIcon: \"text-m3-on-tertiary-container\",\n\t/** Disabled opacity: 38% (StandardMenuTokens.ItemDisabledLabelTextOpacity) */\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n/**\n * Baseline color variant tokens.\n * Container uses SurfaceContainer, Selected uses SecondaryContainer.\n */\nexport const BASELINE_COLORS = {\n\tcontainerBg: \"bg-m3-surface-container\",\n\tlabelText: \"text-m3-on-surface\",\n\ticonColor: \"text-m3-on-surface-variant\",\n\tsupportingTextColor: \"text-m3-on-surface-variant\",\n\ttrailingSupportingTextColor: \"text-m3-on-surface-variant\",\n\ttrailingIconColor: \"text-m3-on-surface-variant\",\n\thoverLayer: \"hover:bg-m3-on-surface/8\",\n\tfocusLayer: \"focus:bg-m3-on-surface/12\",\n\tselectedBg: \"bg-m3-secondary-container\",\n\tselectedText: \"text-m3-on-secondary-container\",\n\tselectedIcon: \"text-m3-on-secondary-container\",\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n/**\n * Vibrant color variant tokens (TertiaryContainer-based).\n * Source: VibrantMenuTokens.kt\n *\n * Container: TertiaryContainer\n * Text: OnTertiaryContainer\n * Icons: OnTertiaryContainer\n * Selected container: Tertiary\n * Selected text/icons: OnTertiary\n */\nexport const VIBRANT_COLORS = {\n\t/** Group/popup container background (VibrantMenuTokens.ContainerColor) */\n\tcontainerBg: \"bg-m3-tertiary-container\",\n\t/** Label text color (VibrantMenuTokens.ItemLabelTextColor) */\n\tlabelText: \"text-m3-on-tertiary-container\",\n\t/** Leading/trailing icon color (VibrantMenuTokens.ItemLeadingIconColor) */\n\ticonColor: \"text-m3-on-tertiary-container\",\n\t/** Supporting text below label (VibrantMenuTokens.ItemSupportingTextColor) */\n\tsupportingTextColor: \"text-m3-on-tertiary-container\",\n\t/** Trailing supporting text (VibrantMenuTokens.ItemTrailingSupportingTextColor) */\n\ttrailingSupportingTextColor: \"text-m3-on-tertiary-container\",\n\t/** Trailing icon color (VibrantMenuTokens.ItemTrailingIconColor) */\n\ttrailingIconColor: \"text-m3-on-tertiary-container\",\n\t/** Hover state layer (OnTertiaryContainer @ 8% opacity) */\n\thoverLayer: \"hover:bg-m3-on-tertiary-container/8\",\n\t/** Focus state layer (OnTertiaryContainer @ 12% opacity) */\n\tfocusLayer: \"focus:bg-m3-on-tertiary-container/12\",\n\t/** Selected item background (VibrantMenuTokens.ItemSelectedContainerColor = Tertiary) */\n\tselectedBg: \"bg-m3-tertiary\",\n\t/** Selected item text (VibrantMenuTokens.ItemSelectedLabelTextColor = OnTertiary) */\n\tselectedText: \"text-m3-on-tertiary\",\n\t/** Selected item icon (VibrantMenuTokens.ItemSelectedLeadingIconColor = OnTertiary) */\n\tselectedIcon: \"text-m3-on-tertiary\",\n\t/** Disabled opacity: 38% (VibrantMenuTokens.ItemDisabledLabelTextOpacity) */\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n// ─── Divider ──────────────────────────────────────────────────────────────────\n\n/**\n * HorizontalDivider padding: horizontal=12dp, vertical=2dp.\n * Source: MenuDefaults.HorizontalDividerPadding\n */\nexport const DIVIDER_PADDING = \"mx-3 my-0.5\"; // 12dp horizontal, 2dp vertical\nexport const DIVIDER_COLOR = \"bg-m3-outline-variant\";\n","// ─── MD3 Expressive Menu — ContextMenu (right-click / long-press) ─────────────\n// Wraps @radix-ui/react-context-menu and provides MenuContext with\n// menuPrimitive=\"context\" so MenuItem automatically selects ContextMenu primitives.\n//\n// Visual styling is identical to Menu — baseline or expressive variant.\n// Positioning, scroll lock, and outside click are all handled by Radix.\nimport * as RxContextMenu from \"@radix-ui/react-context-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./menu-animations\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tContextMenuContentProps,\n\tContextMenuProps,\n\tContextMenuTriggerProps,\n} from \"./menu-types\";\n\n// ─── ContextMenu (Root) ───────────────────────────────────────────────────────\n\n/**\n * Root of a context menu (right-click / long-press triggered popup).\n *\n * Wraps `@radix-ui/react-context-menu` Root and provides `MenuContext` with\n * `menuPrimitive=\"context\"` so nested `MenuItem` components automatically use\n * ContextMenu Radix primitives for correct accessibility and keyboard navigation.\n *\n * @example\n * // Baseline context menu\n * <ContextMenu variant=\"baseline\">\n * <ContextMenuTrigger asChild>\n * <div>Right-click me</div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <MenuItem>Copy</MenuItem>\n * <MenuItem>Paste</MenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * @example\n * // Expressive context menu with groups\n * <ContextMenu variant=\"expressive\">\n * <ContextMenuTrigger asChild><canvas /></ContextMenuTrigger>\n * <ContextMenuContent>\n * <MenuGroup>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * </MenuGroup>\n * <MenuGroup>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * </ContextMenuContent>\n * </ContextMenu>\n */\nexport function ContextMenu({\n\tchildren,\n\tvariant = \"baseline\",\n\tcolorVariant = \"standard\",\n}: ContextMenuProps) {\n\tconst [open, setOpen] = React.useState(false);\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant={variant}\n\t\t\tcolorVariant={colorVariant}\n\t\t\tmenuPrimitive=\"context\"\n\t\t\topen={open}\n\t\t\tonOpenChange={setOpen}\n\t\t>\n\t\t\t<RxContextMenu.Root onOpenChange={setOpen}>{children}</RxContextMenu.Root>\n\t\t</MenuProvider>\n\t);\n}\nContextMenu.displayName = \"ContextMenu\";\n\n// ─── ContextMenuTrigger ───────────────────────────────────────────────────────\n\n/**\n * The trigger area for a ContextMenu. Right-click (or long-press on touch)\n * within this area opens the context menu.\n *\n * Use `asChild` to apply trigger behavior to your own element without an\n * extra wrapper `<span>`.\n */\nexport const ContextMenuTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof RxContextMenu.Trigger>,\n\tContextMenuTriggerProps &\n\t\tReact.ComponentPropsWithoutRef<typeof RxContextMenu.Trigger>\n>(({ children, asChild = true, ...props }, ref) => (\n\t<RxContextMenu.Trigger ref={ref} asChild={asChild} {...props}>\n\t\t{children}\n\t</RxContextMenu.Trigger>\n));\nContextMenuTrigger.displayName = \"ContextMenuTrigger\";\n\n// ─── ContextMenuContent (popup panel) ─────────────────────────────────────────\n\n/**\n * The popup container for the context menu's contents.\n *\n * Renders into a portal via Radix. Uses Framer Motion `AnimatePresence` for\n * smooth enter/exit animations. Transform-origin is automatically set by\n * Radix via `--radix-context-menu-content-transform-origin`.\n *\n * Visual styling follows `variant` from `ContextMenuContext`:\n * - `baseline` → CornerExtraSmall (4px), standard M3 styling\n * - `expressive` → rounded-2xl, shape-morphing groups, elevation-2\n *\n * @param hasOverflow - Set true when using SubMenu to prevent clipping\n */\nexport const ContextMenuContent = React.forwardRef<\n\tReact.ComponentRef<typeof RxContextMenu.Content>,\n\tContextMenuContentProps &\n\t\tOmit<\n\t\t\tReact.ComponentPropsWithoutRef<typeof RxContextMenu.Content>,\n\t\t\t\"asChild\"\n\t\t>\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\thasOverflow = false,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\topen,\n\t\t\tvariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t\tconst colors =\n\t\t\tvariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isExpressiveGap =\n\t\t\tvariant === \"expressive\" && separatorStyle === \"gap\";\n\n\t\tconst containerClassName =\n\t\t\tvariant === \"expressive\"\n\t\t\t\t? cn(\n\t\t\t\t\t\t\"z-50 flex flex-col w-full\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tisExpressiveGap ? MENU_GROUP_GAP : \"\",\n\t\t\t\t\t\tisExpressiveGap ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"rounded-2xl\",\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"elevation-2\",\n\t\t\t\t\t\thasOverflow || isExpressiveGap\n\t\t\t\t\t\t\t? \"overflow-visible\"\n\t\t\t\t\t\t\t: \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)\n\t\t\t\t: cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\thasOverflow ? \"overflow-visible\" : \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t);\n\n\t\t// Helper to recursively flatten fragments\n\t\tconst flattenChildren = (nodes: React.ReactNode): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(nodes).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tlet renderedChildren: React.ReactNode = children;\n\n\t\tif (variant === \"expressive\") {\n\t\t\tconst validChildren = flattenChildren(children);\n\t\t\tconst groupCount = validChildren.length;\n\n\t\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\t\tReact.cloneElement(\n\t\t\t\t\tchild as React.ReactElement<{\n\t\t\t\t\t\tindex?: number;\n\t\t\t\t\t\tcount?: number;\n\t\t\t\t\t\tisGapVariant?: boolean;\n\t\t\t\t\t\tclassName?: string;\n\t\t\t\t\t}>,\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tcount: groupCount,\n\t\t\t\t\t\tisGapVariant: isExpressiveGap,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\trenderedChildren =\n\t\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"mx-3 my-0.5 h-px border-0 bg-m3-outline-variant\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, [])\n\t\t\t\t\t: enhancedChildren;\n\t\t}\n\n\t\treturn (\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<RxContextMenu.Portal forceMount>\n\t\t\t\t\t\t<RxContextMenu.Content ref={ref} asChild forceMount {...props}>\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.95, y: -4 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1, y: 0 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.95, y: -4 }}\n\t\t\t\t\t\t\t\ttransition={FAST_SPATIAL_SPRING}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(props.style as React.CSSProperties),\n\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\"var(--radix-context-menu-content-transform-origin)\",\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{renderedChildren}\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</RxContextMenu.Content>\n\t\t\t\t\t</RxContextMenu.Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\nContextMenuContent.displayName = \"ContextMenuContent\";\n","// ─── MD3 Expressive Menu — Root (Menu, MenuTrigger, MenuContent) ─────────────\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { MENU_CONTAINER_VARIANTS } from \"./menu-animations\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuContentProps,\n\tMenuGroupProps,\n\tMenuProps,\n\tMenuTriggerProps,\n} from \"./menu-types\";\n\n// ─── Menu (Root) ──────────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive Menu root component.\n *\n * Wraps Radix `DropdownMenu.Root` and provides `MenuContext` with `colorVariant`\n * and `open` state to all descendant MenuItem and MenuGroup components.\n *\n * @example\n * <Menu colorVariant=\"standard\">\n * <MenuTrigger asChild>\n * <IconButton name=\"more_vert\" />\n * </MenuTrigger>\n * <MenuContent>\n * <MenuGroup index={0} count={2}>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * </MenuGroup>\n * <MenuGroup index={1} count={2}>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * </MenuContent>\n * </Menu>\n */\nexport function Menu({\n\tchildren,\n\tvariant,\n\tmenuVariant,\n\tcolorVariant = \"standard\",\n\topen: controlledOpen,\n\tonOpenChange: controlledOnOpenChange,\n\tdefaultOpen,\n\t...props\n}: MenuProps &\n\tOmit<React.ComponentPropsWithoutRef<typeof DropdownMenu.Root>, \"children\">) {\n\t// Support deprecated menuVariant prop\n\tconst resolvedVariant = variant ?? menuVariant ?? \"baseline\";\n\n\t// Support both controlled and uncontrolled open state.\n\t// Initialize internalOpen from defaultOpen so that `defaultOpen={true}` works.\n\tconst [internalOpen, setInternalOpen] = React.useState(\n\t\t() => defaultOpen ?? false,\n\t);\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : internalOpen;\n\n\tconst handleOpenChange = React.useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) setInternalOpen(next);\n\t\t\tcontrolledOnOpenChange?.(next);\n\t\t},\n\t\t[isControlled, controlledOnOpenChange],\n\t);\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant={resolvedVariant}\n\t\t\tcolorVariant={colorVariant}\n\t\t\topen={open}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t>\n\t\t\t<DropdownMenu.Root\n\t\t\t\t{...props}\n\t\t\t\tdefaultOpen={defaultOpen}\n\t\t\t\topen={isControlled ? open : undefined}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DropdownMenu.Root>\n\t\t</MenuProvider>\n\t);\n}\nMenu.displayName = \"Menu\";\n\n// ─── MenuTrigger ──────────────────────────────────────────────────────────────\n\n/**\n * The trigger element that opens/closes the Menu.\n *\n * Use `asChild` to merge trigger behavior with your own element (e.g. a Button or IconButton).\n */\nexport const MenuTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof DropdownMenu.Trigger>,\n\tMenuTriggerProps & React.ComponentPropsWithoutRef<typeof DropdownMenu.Trigger>\n>(({ children, asChild = true, ...props }, ref) => (\n\t<DropdownMenu.Trigger ref={ref} asChild={asChild} {...props}>\n\t\t{children}\n\t</DropdownMenu.Trigger>\n));\nMenuTrigger.displayName = \"MenuTrigger\";\n\n// ─── MenuContent (popup panel) ────────────────────────────────────────────────\n\n/**\n * The popup container for the menu's contents.\n *\n * Renders into a portal. Uses Radix `forceMount` + Framer Motion `AnimatePresence`\n * so the exit animation (scale + opacity via FastEffects) plays before the portal\n * unmounts. The `open` state is read from `MenuContext`.\n *\n * Transform-origin is automatically set via the Radix CSS variable\n * `--radix-dropdown-menu-content-transform-origin`.\n *\n * @param hasOverflow - Set true when using SubMenu to prevent clipping\n */\nexport const MenuContent = React.forwardRef<\n\tReact.ComponentRef<typeof DropdownMenu.Content>,\n\tMenuContentProps &\n\t\tOmit<React.ComponentPropsWithoutRef<typeof DropdownMenu.Content>, \"asChild\">\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tsideOffset = 6,\n\t\t\tside = \"bottom\",\n\t\t\talign = \"start\",\n\t\t\thasOverflow = false,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\topen,\n\t\t\tvariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t\t// Baseline always uses baseline colors; expressive uses colorVariant\n\t\tconst colors =\n\t\t\tvariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isExpressiveGap =\n\t\t\tvariant === \"expressive\" && separatorStyle === \"gap\";\n\n\t\t// Expressive variant: large rounded container with elevation (unless gap variant)\n\t\t// Baseline variant: CornerExtraSmall (4px) container\n\t\tconst containerClassName =\n\t\t\tvariant === \"expressive\"\n\t\t\t\t? cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tisExpressiveGap ? MENU_GROUP_GAP : \"\",\n\t\t\t\t\t\tisExpressiveGap ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"rounded-2xl\",\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"elevation-2\",\n\t\t\t\t\t\thasOverflow || isExpressiveGap\n\t\t\t\t\t\t\t? \"overflow-visible\"\n\t\t\t\t\t\t\t: \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)\n\t\t\t\t: cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\thasOverflow ? \"overflow-visible\" : \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t);\n\n\t\t// Helper to recursively flatten fragments\n\t\tconst flattenChildren = (nodes: React.ReactNode): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(nodes).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tlet renderedChildren: React.ReactNode = children;\n\n\t\tif (variant === \"expressive\") {\n\t\t\tconst validChildren = flattenChildren(children);\n\t\t\tconst groupCount = validChildren.length;\n\n\t\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\t\tReact.cloneElement(child as React.ReactElement<MenuGroupProps>, {\n\t\t\t\t\tindex: i,\n\t\t\t\t\tcount: groupCount,\n\t\t\t\t\tisGapVariant: isExpressiveGap,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\trenderedChildren =\n\t\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"mx-3 my-0.5 h-px border-0 bg-m3-outline-variant\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, [])\n\t\t\t\t\t: enhancedChildren;\n\t\t}\n\n\t\treturn (\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<DropdownMenu.Portal forceMount>\n\t\t\t\t\t\t<DropdownMenu.Content\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t\t\t\tside={side}\n\t\t\t\t\t\t\talign={align}\n\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\tforceMount\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t\t\tvariants={MENU_CONTAINER_VARIANTS}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(props.style as React.CSSProperties),\n\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\"var(--radix-dropdown-menu-content-transform-origin)\",\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{renderedChildren}\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</DropdownMenu.Content>\n\t\t\t\t\t</DropdownMenu.Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\nMenuContent.displayName = \"MenuContent\";\n","// ─── MD3 Expressive Menu — MenuDivider ───────────────────────────────────────\n// Spec: HorizontalDividerPadding = PaddingValues(horizontal = 12.dp, vertical = 2.dp)\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMenuContext } from \"./menu-context\";\nimport type { MenuDividerProps } from \"./menu-types\";\n\n/**\n * A horizontal divider for use between MenuItems or MenuGroups.\n *\n * Uses traditional line-based separation (as opposed to the gap-based\n * separation in MenuGroup, which is the Expressive default).\n *\n * Spec: horizontal=12dp padding, vertical=2dp padding, `outline-variant` color.\n *\n * @example\n * <MenuContent>\n * <MenuItem>Cut</MenuItem>\n * <MenuDivider />\n * <MenuItem>Paste</MenuItem>\n * </MenuContent>\n */\nexport const MenuDivider = React.forwardRef<HTMLHRElement, MenuDividerProps>(\n\t({ className, ...props }, ref) => {\n\t\tconst { menuVariant } = useMenuContext();\n\n\t\treturn (\n\t\t\t<DropdownMenu.Separator asChild>\n\t\t\t\t<hr\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Baseline: 8dp vertical margin, 0 horizontal. Expressive: 12dp horizontal, 2dp vertical\n\t\t\t\t\t\tmenuVariant === \"baseline\" ? \"my-2 mx-0\" : \"mx-3 my-0.5\",\n\t\t\t\t\t\t// 1px height line\n\t\t\t\t\t\t\"h-px border-0\",\n\t\t\t\t\t\t// outline-variant color\n\t\t\t\t\t\t\"bg-m3-outline-variant\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</DropdownMenu.Separator>\n\t\t);\n\t},\n);\nMenuDivider.displayName = \"MenuDivider\";\n","// ─── MD3 Expressive Menu — MenuGroup ────────────────────────────────────────\n// Gap-based grouping with shape morphing on hover (core Expressive feature)\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./menu-animations\";\n\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tGROUP_SHAPES,\n\tMENU_GROUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuGroupPosition,\n\tMenuGroupProps,\n\tMenuItemPosition,\n\tMenuItemProps,\n} from \"./menu-types\";\n\n// Extend MenuGroupProps with data-* attributes for testing and aria- attributes\ntype MenuGroupDivProps = MenuGroupProps & {\n\t[key: `data-${string}`]: string | undefined;\n\tid?: string;\n\t\"aria-label\"?: string;\n\t\"aria-labelledby\"?: string;\n};\n\n// ─── Position helper ──────────────────────────────────────────────────────────\n\nfunction getGroupPosition(index: number, count: number): MenuGroupPosition {\n\tif (count === 1) return \"standalone\";\n\tif (index === 0) return \"leading\";\n\tif (index === count - 1) return \"trailing\";\n\treturn \"middle\";\n}\n\nfunction getGroupActiveShape(position: MenuGroupPosition): string {\n\treturn GROUP_SHAPES[\n\t\t`${position}Active` as keyof typeof GROUP_SHAPES\n\t] as string;\n}\n\n// ─── MenuGroup ────────────────────────────────────────────────────────────────\n\n/**\n * A container that groups MenuItem elements with gap-based visual separation —\n * the defining feature of MD3 Expressive menus.\n *\n * Shape morphing: on hover, the container's border-radius transitions from the\n * \"inactive\" small shape to the \"active\" large shape via a FastSpatial spring.\n * The shape depends on the group's position (leading/middle/trailing/standalone).\n *\n * MenuItem children automatically receive `itemPosition` props based on their\n * index within the group.\n *\n * @example\n * <MenuContent>\n * <MenuGroup>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * <MenuGroup>\n * <MenuItem>Select All</MenuItem>\n * </MenuGroup>\n * </MenuContent>\n */\nexport const MenuGroup = React.forwardRef<HTMLDivElement, MenuGroupDivProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tlabel,\n\t\t\tindex = 0,\n\t\t\tcount = 1,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tisGapVariant,\n\t\t\titemPosition,\n\t\t\tclassName,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tmenuVariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t\tisStatic,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst position = getGroupPosition(index, count);\n\t\tconst activeShape = getGroupActiveShape(position);\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst currentShape =\n\t\t\tisStatic || isHovered ? activeShape : GROUP_SHAPES.inactive;\n\n\t\tconst handlePointerEnter = React.useCallback(() => setIsHovered(true), []);\n\t\tconst handlePointerLeave = React.useCallback(() => setIsHovered(false), []);\n\n\t\t// Helper to recursively flatten fragments and collect valid elements.\n\t\t// This is necessary because cloneElement cannot be used on React.Fragment.\n\t\tconst flattenChildren = (\n\t\t\tchildren: React.ReactNode,\n\t\t): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(children).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tconst validChildren = flattenChildren(children);\n\t\tconst itemCount = validChildren.length;\n\n\t\tconst enhancedChildren = validChildren.map((child, i) => {\n\t\t\tconst itemPosition: MenuItemPosition =\n\t\t\t\titemCount === 1\n\t\t\t\t\t? \"standalone\"\n\t\t\t\t\t: i === 0\n\t\t\t\t\t\t? \"leading\"\n\t\t\t\t\t\t: i === itemCount - 1\n\t\t\t\t\t\t\t? \"trailing\"\n\t\t\t\t\t\t\t: \"middle\";\n\n\t\t\treturn React.cloneElement(child as React.ReactElement<MenuItemProps>, {\n\t\t\t\titemPosition,\n\t\t\t\tcolorVariant,\n\t\t\t});\n\t\t});\n\n\t\treturn (\n\t\t\t<m.div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label={label}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative\",\n\t\t\t\t\t// In baseline variant, MenuGroup is transparent so it shouldn't clip.\n\t\t\t\t\t// In expressive variant, it needs overflow-hidden to clip hover states to its morphing shape.\n\t\t\t\t\tmenuVariant === \"baseline\" ? \"\" : \"overflow-hidden\",\n\t\t\t\t\t// Vertical padding: 2dp for gap variant (to match Figma), 4dp for baseline\n\t\t\t\t\tisGapVariant ? \"py-0.5\" : MENU_GROUP_PADDING_Y,\n\t\t\t\t\t// Horizontal padding: 4dp for expressive menus (both static and popup), 0 for baseline\n\t\t\t\t\tmenuVariant === \"expressive\" ? \"px-1\" : \"\",\n\t\t\t\t\t// Gap variant has floating segments, so each group manages its own shadow\n\t\t\t\t\tisGapVariant ? \"elevation-2\" : \"\",\n\t\t\t\t\t// Background based on color variant (transparent for baseline to avoid double-layering)\n\t\t\t\t\tmenuVariant === \"baseline\" ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tanimate={{ borderRadius: currentShape }}\n\t\t\t\ttransition={FAST_SPATIAL_SPRING}\n\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{/* Optional group label: labelSmall typography, 12dp horizontal padding */}\n\t\t\t\t{label && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t// Padding: 12dp top, 12dp horizontal, 8dp bottom (MD3 spec)\n\t\t\t\t\t\t\t\"block pt-3 px-3 pb-2\",\n\t\t\t\t\t\t\t\"text-label-small\",\n\t\t\t\t\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t\t\t\t\t? \"text-m3-on-surface-variant\"\n\t\t\t\t\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t\t\t\t\t? \"text-m3-on-tertiary-container\"\n\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{enhancedChildren}\n\t\t\t</m.div>\n\t\t);\n\t},\n);\nMenuGroup.displayName = \"MenuGroup\";\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","// ─── MD3 Expressive Menu — MenuItem ─────────────────────────────────────────\n// Shape morphing + Standard/Vibrant color variants + selection state\n// Animation: only selectable items animate the leading icon slot\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../icon\";\nimport { CHECK_ICON_VARIANTS, MENU_CHECK_ICON_SIZE } from \"./menu-animations\";\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tBASELINE_ITEM_SHAPE,\n\tITEM_SHAPE_CLASSES,\n\tMENU_BASELINE_ITEM_HORIZONTAL_PADDING,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuItemPosition,\n\tMenuItemProps,\n\tMenuVariant,\n} from \"./menu-types\";\n\n// ─── Shape helper ─────────────────────────────────────────────────────────────\n\nfunction getItemShapeClass(\n\tposition: MenuItemPosition,\n\tselected: boolean,\n\tisStatic: boolean = false,\n\tmenuVariant: MenuVariant = \"expressive\",\n): string {\n\tif (menuVariant === \"baseline\") return BASELINE_ITEM_SHAPE;\n\tif (selected) return ITEM_SHAPE_CLASSES.selected;\n\t// Vertical Menu standalone items have 12px border radius\n\tif (isStatic && position === \"standalone\") return \"rounded-[12px]\";\n\treturn ITEM_SHAPE_CLASSES[position];\n}\n\n// ─── MenuItem ─────────────────────────────────────────────────────────────────\n\n/**\n * An interactive item within a Menu or MenuGroup.\n *\n * ### Shape morphing\n * `itemPosition` (auto-set by MenuGroup) controls border-radius. When `selected=true`,\n * shape overrides to `CornerMedium (12px)` with a CSS transition.\n *\n * ### Leading icon animation\n * - **Selectable items** (`selected` prop defined): `AnimatePresence` swaps between\n * a check icon and the user `leadingIcon` using FastSpatial expand + FastEffects fade.\n * - **Static items** (`selected` prop undefined): `leadingIcon` renders at fixed width\n * with no enter/exit animation (matches Android's static rendering).\n *\n * ### Selected state\n * Container color transitions with `transition-colors duration-150` (maps to\n * Android's `animateColorAsState` with `FastEffects` spec).\n */\nexport const MenuItem = React.forwardRef<HTMLDivElement, MenuItemProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tleadingIcon,\n\t\t\ttrailingIcon,\n\t\t\tsupportingText,\n\t\t\ttrailingText,\n\t\t\tselected,\n\t\t\tdisabled = false,\n\t\t\titemPosition = \"standalone\",\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tkeepOpen = false,\n\t\t\tclassName,\n\t\t\tisSubTrigger,\n\t\t\tvalue,\n\t\t\trole,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tmenuVariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t\tmenuPrimitive,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isStaticMenu = menuPrimitive === \"static\";\n\t\tconst shapeClass = getItemShapeClass(\n\t\t\titemPosition,\n\t\t\t!!selected,\n\t\t\tisStaticMenu,\n\t\t\tmenuVariant,\n\t\t);\n\n\t\t// A selectable item is one where `selected` prop is explicitly passed\n\t\t// (even if false). Non-selectable items do not animate the leading slot.\n\t\tconst isSelectable = selected !== undefined && !isSubTrigger;\n\n\t\t// Determine which Radix primitive to use based on selection state and role\n\t\tconst isCheckbox =\n\t\t\trole === \"menuitemcheckbox\" ||\n\t\t\t(selected !== undefined && !role && !isSubTrigger);\n\t\tconst isRadio = role === \"menuitemradio\";\n\n\t\t// Select the correct Radix primitive based on which menu family is active.\n\t\t// static → Slot (plain HTML, manages own ARIA)\n\t\t// context → @radix-ui/react-context-menu primitives\n\t\t// dropdown (default) → @radix-ui/react-dropdown-menu primitives\n\t\tconst ItemPrimitive =\n\t\t\tisStaticMenu || isSubTrigger\n\t\t\t\t? Slot\n\t\t\t\t: menuPrimitive === \"context\"\n\t\t\t\t\t? ((isCheckbox\n\t\t\t\t\t\t\t? ContextMenu.CheckboxItem\n\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t? ContextMenu.RadioItem\n\t\t\t\t\t\t\t\t: ContextMenu.Item) as React.ElementType)\n\t\t\t\t\t: ((isCheckbox\n\t\t\t\t\t\t\t? DropdownMenu.CheckboxItem\n\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t? DropdownMenu.RadioItem\n\t\t\t\t\t\t\t\t: DropdownMenu.Item) as React.ElementType);\n\n\t\treturn (\n\t\t\t<ItemPrimitive\n\t\t\t\tref={ref}\n\t\t\t\t{...(isStaticMenu || isSubTrigger\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t\trole ||\n\t\t\t\t\t\t\t\t(isCheckbox\n\t\t\t\t\t\t\t\t\t? \"menuitemcheckbox\"\n\t\t\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t\t\t? \"menuitemradio\"\n\t\t\t\t\t\t\t\t\t\t: \"menuitem\"),\n\t\t\t\t\t\t\t\"aria-checked\": isCheckbox || isRadio ? !!selected : undefined,\n\t\t\t\t\t\t\t\"aria-disabled\": disabled ? true : undefined,\n\t\t\t\t\t\t\ttabIndex: disabled ? -1 : 0,\n\t\t\t\t\t\t\tonKeyDown: (e: React.KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tonClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonClick,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t\tonSelect: keepOpen ? (e: Event) => e.preventDefault() : undefined,\n\t\t\t\t\t\t\tonClick,\n\t\t\t\t\t\t\t...(isCheckbox || isRadio ? { checked: !!selected } : {}),\n\t\t\t\t\t\t\t...(isRadio ? { value: value ?? \"\" } : {}),\n\t\t\t\t\t\t\tasChild: true,\n\t\t\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t// Role provided by Radix primitives via asChild, or manually set when static\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Layout\n\t\t\t\t\t\t\"relative flex w-full cursor-pointer select-none items-center outline-none\",\n\t\t\t\t\t\t// Sizing: min-h 48dp, min-w 112dp, max-w 280dp\n\t\t\t\t\t\t\"min-h-12 min-w-28 max-w-70\",\n\t\t\t\t\t\t// Horizontal padding\n\t\t\t\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t\t\t\t? MENU_BASELINE_ITEM_HORIZONTAL_PADDING\n\t\t\t\t\t\t\t: \"px-4\",\n\t\t\t\t\t\t// Spacing between items\n\t\t\t\t\t\tisStaticMenu ? \"my-0.5\" : \"\",\n\t\t\t\t\t\t// Shape morphing (position-based + selected override)\n\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\t// Animate border-radius AND background-color together (FastEffects: 150ms)\n\t\t\t\t\t\t\"transition-[border-radius,background-color] duration-150 ease-in\",\n\t\t\t\t\t\t// Colors based on variant + selection\n\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t? cn(colors.selectedBg, colors.selectedText)\n\t\t\t\t\t\t\t: cn(colors.labelText),\n\t\t\t\t\t\t// State layers (only on unselected items)\n\t\t\t\t\t\t!selected && colors.hoverLayer,\n\t\t\t\t\t\t!selected && colors.focusLayer,\n\t\t\t\t\t\t// Focus visible ring (WCAG 2.4.11 — visible focus indicator)\n\t\t\t\t\t\t// Uses ring-inset so the ring doesn't overflow the item bounds.\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t\t\t\t// Disabled\n\t\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...rest}\n\t\t\t\t>\n\t\t\t\t\t{/* ── Leading slot ── */}\n\t\t\t\t\t{(isSelectable || leadingIcon) && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex h-5 w-5 shrink-0 items-center justify-center mr-3\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelectable ? (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false} mode=\"wait\">\n\t\t\t\t\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\tkey=\"check\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tcolors.selectedIcon,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tvariants={CHECK_ICON_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"check\" fill={1} size={MENU_CHECK_ICON_SIZE} />\n\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t) : leadingIcon ? (\n\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tcolors.iconColor,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tvariants={CHECK_ICON_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{leadingIcon}\n\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t// Spacer for selectable items with no icon, to keep text aligned\n\t\t\t\t\t\t\t\t\t\t<div className=\"w-5\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t// Static icon for non-selectable items\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center\",\n\t\t\t\t\t\t\t\t\t\tcolors.iconColor,\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{leadingIcon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* ── Label + Supporting Text ── */}\n\t\t\t\t\t<span className=\"flex flex-1 flex-col\">\n\t\t\t\t\t\t<span className=\"text-body-large leading-snug\">{children}</span>\n\t\t\t\t\t\t{supportingText && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-body-medium leading-snug\",\n\t\t\t\t\t\t\t\t\t// Source: StandardMenuTokens.ItemSupportingTextColor / VibrantMenuTokens\n\t\t\t\t\t\t\t\t\tselected ? colors.selectedText : colors.supportingTextColor,\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{supportingText}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* ── Trailing: shortcut text OR trailing icon ── */}\n\t\t\t\t\t{(trailingText || trailingIcon) && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t// Minimum 12dp gap from label column (ListTokens)\n\t\t\t\t\t\t\t\t\"ml-3 flex shrink-0 items-center\",\n\t\t\t\t\t\t\t\t// Source: StandardMenuTokens.ItemTrailingIconColor / VibrantMenuTokens\n\t\t\t\t\t\t\t\tselected ? colors.selectedText : colors.trailingIconColor,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden={trailingIcon ? \"true\" : undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailingText ? (\n\t\t\t\t\t\t\t\t<span className=\"text-label-small tracking-wider\">\n\t\t\t\t\t\t\t\t\t{trailingText}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\ttrailingIcon\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</ItemPrimitive>\n\t\t);\n\t},\n);\nMenuItem.displayName = \"MenuItem\";\n","// ─── MD3 Expressive Menu — SubMenu ───────────────────────────────────────────\n// Nested sub-menu triggered by hover/keyboard on a MenuItem\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../icon\";\nimport { SUBMENU_CONTAINER_VARIANTS } from \"./menu-animations\";\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuColorVariant,\n\tMenuItemProps,\n\tSubMenuProps,\n} from \"./menu-types\";\n\n/**\n * A nested SubMenu that opens from a trigger MenuItem.\n *\n * Keyboard: ArrowRight opens, ArrowLeft/Escape closes (handled by Radix).\n * The parent MenuContent should set `hasOverflow={true}` when SubMenus are used.\n *\n * ### Hover delays\n * `hoverOpenDelay` (default: 200ms) — time before the submenu opens on hover.\n * `hoverCloseDelay` (default: 300ms) — time before the submenu closes after pointer-leave.\n * These delays allow the user to safely move diagonally from trigger to submenu content\n * without accidental close (safe polygon behavior from Radix still applies).\n *\n * @example\n * <MenuContent hasOverflow>\n * <SubMenu\n * trigger={\n * <MenuItem trailingIcon={<Icon name=\"chevron_right\" size={20} />}>\n * Share\n * </MenuItem>\n * }\n * >\n * <MenuItem>Via Email</MenuItem>\n * <MenuItem>Via Link</MenuItem>\n * </SubMenu>\n * </MenuContent>\n */\nexport function SubMenu({\n\tchildren,\n\ttrigger,\n\tside = \"right\",\n\tcolorVariant: propColorVariant,\n\thoverOpenDelay = 200,\n\thoverCloseDelay = 300,\n}: SubMenuProps) {\n\tconst { colorVariant: contextColorVariant, menuPrimitive } = useMenuContext();\n\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t// Controlled open state for hover delay support.\n\t// Note: We use Radix's controlled mode carefully — Radix still handles keyboard\n\t// and the safe polygon logic internally when we pass open/onOpenChange.\n\tconst [open, setOpen] = React.useState(false);\n\tconst openTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t);\n\n\tconst clearTimers = React.useCallback(() => {\n\t\tif (openTimerRef.current) clearTimeout(openTimerRef.current);\n\t\tif (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n\t}, []);\n\n\tconst handleTriggerPointerEnter = React.useCallback(() => {\n\t\tclearTimers();\n\t\topenTimerRef.current = setTimeout(() => setOpen(true), hoverOpenDelay);\n\t}, [hoverOpenDelay, clearTimers]);\n\n\tconst handleTriggerPointerLeave = React.useCallback(() => {\n\t\tclearTimers();\n\t\tcloseTimerRef.current = setTimeout(() => setOpen(false), hoverCloseDelay);\n\t}, [hoverCloseDelay, clearTimers]);\n\n\tconst handleContentPointerEnter = React.useCallback(() => {\n\t\t// Keep open when pointer moves into the submenu content\n\t\tclearTimers();\n\t}, [clearTimers]);\n\n\tconst handleContentPointerLeave = React.useCallback(() => {\n\t\tclearTimers();\n\t\tcloseTimerRef.current = setTimeout(() => setOpen(false), hoverCloseDelay);\n\t}, [hoverCloseDelay, clearTimers]);\n\n\t// Cleanup timers on unmount\n\tReact.useEffect(() => () => clearTimers(), [clearTimers]);\n\n\t// Select the correct Radix Sub primitives based on which menu family is active.\n\tconst Sub = menuPrimitive === \"context\" ? ContextMenu.Sub : DropdownMenu.Sub;\n\tconst SubTrigger =\n\t\tmenuPrimitive === \"context\"\n\t\t\t? ContextMenu.SubTrigger\n\t\t\t: DropdownMenu.SubTrigger;\n\tconst SubContent =\n\t\tmenuPrimitive === \"context\"\n\t\t\t? ContextMenu.SubContent\n\t\t\t: DropdownMenu.SubContent;\n\tconst Portal =\n\t\tmenuPrimitive === \"context\" ? ContextMenu.Portal : DropdownMenu.Portal;\n\n\treturn (\n\t\t<Sub open={open} onOpenChange={setOpen}>\n\t\t\t{/* SubTrigger renders its own element (no asChild) so it can correctly\n\t\t\t * compute the bounding box for SubContent positioning. */}\n\t\t\t<SubTrigger\n\t\t\t\tclassName=\"w-full outline-none\"\n\t\t\t\tonPointerEnter={handleTriggerPointerEnter}\n\t\t\t\tonPointerLeave={handleTriggerPointerLeave}\n\t\t\t>\n\t\t\t\t{React.isValidElement(trigger)\n\t\t\t\t\t? React.cloneElement(trigger as React.ReactElement<MenuItemProps>, {\n\t\t\t\t\t\t\tisSubTrigger: true,\n\t\t\t\t\t\t\t// Auto-add chevron if missing\n\t\t\t\t\t\t\ttrailingIcon: (trigger.props as MenuItemProps).trailingIcon || (\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_right\" size={20} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t})\n\t\t\t\t\t: trigger}\n\t\t\t</SubTrigger>\n\n\t\t\t{/* SubMenu popup */}\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<Portal forceMount>\n\t\t\t\t\t\t<SubContent\n\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\talignOffset={-4}\n\t\t\t\t\t\t\tforceMount\n\t\t\t\t\t\t\tclassName=\"outline-none\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SubMenuContent\n\t\t\t\t\t\t\t\tside={side}\n\t\t\t\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\t\t\t\tonPointerEnter={handleContentPointerEnter}\n\t\t\t\t\t\t\t\tonPointerLeave={handleContentPointerLeave}\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</SubMenuContent>\n\t\t\t\t\t\t</SubContent>\n\t\t\t\t\t</Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</Sub>\n\t);\n}\nSubMenu.displayName = \"SubMenu\";\n\n/**\n * Inner wrapper to handle animations.\n */\nfunction SubMenuContent({\n\tchildren,\n\tside,\n\tcolorVariant: propColorVariant,\n\tonPointerEnter,\n\tonPointerLeave,\n}: {\n\tchildren: React.ReactNode;\n\tside: \"left\" | \"right\";\n\tcolorVariant?: MenuColorVariant;\n\tonPointerEnter?: React.PointerEventHandler<HTMLDivElement>;\n\tonPointerLeave?: React.PointerEventHandler<HTMLDivElement>;\n}) {\n\tconst { menuVariant, colorVariant: contextColorVariant } = useMenuContext();\n\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\tconst colors =\n\t\tmenuVariant === \"baseline\"\n\t\t\t? BASELINE_COLORS\n\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t: STANDARD_COLORS;\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"menu\"\n\t\t\taria-orientation=\"vertical\"\n\t\t\tonPointerEnter={onPointerEnter}\n\t\t\tonPointerLeave={onPointerLeave}\n\t\t\tclassName={cn(\n\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t// Width constraints\n\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t// Vertical padding: 8dp\n\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t// Gap between groups: 2dp\n\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t// Container background\n\t\t\t\tcolors.containerBg,\n\t\t\t\t// Container shape: CornerExtraSmall (4px)\n\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t// Elevation-2 shadow\n\t\t\t\t\"elevation-2\",\n\t\t\t\t// Overflow clip\n\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\"outline-none\",\n\t\t\t)}\n\t\t\tvariants={SUBMENU_CONTAINER_VARIANTS}\n\t\t\tinitial=\"hidden\"\n\t\t\tanimate=\"visible\"\n\t\t\texit=\"exit\"\n\t\t\tstyle={{\n\t\t\t\ttransformOrigin: side === \"right\" ? \"top left\" : \"top right\",\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</m.div>\n\t);\n}\nSubMenuContent.displayName = \"SubMenuContent\";\n","// ─── MD3 Expressive Menu — Vertical Menu (always-visible static variant) ──────\n// Spec: SegmentedMenuTokens + MenuDefaults — two sub-variants:\n// • Gap → gap-0.5 (2dp) between groups, no divider line\n// • Divider → outline-variant <hr> between groups\n//\n// Key difference from Menu (baseline):\n// • No portal, no popup animation, no trigger\n// • Always rendered (static)\n// • Shape morphing on hover works identically (reuses MenuGroup)\n// • Still provides MenuContext with isStatic=true so MenuItems know to use Slot\n//\n// Vertical Menu Gap architecture:\n// • Outer container: NO overflow-hidden (would clip group shape morphing!)\n// Instead, elevation shadow is applied here, bg is transparent.\n// • Each MenuGroup manages its own background + border-radius via Framer Motion.\n// • The 2dp gap between groups is transparent — page background shows through.\n//\n// Vertical Menu Divider architecture:\n// • Outer container applies containerBg + overflow-hidden + rounded-2xl\n// (groups inside all stay flush, no shape morph needed for divider variant).\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport { MenuGroup } from \"./menu-group\";\nimport {\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuGroupProps,\n\tVerticalMenuContentProps,\n\tVerticalMenuDividerProps,\n\tVerticalMenuProps,\n\tVerticalMenuSeparatorStyle,\n} from \"./menu-types\";\n\n// ─── VerticalMenuDivider ──────────────────────────────────────────────────────\n\n/**\n * A plain horizontal divider for use between groups in a VerticalMenuContent\n * with `separatorStyle=\"divider\"`.\n *\n * Uses the same visual spec as MenuDivider (outline-variant color, 12dp\n * horizontal padding, 2dp vertical padding) but is a plain `<hr>` — no Radix\n * dependency, safe inside static (non-popup) contexts.\n *\n * @example\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuDivider />\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n */\nexport const VerticalMenuDivider = React.forwardRef<\n\tHTMLHRElement,\n\tVerticalMenuDividerProps & React.HTMLAttributes<HTMLHRElement>\n>(({ className, index, count, isGapVariant, ...props }, ref) => (\n\t<hr\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t// HorizontalDividerPadding: horizontal=12dp, vertical=2dp\n\t\t\t\"mx-3 my-0.5\",\n\t\t\t// 1px height, no default border\n\t\t\t\"h-px border-0\",\n\t\t\t// Source: MenuDefaults.HorizontalDividerPadding / outline-variant\n\t\t\t\"bg-m3-outline-variant\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nVerticalMenuDivider.displayName = \"VerticalMenuDivider\";\n\n// ─── VerticalMenuGroup ────────────────────────────────────────────────────────\n\n/**\n * A group within a VerticalMenu.\n *\n * Functionally identical to `MenuGroup` — shape morphing on hover, auto-injected\n * `itemPosition` into MenuItem children, `colorVariant` from context.\n *\n * This component is a named re-export of `MenuGroup` so consumers of Vertical\n * Menu have a semantically clear API without any code duplication.\n */\nexport const VerticalMenuGroup = MenuGroup;\n\n// ─── VerticalMenuContent ──────────────────────────────────────────────────────\n\n/**\n * Renders a vertical list of VerticalMenuGroup children.\n *\n * Handles two separation styles:\n * - `gap` → 2dp (`gap-0.5`) visual gap between groups (default)\n * - `divider` → auto-inserts a `VerticalMenuDivider` between each pair of groups\n *\n * Auto-injects `index` and `count` props into VerticalMenuGroup children so\n * that position-based shape morphing (leading/middle/trailing) works correctly.\n *\n * @example\n * // Gap variant (default)\n * <VerticalMenuContent separatorStyle=\"gap\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n *\n * @example\n * // Divider variant\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n */\nexport const VerticalMenuContent = React.forwardRef<\n\tHTMLDivElement,\n\tVerticalMenuContentProps & React.HTMLAttributes<HTMLDivElement>\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { colorVariant: contextColorVariant } = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tcolorVariant === \"vibrant\" ? VIBRANT_COLORS : STANDARD_COLORS;\n\n\t\t// Helper to recursively flatten fragments and collect valid elements.\n\t\t// This is necessary because cloneElement cannot be used on React.Fragment.\n\t\tconst flattenChildren = (\n\t\t\tchildren: React.ReactNode,\n\t\t): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(children).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\t// Collect only valid VerticalMenuGroup-like elements for index/count injection\n\t\tconst validChildren = flattenChildren(children);\n\t\tconst groupCount = validChildren.length;\n\n\t\t// Auto-inject `index` and `count` into each child (enables leading/middle/trailing shape)\n\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\tReact.cloneElement(child as React.ReactElement<MenuGroupProps>, {\n\t\t\t\tindex: i,\n\t\t\t\tcount: groupCount,\n\t\t\t\tisGapVariant: separatorStyle === \"gap\",\n\t\t\t}),\n\t\t);\n\n\t\t// For divider style: interleave VerticalMenuDivider between each group\n\t\tconst renderedChildren =\n\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t<VerticalMenuDivider\n\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}, [])\n\t\t\t\t: enhancedChildren;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col w-full\",\n\t\t\t\t\t// Gap variant: transparent background + 2dp gap — page bg shows through gaps.\n\t\t\t\t\t// Divider variant: solid container background behind all groups.\n\t\t\t\t\tseparatorStyle === \"gap\"\n\t\t\t\t\t\t? cn(\"bg-transparent\", MENU_GROUP_GAP)\n\t\t\t\t\t\t: colors.containerBg,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{renderedChildren}\n\t\t\t</div>\n\t\t);\n\t},\n);\nVerticalMenuContent.displayName = \"VerticalMenuContent\";\n\n// ─── VerticalMenu (Root) ──────────────────────────────────────────────────────\n\n/**\n * Root of an always-visible vertical menu.\n *\n * Wraps children in `MenuProvider` (always `open={true}`) so MenuItem and\n * MenuGroup components receive the correct `colorVariant` from context.\n *\n * Unlike the popup `Menu` component, there is no Radix DropdownMenu, no portal,\n * and no enter/exit animation — the list is statically rendered at all times.\n *\n * ### Shape morphing\n * For the **gap variant**, the outer container has NO `overflow-hidden` — this is\n * intentional! Each `VerticalMenuGroup` manages its own shape via Framer Motion's\n * `animate.borderRadius`. `overflow-hidden` on the parent would clip these\n * morphing corners. The 2dp transparent gap lets page background show through.\n *\n * For the **divider variant**, the outer container applies `overflow-hidden` +\n * `rounded-2xl` + background — groups sit flush inside without morphing.\n *\n * @example\n * // Vertical Menu with Gap (floating segments)\n * <VerticalMenu colorVariant=\"standard\">\n * <VerticalMenuContent separatorStyle=\"gap\">\n * <VerticalMenuGroup>\n * <MenuItem leadingIcon={<Icon name=\"visibility\" size={20} />}>Item 1</MenuItem>\n * <MenuItem leadingIcon={<Icon name=\"content_copy\" size={20} />} trailingText=\"⌘C\">Item 2</MenuItem>\n * <MenuItem selected leadingIcon={<Icon name=\"edit\" size={20} />}>Item 3</MenuItem>\n * </VerticalMenuGroup>\n * <VerticalMenuGroup>\n * <MenuItem trailingIcon={<Icon name=\"chevron_right\" size={20} />}>Item 4</MenuItem>\n * </VerticalMenuGroup>\n * </VerticalMenuContent>\n * </VerticalMenu>\n *\n * @example\n * // Vertical Menu with Divider\n * <VerticalMenu colorVariant=\"standard\">\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n * </VerticalMenu>\n */\nexport const VerticalMenu = React.forwardRef<\n\tHTMLDivElement,\n\tVerticalMenuProps & React.HTMLAttributes<HTMLDivElement>\n>(({ children, colorVariant = \"standard\", className, ...props }, ref) => {\n\t// Vertical menus are always visible — `open` is a permanent true.\n\t// onOpenChange is a no-op (no controlled/uncontrolled toggle needed).\n\tconst noop = React.useCallback(() => {}, []);\n\n\tconst colors = colorVariant === \"vibrant\" ? VIBRANT_COLORS : STANDARD_COLORS;\n\n\t// Internal ref for keyboard navigation — merged with forwarded ref.\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst mergedRef = React.useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\t(containerRef as React.MutableRefObject<HTMLDivElement | null>).current =\n\t\t\t\tnode;\n\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\telse if (ref)\n\t\t\t\t(ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n\t\t},\n\t\t[ref],\n\t);\n\n\t// Arrow key navigation: WAI-ARIA composite widget pattern.\n\t// Moves focus among menuitem elements, skipping disabled ones.\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (!containerRef.current) return;\n\t\t\tconst items = Array.from(\n\t\t\t\tcontainerRef.current.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'[role=\"menuitem\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"]),' +\n\t\t\t\t\t\t'[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"]),' +\n\t\t\t\t\t\t'[role=\"menuitemradio\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"])',\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (!items.length) return;\n\t\t\tconst idx = items.indexOf(document.activeElement as HTMLElement);\n\t\t\tlet next: number | null = null;\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = idx < items.length - 1 ? idx + 1 : 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = idx > 0 ? idx - 1 : items.length - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = items.length - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (next !== null) items[next]?.focus();\n\t\t},\n\t\t[],\n\t);\n\n\t// Detect separator style from VerticalMenuContent child to decide container styling.\n\tconst separatorStyle = detectSeparatorStyle(children);\n\tconst isGapVariant = separatorStyle !== \"divider\";\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant=\"expressive\"\n\t\t\tcolorVariant={colorVariant}\n\t\t\tmenuPrimitive=\"static\"\n\t\t\topen={true}\n\t\t\tonOpenChange={noop}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={mergedRef}\n\t\t\t\trole=\"menu\"\n\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Width constraints: 112dp min, 280dp max (MenuTokens)\n\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\tisGapVariant\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t// GAP VARIANT: NO overflow-hidden — groups must morph freely.\n\t\t\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\t\t\t// NO background — transparent between segments.\n\t\t\t\t\t\t\t\t// NO rounded corners — each group manages its own shape.\n\t\t\t\t\t\t\t\t// Elevation is managed by each individual group.\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t// DIVIDER VARIANT: Container clips the content.\n\t\t\t\t\t\t\t\t\"rounded-2xl\",\n\t\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</MenuProvider>\n\t);\n});\nVerticalMenu.displayName = \"VerticalMenu\";\n\n// ─── Helper ───────────────────────────────────────────────────────────────────\n\n/**\n * Inspects the `separatorStyle` prop from the first VerticalMenuContent child.\n * Used by VerticalMenu root to decide container styling.\n */\nfunction detectSeparatorStyle(\n\tchildren: React.ReactNode,\n): VerticalMenuSeparatorStyle {\n\tconst child = React.Children.toArray(children).find(React.isValidElement);\n\tif (child) {\n\t\tconst style = (\n\t\t\tchild.props as { separatorStyle?: VerticalMenuSeparatorStyle }\n\t\t).separatorStyle;\n\t\tif (style) return style;\n\t}\n\treturn \"gap\";\n}\n","/**\n * @file app-bar-overflow-indicator.tsx\n * MD3 Expressive App Bar Overflow Indicator.\n *\n * Renders a \"More\" (more_vert) icon button that opens a Radix UI\n * DropdownMenu containing overflow App Bar items.\n *\n * Used internally by <AppBarRow> and <AppBarColumn> when items exceed\n * the visible count.\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { Menu, MenuContent, MenuItem, MenuTrigger } from \"../menu\";\nimport { APP_BAR_COLORS, AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarItem, AppBarOverflowIndicatorProps } from \"./app-bar.types\";\n\n/** More vert icon for the overflow trigger button. */\nfunction MoreVertIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tmore_vert\n\t\t</span>\n\t);\n}\n\n/**\n * Renders a single overflow item in the dropdown based on its type.\n */\nfunction OverflowItem({ item }: { item: AppBarItem }) {\n\tif (item.type === \"toggleable\") {\n\t\treturn (\n\t\t\t<MenuItem\n\t\t\t\trole=\"menuitemcheckbox\"\n\t\t\t\tselected={item.checked ?? false}\n\t\t\t\tonClick={() => item.onCheckedChange?.(!item.checked)}\n\t\t\t\tdisabled={item.enabled === false}\n\t\t\t>\n\t\t\t\t{item.label}\n\t\t\t</MenuItem>\n\t\t);\n\t}\n\n\tif (item.type === \"custom\" && item.menuContent) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{item.menuContent({\n\t\t\t\t\tisOpen: true,\n\t\t\t\t\topen: () => {},\n\t\t\t\t\tclose: () => {},\n\t\t\t\t})}\n\t\t\t</>\n\t\t);\n\t}\n\n\t// Default: clickable\n\treturn (\n\t\t<MenuItem onClick={item.onClick} disabled={item.enabled === false}>\n\t\t\t{item.label}\n\t\t</MenuItem>\n\t);\n}\n\n/**\n * MD3 App Bar Overflow Indicator.\n *\n * Renders a \"more_vert\" button that opens a dropdown menu\n * with overflow action items.\n */\nexport function AppBarOverflowIndicator({\n\titems,\n\tclassName,\n}: AppBarOverflowIndicatorProps) {\n\tif (items.length === 0) return null;\n\n\treturn (\n\t\t<Menu>\n\t\t\t<MenuTrigger asChild>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center rounded-full\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\tcolor: APP_BAR_COLORS.actionIcon,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label=\"More actions\"\n\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t>\n\t\t\t\t\t<MoreVertIcon />\n\t\t\t\t</button>\n\t\t\t</MenuTrigger>\n\n\t\t\t<MenuContent align=\"end\" sideOffset={4}>\n\t\t\t\t{items.map((item, index) => (\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: static list from props\n\t\t\t\t\t<OverflowItem key={index} item={item} />\n\t\t\t\t))}\n\t\t\t</MenuContent>\n\t\t</Menu>\n\t);\n}\n","/**\n * @file app-bar-column.tsx\n * MD3 Expressive App Bar Column DSL.\n *\n * Displays App Bar action items in a vertical column.\n * Overflow items collapse into a dropdown menu.\n *\n * @see docs/m3/app-bars/AppBarColumn.kt\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarColumnProps } from \"./app-bar.types\";\nimport { AppBarItemButton } from \"./app-bar-item-button\";\nimport { AppBarOverflowIndicator } from \"./app-bar-overflow-indicator\";\n\n/**\n * MD3 Expressive App Bar Column.\n *\n * Renders action items in a vertical column. Commonly used in\n * side navigation or rail-style App Bars.\n *\n * @example\n * ```tsx\n * <AppBarColumn\n * maxItemCount={3}\n * items={[\n * { type: 'clickable', icon: <Icon>edit</Icon>, label: 'Edit', onClick: handleEdit },\n * { type: 'clickable', icon: <Icon>delete</Icon>, label: 'Delete', onClick: handleDelete },\n * ]}\n * />\n * ```\n */\nexport function AppBarColumn({\n\titems,\n\tmaxItemCount,\n\tclassName,\n}: AppBarColumnProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst [visibleCount, setVisibleCount] = React.useState(\n\t\tmaxItemCount ?? items.length,\n\t);\n\n\tReact.useEffect(() => {\n\t\tif (maxItemCount !== undefined) {\n\t\t\tsetVisibleCount(Math.min(maxItemCount, items.length));\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tlet debounceTimer: ReturnType<typeof setTimeout>;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(() => {\n\t\t\t\tconst entry = entries[0];\n\t\t\t\tif (!entry) return;\n\n\t\t\t\tconst available = entry.contentRect.height;\n\t\t\t\tconst itemHeight = AppBarTokens.iconButtonTouchTarget;\n\t\t\t\tconst hasOverflow = items.length > Math.floor(available / itemHeight);\n\t\t\t\tconst reservedHeight = hasOverflow ? itemHeight : 0;\n\t\t\t\tconst count = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.floor((available - reservedHeight) / itemHeight),\n\t\t\t\t);\n\t\t\t\tsetVisibleCount(Math.min(count, items.length));\n\t\t\t}, 100);\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [items.length, maxItemCount]);\n\n\tconst visibleItems = items.slice(0, visibleCount);\n\tconst overflowItems = items.slice(visibleCount);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"flex flex-col items-center\", className)}\n\t\t>\n\t\t\t{visibleItems.map((item, index) => (\n\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: static list from props\n\t\t\t\t<AppBarItemButton key={index} item={item} />\n\t\t\t))}\n\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<AppBarOverflowIndicator items={overflowItems} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * @file app-bar-row.tsx\n * MD3 Expressive App Bar Row DSL.\n *\n * Displays App Bar action items in a horizontal row.\n * Items that exceed `maxItemCount` or available width collapse into a\n * dropdown menu via <AppBarOverflowIndicator>.\n *\n * Translated from OverflowMeasurePolicy / AppBarRow.kt in Jetpack Compose M3.\n *\n * @see docs/m3/app-bars/AppBarRow.kt\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarRowProps } from \"./app-bar.types\";\nimport { AppBarItemButton } from \"./app-bar-item-button\";\nimport { AppBarOverflowIndicator } from \"./app-bar-overflow-indicator\";\n\n/**\n * MD3 Expressive App Bar Row.\n *\n * Renders action items in a row. Compatible with the `actions` prop of any App Bar.\n *\n * @example\n * ```tsx\n * <SmallAppBar\n * title=\"Messages\"\n * actions={\n * <AppBarRow\n * maxItemCount={2}\n * items={[\n * { type: 'clickable', icon: <Icon>search</Icon>, label: 'Search', onClick: handleSearch },\n * { type: 'clickable', icon: <Icon>bookmark</Icon>, label: 'Bookmarks', onClick: handleBookmark },\n * { type: 'clickable', icon: <Icon>settings</Icon>, label: 'Settings', onClick: handleSettings },\n * ]}\n * />\n * }\n * />\n * ```\n */\nexport function AppBarRow({ items, maxItemCount, className }: AppBarRowProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst [visibleCount, setVisibleCount] = React.useState(\n\t\tmaxItemCount ?? items.length,\n\t);\n\n\tReact.useEffect(() => {\n\t\tif (maxItemCount !== undefined) {\n\t\t\tsetVisibleCount(Math.min(maxItemCount, items.length));\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tlet debounceTimer: ReturnType<typeof setTimeout>;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(() => {\n\t\t\t\tconst entry = entries[0];\n\t\t\t\tif (!entry) return;\n\n\t\t\t\tconst available = entry.contentRect.width;\n\t\t\t\tconst itemWidth = AppBarTokens.iconButtonTouchTarget;\n\t\t\t\tconst hasOverflow = items.length > Math.floor(available / itemWidth);\n\t\t\t\tconst reservedWidth = hasOverflow ? itemWidth : 0;\n\t\t\t\tconst count = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.floor((available - reservedWidth) / itemWidth),\n\t\t\t\t);\n\t\t\t\tsetVisibleCount(Math.min(count, items.length));\n\t\t\t}, 100);\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [items.length, maxItemCount]);\n\n\tconst visibleItems = items.slice(0, visibleCount);\n\tconst overflowItems = items.slice(visibleCount);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"flex items-center\", className)}\n\t\t\tstyle={{ gap: AppBarTokens.iconButtonSpace }}\n\t\t>\n\t\t\t{visibleItems.map((item, index) => (\n\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: items are static from props\n\t\t\t\t<AppBarItemButton key={index} item={item} />\n\t\t\t))}\n\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<AppBarOverflowIndicator items={overflowItems} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * @file use-app-bar-scroll.ts\n * MD3 Expressive App Bar — Scroll behavior hook.\n *\n * Tracks scroll state for App Bar behaviors:\n * - `pinned`: background color change only\n * - `enterAlways`: hide/show based on scroll direction\n * - `exitUntilCollapsed`: drives collapse fraction (0 = expanded, 1 = collapsed)\n */\n\nimport * as React from \"react\";\nimport type {\n\tAppBarScrollBehavior,\n\tUseAppBarScrollReturn,\n} from \"../app-bar.types\";\n\ninterface UseAppBarScrollOptions {\n\t/** Ref to the scrollable container. Defaults to `window`. */\n\tscrollElement?: React.RefObject<HTMLElement | null>;\n\t/** Scroll behavior mode. @default \"pinned\" */\n\tbehavior?: AppBarScrollBehavior;\n\t/** Collapsed height in px — used for `exitUntilCollapsed`. @default 64 */\n\tcollapsedHeight?: number;\n\t/** Expanded height in px — used for `exitUntilCollapsed`. @default 112 */\n\texpandedHeight?: number;\n}\n\n/**\n * Tracks scroll position and derives App Bar state for all three behaviors.\n *\n * @example\n * ```tsx\n * // pinned (color change only)\n * const { isScrolled } = useAppBarScroll({ behavior: 'pinned' });\n *\n * // enterAlways (hide/show)\n * const { isHidden } = useAppBarScroll({ behavior: 'enterAlways' });\n *\n * // exitUntilCollapsed (collapse animation)\n * const { collapsedFraction } = useAppBarScroll({\n * behavior: 'exitUntilCollapsed',\n * collapsedHeight: 64,\n * expandedHeight: 112,\n * });\n * ```\n */\nexport function useAppBarScroll({\n\tscrollElement,\n\tbehavior = \"pinned\",\n\tcollapsedHeight = 64,\n\texpandedHeight = 112,\n}: UseAppBarScrollOptions = {}): UseAppBarScrollReturn {\n\tconst [isScrolled, setIsScrolled] = React.useState(false);\n\tconst [collapsedFraction, setCollapsedFraction] = React.useState(0);\n\tconst [isHidden, setIsHidden] = React.useState(false);\n\n\t// Track previous scroll position for direction detection\n\tconst prevScrollYRef = React.useRef(0);\n\t// Hysteresis to prevent rapid toggling on enterAlways\n\tconst hideThreshold = 64;\n\n\tReact.useEffect(() => {\n\t\tconst scrollDistance = expandedHeight - collapsedHeight;\n\n\t\tconst getScrollY = (): number => {\n\t\t\tconst el = scrollElement?.current;\n\t\t\treturn el ? el.scrollTop : window.scrollY;\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tconst currentY = getScrollY();\n\t\t\tconst prevY = prevScrollYRef.current;\n\t\t\tconst delta = currentY - prevY;\n\t\t\tprevScrollYRef.current = currentY;\n\n\t\t\t// Pinned: only toggle background color\n\t\t\tsetIsScrolled(currentY > 0);\n\n\t\t\tif (behavior === \"exitUntilCollapsed\") {\n\t\t\t\tconst fraction =\n\t\t\t\t\tscrollDistance > 0\n\t\t\t\t\t\t? Math.min(1, Math.max(0, currentY / scrollDistance))\n\t\t\t\t\t\t: 0;\n\t\t\t\tsetCollapsedFraction(fraction);\n\t\t\t}\n\n\t\t\tif (behavior === \"enterAlways\") {\n\t\t\t\tif (delta > 0 && currentY > hideThreshold) {\n\t\t\t\t\t// Scrolling down — hide\n\t\t\t\t\tsetIsHidden(true);\n\t\t\t\t} else if (delta < 0) {\n\t\t\t\t\t// Scrolling up — show\n\t\t\t\t\tsetIsHidden(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst target = scrollElement?.current ?? window;\n\t\ttarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n\t\t// Sync initial state\n\t\thandleScroll();\n\n\t\treturn () => {\n\t\t\ttarget.removeEventListener(\"scroll\", handleScroll);\n\t\t};\n\t}, [scrollElement, behavior, collapsedHeight, expandedHeight]);\n\n\treturn { isScrolled, collapsedFraction, isHidden };\n}\n","/**\n * @file bottom-app-bar.tsx\n * MD3 Expressive Bottom App Bar.\n *\n * Fixed to bottom of screen. Contains action icons and optional FAB.\n * Height: 80px | Background: surface-container | Elevation: Level2 (always)\n *\n * @see docs/m3/app-bars/BottomAppBarTokens.kt\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport { APP_BAR_BOTTOM_SPRING, AppBarTokens } from \"./app-bar.tokens\";\nimport type { BottomAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\n/**\n * MD3 Expressive Bottom App Bar.\n *\n * @example\n * ```tsx\n * // With FAB\n * <BottomAppBar\n * actions={\n * <>\n * <IconButton aria-label=\"Check\"><Icon>check_box</Icon></IconButton>\n * <IconButton aria-label=\"Brush\"><Icon>brush</Icon></IconButton>\n * </>\n * }\n * floatingActionButton={<FAB aria-label=\"Compose\">...</FAB>}\n * />\n *\n * // Auto-hide on scroll\n * <BottomAppBar scrollBehavior=\"hidden\" actions={...} />\n * ```\n */\nexport function BottomAppBar({\n\tactions,\n\tfloatingActionButton,\n\tscrollBehavior = \"visible\",\n\tscrollElement,\n\tclassName,\n}: BottomAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { isHidden } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior: scrollBehavior === \"hidden\" ? \"enterAlways\" : \"pinned\",\n\t});\n\n\tconst hideTransition = shouldReduceMotion\n\t\t? { duration: 0 }\n\t\t: APP_BAR_BOTTOM_SPRING;\n\n\tconst translateY = scrollBehavior === \"hidden\" && isHidden ? \"100%\" : \"0%\";\n\n\treturn (\n\t\t<m.nav\n\t\t\trole=\"navigation\"\n\t\t\taria-label=\"Bottom app bar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed bottom-0 inset-x-0 z-50\",\n\t\t\t\t\"flex items-center\",\n\t\t\t\t\"bg-m3-surface-container\",\n\t\t\t\t\"px-2\", // minimal horizontal padding, icon buttons provide spacing\n\t\t\t\t\"elevation-2\", // BottomAppBarTokens.ContainerElevation = Level2 (always)\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.bottom,\n\t\t\t}}\n\t\t\tanimate={{ y: translateY }}\n\t\t\ttransition={hideTransition}\n\t\t>\n\t\t\t{/* Actions — leading end */}\n\t\t\t{actions && <div className=\"flex items-center flex-1\">{actions}</div>}\n\n\t\t\t{/* FAB — trailing end */}\n\t\t\t{floatingActionButton && (\n\t\t\t\t<div className=\"shrink-0 ml-auto mr-2\">{floatingActionButton}</div>\n\t\t\t)}\n\t\t</m.nav>\n\t);\n}\n","/**\n * @file docked-toolbar.tsx\n * MD3 Expressive Docked Toolbar.\n *\n * Secondary navigation component. NOT an App Bar.\n * Usually appears directly below the main App Bar.\n * Height: 64px | Background: surface-container\n * Typical content: chips, segmented buttons, filter actions.\n *\n * @see docs/m3/app-bars/DockedToolbarTokens.kt\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { DockedToolbarProps } from \"./app-bar.types\";\n\n/**\n * MD3 Expressive Docked Toolbar.\n *\n * @example\n * ```tsx\n * <DockedToolbar aria-label=\"Filter options\">\n * <Chip label=\"All\" selected onClick={() => setFilter('all')} />\n * <Chip label=\"Unread\" onClick={() => setFilter('unread')} />\n * <Chip label=\"Starred\" onClick={() => setFilter('starred')} />\n * </DockedToolbar>\n * ```\n */\nexport function DockedToolbar({\n\tchildren,\n\t\"aria-label\": ariaLabel,\n\tclassName,\n}: DockedToolbarProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"toolbar\"\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center w-full overflow-x-auto bg-m3-surface-container\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.dockedToolbar,\n\t\t\t\t// DockedToolbarTokens: LeadingSpace = 16dp, TrailingSpace = 16dp\n\t\t\t\tpaddingLeft: AppBarTokens.dockedToolbar.leadingSpace,\n\t\t\t\tpaddingRight: AppBarTokens.dockedToolbar.trailingSpace,\n\t\t\t\t// MinSpacing = 4dp (gap between items)\n\t\t\t\tgap: AppBarTokens.dockedToolbar.minSpacing,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","/**\n * @file use-flexible-app-bar.ts\n * Shared animation hook for MediumFlexibleAppBar and LargeFlexibleAppBar.\n *\n * Extracts common scroll-driven animation state to avoid duplication.\n */\n\nimport type { MotionValue } from \"motion/react\";\nimport { useMotionValue, useReducedMotion, useTransform } from \"motion/react\";\nimport type { RefObject } from \"react\";\nimport * as React from \"react\";\nimport { APP_BAR_COLOR_TRANSITION, APP_BAR_COLORS } from \"../app-bar.tokens\";\nimport type { AppBarColors } from \"../app-bar.types\";\nimport { useAppBarScroll } from \"./use-app-bar-scroll\";\n\ninterface UseFlexibleAppBarOptions {\n\tcollapsedHeight: number;\n\texpandedHeight: number;\n\tscrollElement?: RefObject<HTMLElement | null>;\n\tcolors?: AppBarColors;\n\t/** [start, end] progress range where large title fades from 1 → 0 */\n\tlargeTitleFadeRange: [number, number];\n\t/** [start, end] progress range where small title fades from 0 → 1 */\n\tsmallTitleFadeRange: [number, number];\n\t/** [start, end] progress range where subtitle fades from 1 → 0 */\n\tsubtitleFadeRange: [number, number];\n\t/** [start, end] progress range where headerContent fades from 1 → 0 */\n\theaderContentFadeRange: [number, number];\n\t/** [expanded, collapsed] Y offset for large title */\n\tlargeTitleYRange: [number, number];\n}\n\nexport interface FlexibleAppBarAnimationState {\n\theight: MotionValue<number>;\n\tcurrentBg: string;\n\tcssTransition: string | undefined;\n\tlargeTitleOpacity: MotionValue<number>;\n\tlargeTitleY: MotionValue<number>;\n\tsmallTitleOpacity: MotionValue<number>;\n\tsubtitleOpacity: MotionValue<number>;\n\theaderContentOpacity: MotionValue<number>;\n}\n\nexport function useFlexibleAppBar({\n\tcollapsedHeight,\n\texpandedHeight,\n\tscrollElement,\n\tcolors,\n\tlargeTitleFadeRange,\n\tsmallTitleFadeRange,\n\tsubtitleFadeRange,\n\theaderContentFadeRange,\n\tlargeTitleYRange,\n}: UseFlexibleAppBarOptions): FlexibleAppBarAnimationState {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { collapsedFraction } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior: \"exitUntilCollapsed\",\n\t\tcollapsedHeight,\n\t\texpandedHeight,\n\t});\n\n\tconst scrollProgress = useMotionValue(0);\n\n\tReact.useEffect(() => {\n\t\tscrollProgress.set(\n\t\t\tshouldReduceMotion\n\t\t\t\t? collapsedFraction > 0.5\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0\n\t\t\t\t: collapsedFraction,\n\t\t);\n\t}, [collapsedFraction, scrollProgress, shouldReduceMotion]);\n\n\tconst height = useTransform(\n\t\tscrollProgress,\n\t\t[0, 1],\n\t\t[expandedHeight, collapsedHeight],\n\t);\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = collapsedFraction > 0 ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst largeTitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[largeTitleFadeRange[0], largeTitleFadeRange[1]],\n\t\t[1, 0],\n\t);\n\tconst largeTitleY = useTransform(scrollProgress, [0, 1], largeTitleYRange);\n\tconst smallTitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[smallTitleFadeRange[0], smallTitleFadeRange[1]],\n\t\t[0, 1],\n\t);\n\tconst subtitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[subtitleFadeRange[0], subtitleFadeRange[1]],\n\t\t[1, 0],\n\t);\n\tconst headerContentOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[headerContentFadeRange[0], headerContentFadeRange[1]],\n\t\t[1, 0],\n\t);\n\n\treturn {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t};\n}\n","/**\n * @file large-flexible-app-bar.tsx\n * MD3 Expressive Large Flexible App Bar.\n *\n * Like MediumFlexibleAppBar but with larger typography.\n * Expanded height: 120px (no subtitle) / 152px (with subtitle)\n * Collapsed height: 64px\n * Title crossfade: DisplaySmall (expanded) ↔ TitleLarge (collapsed)\n *\n * @see docs/m3/app-bars/AppBarLargeFlexibleTokens.kt\n */\n\nimport { m } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { FlexibleAppBarProps } from \"./app-bar.types\";\nimport { useFlexibleAppBar } from \"./hooks/use-flexible-app-bar\";\n\n/**\n * MD3 Expressive Large Flexible App Bar.\n *\n * @example\n * ```tsx\n * <LargeFlexibleAppBar\n * title=\"Discover\"\n * subtitle=\"Trending today\"\n * navigationIcon={<IconButton aria-label=\"Open menu\"><Icon>menu</Icon></IconButton>}\n * headerContent={<img src=\"/banner.jpg\" alt=\"\" className=\"rounded-xl h-20 w-full object-cover\" />}\n * />\n * ```\n */\nexport function LargeFlexibleAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollElement,\n\theaderContent,\n\tcollapsedHeight = AppBarTokens.heights.flexibleCollapsed,\n\texpandedHeight,\n\tclassName,\n}: FlexibleAppBarProps) {\n\tconst resolvedExpandedHeight =\n\t\texpandedHeight ??\n\t\t(subtitle\n\t\t\t? AppBarTokens.heights.largeFlexWithSubtitleExpanded\n\t\t\t: AppBarTokens.heights.largeFlexExpanded);\n\n\tconst {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t} = useFlexibleAppBar({\n\t\tcollapsedHeight,\n\t\texpandedHeight: resolvedExpandedHeight,\n\t\tscrollElement,\n\t\tcolors,\n\t\tlargeTitleFadeRange: [0, 0.35],\n\t\tsmallTitleFadeRange: [0.55, 0.95],\n\t\tsubtitleFadeRange: [0, 0.25],\n\t\theaderContentFadeRange: [0, 0.2],\n\t\tlargeTitleYRange: [0, 12],\n\t});\n\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ height, backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center px-1 shrink-0\"\n\t\t\t\tstyle={{ height: collapsedHeight }}\n\t\t\t>\n\t\t\t\t{navigationIcon && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{navigationIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\"flex-1 min-w-0\", !navigationIcon && \"pl-4\")}\n\t\t\t\t\tstyle={{ opacity: smallTitleOpacity }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tappBarTypography.titleLarge,\n\t\t\t\t\t\t\t\"truncate block\",\n\t\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</span>\n\t\t\t\t</m.div>\n\n\t\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col flex-1 px-4 pb-4 justify-end\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<m.span\n\t\t\t\t\tclassName={cn(appBarTypography.displaySmall, \"truncate w-full\")}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: largeTitleOpacity,\n\t\t\t\t\t\ty: largeTitleY,\n\t\t\t\t\t\tcolor: colors?.titleColor ?? APP_BAR_COLORS.title,\n\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</m.span>\n\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tclassName={cn(appBarTypography.titleMedium, \"truncate w-full\")}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: subtitleOpacity,\n\t\t\t\t\t\t\tcolor: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle,\n\t\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\n\t\t\t\t{headerContent && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"mt-3 w-full\"\n\t\t\t\t\t\tstyle={{ opacity: headerContentOpacity }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{headerContent}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</m.header>\n\t);\n}\n","/**\n * @file medium-flexible-app-bar.tsx\n * MD3 Expressive Medium Flexible App Bar.\n *\n * Two-row layout in expanded state, collapses to single row on scroll.\n * Expanded height: 112px (no subtitle) / 136px (with subtitle)\n * Collapsed height: 64px\n * Title crossfade: HeadlineMedium (expanded) ↔ TitleLarge (collapsed)\n *\n * Supports `exitUntilCollapsed` scroll behavior only.\n *\n * @see docs/m3/app-bars/AppBarMediumFlexibleTokens.kt\n */\n\nimport { m } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { FlexibleAppBarProps } from \"./app-bar.types\";\nimport { useFlexibleAppBar } from \"./hooks/use-flexible-app-bar\";\n\n/**\n * MD3 Expressive Medium Flexible App Bar.\n *\n * @example\n * ```tsx\n * <MediumFlexibleAppBar\n * title=\"Settings\"\n * subtitle=\"Manage your preferences\"\n * navigationIcon={<IconButton aria-label=\"Go back\"><Icon>arrow_back</Icon></IconButton>}\n * actions={<IconButton aria-label=\"More options\"><Icon>more_vert</Icon></IconButton>}\n * />\n * ```\n */\nexport function MediumFlexibleAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollElement,\n\theaderContent,\n\tcollapsedHeight = AppBarTokens.heights.flexibleCollapsed,\n\texpandedHeight,\n\tclassName,\n}: FlexibleAppBarProps) {\n\tconst resolvedExpandedHeight =\n\t\texpandedHeight ??\n\t\t(subtitle\n\t\t\t? AppBarTokens.heights.mediumFlexWithSubtitleExpanded\n\t\t\t: AppBarTokens.heights.mediumFlexExpanded);\n\n\tconst {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t} = useFlexibleAppBar({\n\t\tcollapsedHeight,\n\t\texpandedHeight: resolvedExpandedHeight,\n\t\tscrollElement,\n\t\tcolors,\n\t\tlargeTitleFadeRange: [0, 0.4],\n\t\tsmallTitleFadeRange: [0.5, 0.9],\n\t\tsubtitleFadeRange: [0, 0.3],\n\t\theaderContentFadeRange: [0, 0.25],\n\t\tlargeTitleYRange: [0, 8],\n\t});\n\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ height, backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center px-1 shrink-0\"\n\t\t\t\tstyle={{ height: collapsedHeight }}\n\t\t\t>\n\t\t\t\t{navigationIcon && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{navigationIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 min-w-0\",\n\t\t\t\t\t\tisCentered ? \"text-center\" : \"text-start\",\n\t\t\t\t\t\t!navigationIcon && \"pl-4\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ opacity: smallTitleOpacity }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(appBarTypography.titleLarge, \"truncate block\")}\n\t\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</span>\n\t\t\t\t</m.div>\n\n\t\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col flex-1 px-4 pb-3 justify-end\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<m.span\n\t\t\t\t\tclassName={cn(appBarTypography.headlineMedium, \"truncate w-full\")}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: largeTitleOpacity,\n\t\t\t\t\t\ty: largeTitleY,\n\t\t\t\t\t\tcolor: colors?.titleColor ?? APP_BAR_COLORS.title,\n\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</m.span>\n\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tclassName={cn(appBarTypography.labelLarge, \"truncate w-full\")}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: subtitleOpacity,\n\t\t\t\t\t\t\tcolor: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle,\n\t\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\n\t\t\t\t{headerContent && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"mt-2 w-full\"\n\t\t\t\t\t\tstyle={{ opacity: headerContentOpacity }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{headerContent}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</m.header>\n\t);\n}\n","/**\n * @file search-app-bar.tsx\n * MD3 Expressive Search App Bar.\n *\n * New variant in MD3 Expressive (May 2025).\n * Replaces the title area with a pill-shaped search bar.\n * Uses Framer Motion layoutId to enable shared element transition with <SearchView>.\n *\n * @see docs/m3/app-bars/AppBar.kt — SearchAppBar\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLOR_TRANSITION,\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n} from \"./app-bar.tokens\";\nimport type { SearchAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\n/** Built-in search icon (Material Symbols) used as default. */\nfunction SearchIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"material-symbols-rounded text-[20px] leading-none select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tsearch\n\t\t</span>\n\t);\n}\n\n/**\n * MD3 Expressive Search App Bar.\n *\n * When the search bar is clicked, callers should open a `<SearchView>` overlay.\n * Uses Framer Motion `layoutId` (via `searchBarId`) for a smooth shared-element\n * transition between this bar and the search view.\n *\n * @example\n * ```tsx\n * const [searchOpen, setSearchOpen] = useState(false);\n *\n * <SearchAppBar\n * searchBarId=\"main-search\"\n * searchPlaceholder=\"Search messages...\"\n * onSearchFocus={() => setSearchOpen(true)}\n * trailingSearchActions={\n * <IconButton aria-label=\"Voice search\"><Icon>mic</Icon></IconButton>\n * }\n * externalActions={<Avatar src={user.avatar} />}\n * />\n *\n * <AnimatePresence>\n * {searchOpen && (\n * <SearchView\n * searchBarId=\"main-search\"\n * onClose={() => setSearchOpen(false)}\n * />\n * )}\n * </AnimatePresence>\n * ```\n */\nexport function SearchAppBar({\n\tsearchPlaceholder = \"Search\",\n\tsearchValue,\n\tonSearchFocus,\n\tleadingSearchIcon,\n\ttrailingSearchActions,\n\texternalActions,\n\tnavigationIcon,\n\tcolors,\n\tscrollBehavior = \"pinned\",\n\tscrollElement,\n\tsearchBarId = \"search-bar\",\n\tclassName,\n}: SearchAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst [isSearchOpen, setIsSearchOpen] = React.useState(false);\n\n\tconst { isScrolled } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior:\n\t\t\tscrollBehavior === \"exitUntilCollapsed\" ? \"pinned\" : scrollBehavior,\n\t});\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = isScrolled ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst handleSearchClick = () => {\n\t\tsetIsSearchOpen(true);\n\t\tonSearchFocus?.();\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\thandleSearchClick();\n\t\t}\n\t};\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex items-center gap-2 px-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.small,\n\t\t\t\tbackgroundColor: currentBg,\n\t\t\t\ttransition: cssTransition,\n\t\t\t}}\n\t\t>\n\t\t\t{/* Optional navigation icon — leading edge */}\n\t\t\t{navigationIcon && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{navigationIcon}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<m.div\n\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchBarId}\n\t\t\t\trole=\"search\"\n\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\taria-expanded={isSearchOpen}\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"relative flex flex-1 items-center gap-2 rounded-full cursor-text h-10 px-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\tonClick={handleSearchClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t>\n\t\t\t\t<div className=\"absolute inset-0 rounded-full bg-m3-surface-container-high -z-10\" />\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.searchBarContent }}\n\t\t\t\t>\n\t\t\t\t\t{leadingSearchIcon ?? <SearchIcon />}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"flex-1 text-[16px] leading-6 truncate select-none\"\n\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.searchBarContent }}\n\t\t\t\t>\n\t\t\t\t\t{searchValue ?? searchPlaceholder}\n\t\t\t\t</span>\n\n\t\t\t\t{trailingSearchActions && (\n\t\t\t\t\t<div className=\"flex items-center shrink-0\">\n\t\t\t\t\t\t{trailingSearchActions}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</m.div>\n\n\t\t\t{externalActions && (\n\t\t\t\t<div className=\"flex items-center shrink-0\">{externalActions}</div>\n\t\t\t)}\n\t\t</m.header>\n\t);\n}\n","/**\n * @file search-view.tsx\n * MD3 Expressive Search View.\n *\n * Full-screen overlay activated when a SearchAppBar's search bar is clicked.\n * Shares a Framer Motion `layoutId` with the SearchAppBar search bar for a\n * smooth shared element transition.\n *\n * Usage pattern:\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * // In render:\n * <SearchAppBar searchBarId=\"main\" onSearchFocus={() => setOpen(true)} />\n * <AnimatePresence>\n * {open && <SearchView searchBarId=\"main\" onClose={() => setOpen(false)} />}\n * </AnimatePresence>\n * ```\n *\n * Design notes:\n * - The SearchView is intentionally separate from SearchAppBar to allow consumers\n * to customize the results/suggestions content without coupling.\n * - The `searchBarId` prop must match between SearchAppBar and SearchView to\n * enable the shared element transition.\n * - Focus is moved to the search input when the view opens.\n * - Escape key closes the view and returns focus to the search bar.\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tSEARCH_VIEW_SPRING,\n} from \"./app-bar.tokens\";\nimport type { SearchViewProps } from \"./app-bar.types\";\n\n/** Built-in back arrow icon. */\nfunction ArrowBackIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tarrow_back\n\t\t</span>\n\t);\n}\n\n/** Built-in clear icon. */\nfunction CloseIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tclose\n\t\t</span>\n\t);\n}\n\n/**\n * MD3 Expressive Search View.\n *\n * Renders a full-screen search overlay with a shared element transition\n * from the triggering `<SearchAppBar>` search bar.\n *\n * Mount/unmount this component via `<AnimatePresence>` in the consumer.\n */\nexport function SearchView({\n\tsearchBarId = \"search-bar\",\n\tvalue = \"\",\n\tonChange,\n\tonClose,\n\tplaceholder = \"Search\",\n\tchildren,\n\tleadingIcon,\n\ttrailingAction,\n\tclassName,\n}: SearchViewProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\t// Move focus to the search input when the view opens\n\tReact.useEffect(() => {\n\t\tconst timer = window.setTimeout(() => {\n\t\t\tinputRef.current?.focus();\n\t\t}, 50);\n\t\treturn () => window.clearTimeout(timer);\n\t}, []);\n\n\t// Close on Escape key\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\tonClose();\n\t\t}\n\t};\n\n\tconst viewTransition = shouldReduceMotion\n\t\t? { duration: 0 }\n\t\t: SEARCH_VIEW_SPRING;\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\taria-label=\"Search\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-60 flex flex-col bg-m3-surface\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\tanimate={{ opacity: 1 }}\n\t\t\texit={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\ttransition={viewTransition}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t>\n\t\t\t{/* Search Bar — matches layoutId of SearchAppBar search bar */}\n\t\t\t<m.div\n\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchBarId}\n\t\t\t\tclassName=\"flex items-center gap-2 px-4 shrink-0 bg-m3-surface\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: AppBarTokens.heights.small,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Leading: back button or custom icon */}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"shrink-0 flex items-center justify-center rounded-full\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\tcolor: APP_BAR_COLORS.navigationIcon,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label=\"Close search\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t>\n\t\t\t\t\t{leadingIcon ?? <ArrowBackIcon />}\n\t\t\t\t</button>\n\n\t\t\t\t{/* Search input */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"relative flex flex-1 items-center rounded-full px-4 gap-2\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 40,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* Background Layer */}\n\t\t\t\t\t<div className=\"absolute inset-0 rounded-full bg-m3-surface-container-high -z-10\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => onChange?.(e.target.value)}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex-1 bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\"text-[16px] leading-6\",\n\t\t\t\t\t\t\t\"placeholder:text-m3-on-surface-variant\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.title }}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Clear button — show when there's a value */}\n\t\t\t\t\t{value && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"shrink-0 flex items-center justify-center rounded-full\",\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)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: 40,\n\t\t\t\t\t\t\t\theight: 40,\n\t\t\t\t\t\t\t\tcolor: APP_BAR_COLORS.searchBarContent,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"Clear search\"\n\t\t\t\t\t\t\tonClick={() => onChange?.(\"\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailingAction ?? <CloseIcon />}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</m.div>\n\n\t\t\t{/* Results / suggestions area */}\n\t\t\t{children && (\n\t\t\t\t<m.div\n\t\t\t\t\tclassName=\"flex-1 overflow-y-auto\"\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\ttransition={{ delay: 0.1, duration: 0.15 }}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</m.div>\n\t);\n}\n\n/**\n * Convenience wrapper that handles the AnimatePresence + open state.\n *\n * @example\n * ```tsx\n * <SearchBar\n * isOpen={searchOpen}\n * onClose={() => setSearchOpen(false)}\n * searchBarId=\"main-search\"\n * >\n * <SearchResultsList results={results} />\n * </SearchBar>\n * ```\n */\nexport function SearchViewContainer({\n\tisOpen,\n\t...props\n}: SearchViewProps & { isOpen: boolean }) {\n\treturn (\n\t\t<AnimatePresence>{isOpen && <SearchView {...props} />}</AnimatePresence>\n\t);\n}\n","/**\n * @file small-app-bar.tsx\n * MD3 Expressive Small App Bar.\n *\n * Single-row layout: [navigationIcon][title + subtitle][actions]\n * Height: 64px | Title: TitleLarge (22sp) | Subtitle: LabelMedium (12sp)\n *\n * Scroll behaviors:\n * - pinned: changes background color surface → surface-container\n * - enterAlways: slides up when scrolling down, slides down when scrolling up\n *\n * @see docs/m3/app-bars/AppBarSmallTokens.kt\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLOR_TRANSITION,\n\tAPP_BAR_COLORS,\n\tAPP_BAR_ENTER_ALWAYS_SPRING,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { SmallAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\ninterface SmallAppBarInnerProps\n\textends Pick<\n\t\tSmallAppBarProps,\n\t\t| \"title\"\n\t\t| \"subtitle\"\n\t\t| \"titleAlignment\"\n\t\t| \"navigationIcon\"\n\t\t| \"actions\"\n\t\t| \"colors\"\n\t\t| \"className\"\n\t> {\n\tcurrentBg: string;\n\tcssTransition: string | undefined;\n}\n\n/** Inner content shared between pinned and enterAlways variants. */\nfunction SmallAppBarInner({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tclassName,\n\tcurrentBg,\n\tcssTransition,\n}: SmallAppBarInnerProps) {\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\"flex items-center px-1 h-full w-full\", className)}\n\t\t\tstyle={{ backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t{navigationIcon && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{navigationIcon}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 flex flex-col justify-center min-w-0\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t\t!navigationIcon && \"pl-4\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tappBarTypography.titleLarge,\n\t\t\t\t\t\t\"truncate w-full\",\n\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tappBarTypography.labelMedium,\n\t\t\t\t\t\t\t\"truncate w-full\",\n\t\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t</m.header>\n\t);\n}\n\n/**\n * MD3 Expressive Small App Bar.\n *\n * @example\n * ```tsx\n * // Left-aligned (default)\n * <SmallAppBar\n * title=\"Inbox\"\n * navigationIcon={<IconButton aria-label=\"Go back\"><Icon>arrow_back</Icon></IconButton>}\n * actions={<IconButton aria-label=\"Search\"><Icon>search</Icon></IconButton>}\n * scrollBehavior=\"pinned\"\n * />\n *\n * // Center-aligned with subtitle\n * <SmallAppBar\n * title=\"Profile\"\n * subtitle=\"@username\"\n * titleAlignment=\"center\"\n * scrollBehavior=\"enterAlways\"\n * />\n * ```\n */\nexport function SmallAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollBehavior = \"pinned\",\n\tscrollElement,\n\tclassName,\n}: SmallAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { isScrolled, isHidden } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior:\n\t\t\tscrollBehavior === \"exitUntilCollapsed\" ? \"pinned\" : scrollBehavior,\n\t});\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = isScrolled ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst innerProps: SmallAppBarInnerProps = {\n\t\ttitle,\n\t\tsubtitle,\n\t\ttitleAlignment,\n\t\tnavigationIcon,\n\t\tactions,\n\t\tcolors,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t};\n\n\tconst barHeight = AppBarTokens.heights.small;\n\n\tif (scrollBehavior !== \"enterAlways\") {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\"fixed top-0 inset-x-0 z-50\", className)}\n\t\t\t\tstyle={{ height: barHeight }}\n\t\t\t>\n\t\t\t\t<SmallAppBarInner {...innerProps} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AnimatePresence initial={false}>\n\t\t\t{!isHidden && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey=\"small-app-bar\"\n\t\t\t\t\tinitial={{ y: \"-100%\" }}\n\t\t\t\t\tanimate={{ y: 0 }}\n\t\t\t\t\texit={{ y: \"-100%\" }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : APP_BAR_ENTER_ALWAYS_SPRING\n\t\t\t\t\t}\n\t\t\t\t\tclassName={cn(\"fixed top-0 inset-x-0 z-50\", className)}\n\t\t\t\t\tstyle={{ height: barHeight }}\n\t\t\t\t>\n\t\t\t\t\t<SmallAppBarInner {...innerProps} />\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.max(\n\t\t\t\tMath.hypot(rect.width, rect.height) * 2.5,\n\t\t\t\t320,\n\t\t\t);\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","/**\n * @file shared/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","\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\ttype Transition,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport { SPRING_TRANSITION_EXPRESSIVE } from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Layout styling for navigation bar items.\n * - vertical: Icon above label (default for mobile)\n * - horizontal: Icon beside label (forced)\n */\nexport type NavigationBarItemLayout = \"vertical\" | \"horizontal\";\n\n/**\n * Visual variant of the Navigation Bar.\n * - flexible: Default MD3 behavior (h-16), becomes horizontal on desktop.\n * - baseline: Taller MD3 behavior (h-20), always vertical.\n * - xr: Floating orbiter variant for spatial interfaces (detached from bottom).\n */\nexport type NavigationBarVariant = \"flexible\" | \"baseline\" | \"xr\";\n\nexport interface NavigationBarItemProps {\n\tselected: boolean;\n\ticon: React.ReactNode;\n\tlabel: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tbadge?: React.ReactNode;\n\t\"aria-label\"?: string;\n\tclassName?: string;\n}\n\nexport interface NavigationBarProps {\n\t/** Visual variant of the Navigation Bar */\n\tvariant?: NavigationBarVariant;\n\t/** Forces a specific item layout (horizontal/vertical) */\n\titemLayout?: NavigationBarItemLayout;\n\t/** Whether the bar should hide when scrolling down */\n\thideOnScroll?: boolean;\n\t/** Whether the bar should have an elevation shadow */\n\televated?: boolean;\n\t/** Whether the bar is fixed to the viewport (default) or absolute */\n\tfixed?: boolean;\n\t/** Container ref to track scrolling for hideOnScroll */\n\tscrollContainerRef?: React.RefObject<HTMLElement | null>;\n\t/** Transition for the active indicator pill */\n\tactiveIndicatorTransition?: Transition;\n\t/** Navigation items */\n\tchildren: React.ReactNode;\n\t/** Optional additional classes for individual navigation items */\n\titemClassName?: string;\n\t/** Optional additional classes */\n\tclassName?: string;\n\t/** Optional inline styles */\n\tstyle?: React.CSSProperties;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationBarContext = React.createContext<{\n\tvariant: NavigationBarVariant;\n\titemLayout?: NavigationBarItemLayout;\n\tactiveIndicatorTransition?: Transition;\n\titemClassName?: string;\n}>({ variant: \"flexible\" });\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction cloneIconWithFill(\n\ticon: React.ReactNode,\n\tselected: boolean,\n): React.ReactNode {\n\tif (!React.isValidElement(icon)) return icon;\n\tif ((icon.type as unknown) === Icon) {\n\t\treturn React.cloneElement(\n\t\t\ticon as React.ReactElement<{ fill?: 0 | 1; animateFill?: boolean }>,\n\t\t\t{ fill: selected ? 1 : 0, animateFill: true },\n\t\t);\n\t}\n\treturn icon;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBarItem Sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction ActivePill() {\n\tconst { activeIndicatorTransition } = React.useContext(NavigationBarContext);\n\n\treturn (\n\t\t<m.div\n\t\t\tclassName=\"absolute inset-0 bg-m3-secondary-container pointer-events-none\"\n\t\t\tstyle={{\n\t\t\t\tborderRadius: 9999,\n\t\t\t\tzIndex: 0,\n\t\t\t}}\n\t\t\tinitial={{ opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\texit={{ opacity: 0, scale: 0.5 }}\n\t\t\ttransition={activeIndicatorTransition || SPRING_TRANSITION_EXPRESSIVE}\n\t\t/>\n\t);\n}\n\nfunction HoverStateLayer() {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] group-focus-visible:opacity-[0.10] active:opacity-[0.10] transition-opacity duration-200 pointer-events-none z-0\" />\n\t);\n}\n\ninterface RippleLayerProps {\n\tripples: ReturnType<typeof useRippleState>[\"ripples\"];\n\tonRippleDone: ReturnType<typeof useRippleState>[\"removeRipple\"];\n}\n\nfunction RippleLayer({ ripples, onRippleDone }: RippleLayerProps) {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0\">\n\t\t\t<Ripple ripples={ripples} onRippleDone={onRippleDone} />\n\t\t</div>\n\t);\n}\n\ninterface IconContainerProps {\n\tselected: boolean;\n\tbadge?: React.ReactNode;\n\tchildren: React.ReactNode;\n}\n\nfunction IconContainer({ selected, badge, children }: IconContainerProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center size-6 transition-colors duration-200 shrink-0\",\n\t\t\t\tselected\n\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{badge && (\n\t\t\t\t<span className=\"absolute -top-1 -right-1 flex min-w-3 h-3 items-center justify-center rounded-full bg-m3-error px-1 text-[10px] font-medium leading-none tracking-normal text-m3-on-error ring-[1.5px] ring-m3-surface\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBarItem\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationBarItemComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tNavigationBarItemProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\ticon,\n\t\t\tlabel,\n\t\t\tonClick,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tvariant,\n\t\t\titemLayout,\n\t\t\titemClassName: contextItemClassName,\n\t\t} = React.useContext(NavigationBarContext);\n\n\t\tconst isForcedHorizontal = itemLayout === \"horizontal\";\n\t\tconst isResponsiveHorizontal =\n\t\t\t(variant === \"flexible\" || variant === \"xr\") && itemLayout === undefined;\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (selected) {\n\t\t\t\t\tif (typeof window !== \"undefined\" && window.scrollY > 0) {\n\t\t\t\t\t\twindow.scrollTo({ top: 0, behavior: \"smooth\" });\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.();\n\t\t\t},\n\t\t\t[disabled, selected, onClick],\n\t\t);\n\n\t\tconst filledIcon = cloneIconWithFill(icon, selected);\n\n\t\treturn (\n\t\t\t<m.button\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"menuitem\"\n\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\taria-label={\n\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group relative flex cursor-pointer transition-colors duration-200 outline-none select-none h-full items-center justify-center min-w-0\",\n\t\t\t\t\tvariant === \"xr\"\n\t\t\t\t\t\t? isResponsiveHorizontal\n\t\t\t\t\t\t\t? \"flex-1 min-[600px]:flex-initial min-[600px]:w-auto\"\n\t\t\t\t\t\t\t: isForcedHorizontal\n\t\t\t\t\t\t\t\t? \"flex-initial w-auto\"\n\t\t\t\t\t\t\t\t: \"flex-1\"\n\t\t\t\t\t\t: isForcedHorizontal\n\t\t\t\t\t\t\t? \"flex-initial w-auto\"\n\t\t\t\t\t\t\t: \"flex-1\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\tcontextItemClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex items-center justify-center flex-col gap-y-1 w-full px-1 py-1.5\",\n\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\"min-[600px]:flex-row min-[600px]:gap-y-0 min-[600px]:gap-x-1.5 min-[600px]:h-10 min-[600px]:px-4 min-[600px]:py-0 min-[600px]:rounded-full min-[600px]:w-auto\",\n\t\t\t\t\t\tisForcedHorizontal &&\n\t\t\t\t\t\t\t\"flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Horizontal active indicator — covers icon + label */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0 z-0 hidden\",\n\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:block\",\n\t\t\t\t\t\t\tisForcedHorizontal && \"block!\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Icon pill — background visible only in vertical layout */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\"h-8 w-16 mx-auto rounded-full\",\n\t\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\t\"min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto\",\n\t\t\t\t\t\t\tisForcedHorizontal && \"size-6 w-auto h-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"absolute inset-0 z-0\",\n\t\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:hidden\",\n\t\t\t\t\t\t\t\tisForcedHorizontal && \"hidden\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"relative z-10 flex size-6 items-center justify-center text-current\">\n\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey=\"nav-label\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"z-10 transition-all duration-200 truncate px-1\",\n\t\t\t\t\t\t\t\tselected ? \"text-m3-on-surface\" : \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\"font-medium text-[12px] leading-4 tracking-[0.5px]\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</div>\n\t\t\t\t<TouchTarget />\n\t\t\t</m.button>\n\t\t);\n\t},\n);\n\nNavigationBarItemComponent.displayName = \"NavigationBarItem\";\nexport const NavigationBarItem = React.memo(NavigationBarItemComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBar Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst navContainerVariants = cva(\n\t\"flex items-center justify-center select-none transition-transform duration-300 z-50\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tflexible: \"bottom-0 left-0 right-0 w-full h-16 pb-safe\",\n\t\t\t\tbaseline: \"bottom-0 left-0 right-0 w-full h-20 pb-safe\",\n\t\t\t\txr: \"bottom-6 left-1/2 -translate-x-1/2 w-auto max-w-[calc(100%-2rem)] min-[600px]:max-w-fit h-20 min-[600px]:h-16 rounded-[48px] px-2\",\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tfixed: \"fixed\",\n\t\t\t\tabsolute: \"absolute\",\n\t\t\t},\n\t\t\televated: {\n\t\t\t\ttrue: \"shadow-[0_-1px_3px_rgba(0,0,0,0.1)]\",\n\t\t\t\tfalse: \"shadow-none\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"flexible\",\n\t\t\tposition: \"fixed\",\n\t\t\televated: false,\n\t\t},\n\t},\n);\n\nexport const NavigationBarComponent = React.forwardRef<\n\tHTMLElement,\n\tNavigationBarProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"flexible\",\n\t\t\titemLayout,\n\t\t\thideOnScroll = false,\n\t\t\televated = false,\n\t\t\tfixed = true,\n\t\t\tscrollContainerRef,\n\t\t\tactiveIndicatorTransition,\n\t\t\tchildren,\n\t\t\titemClassName,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [isVisible, setIsVisible] = React.useState(true);\n\t\tconst lastScrollY = React.useRef(\n\t\t\ttypeof window !== \"undefined\" ? window.scrollY : 0,\n\t\t);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (typeof window === \"undefined\" || !hideOnScroll) {\n\t\t\t\tsetIsVisible(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Do not hide if screen reader or reduced motion is active\n\t\t\tconst prefersReducedMotion = window.matchMedia(\n\t\t\t\t\"(prefers-reduced-motion: reduce)\",\n\t\t\t).matches;\n\t\t\tif (prefersReducedMotion) {\n\t\t\t\tsetIsVisible(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet ticking = false;\n\n\t\t\tconst handleScroll = () => {\n\t\t\t\tif (ticking) return;\n\t\t\t\tticking = true;\n\t\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\t\tconst currentScrollY = scrollContainerRef?.current\n\t\t\t\t\t\t? scrollContainerRef.current.scrollTop\n\t\t\t\t\t\t: window.scrollY;\n\n\t\t\t\t\tif (currentScrollY <= 0 || currentScrollY < lastScrollY.current) {\n\t\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\t} else if (currentScrollY > lastScrollY.current) {\n\t\t\t\t\t\tsetIsVisible(false);\n\t\t\t\t\t}\n\n\t\t\t\t\tlastScrollY.current = currentScrollY;\n\t\t\t\t\tticking = false;\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst target = scrollContainerRef?.current || window;\n\n\t\t\ttarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n\t\t\treturn () => target.removeEventListener(\"scroll\", handleScroll);\n\t\t}, [hideOnScroll, scrollContainerRef]);\n\n\t\tconst navBaseClasses = cn(\n\t\t\tnavContainerVariants({\n\t\t\t\tvariant,\n\t\t\t\televated,\n\t\t\t\tposition: fixed ? \"fixed\" : \"absolute\",\n\t\t\t}),\n\t\t\tvariant === \"xr\"\n\t\t\t\t? \"bg-m3-surface border border-white/5 shadow-xl\"\n\t\t\t\t: \"bg-m3-surface-container\",\n\t\t\tclassName,\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<NavigationBarContext.Provider\n\t\t\t\t\tvalue={{\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\titemLayout,\n\t\t\t\t\t\tactiveIndicatorTransition,\n\t\t\t\t\t\titemClassName,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<m.nav\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\trole=\"navigation\"\n\t\t\t\t\t\taria-label=\"Main navigation\"\n\t\t\t\t\t\tclassName={navBaseClasses}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t\tinitial={false}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\ty: isVisible\n\t\t\t\t\t\t\t\t? \"0%\"\n\t\t\t\t\t\t\t\t: variant === \"xr\"\n\t\t\t\t\t\t\t\t\t? \"calc(100% + 40px)\"\n\t\t\t\t\t\t\t\t\t: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ type: \"tween\", duration: 0.3, ease: \"easeInOut\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"menubar\"\n\t\t\t\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex w-full h-full mx-auto\",\n\t\t\t\t\t\t\t\tvariant === \"xr\"\n\t\t\t\t\t\t\t\t\t? \"gap-0 min-[600px]:gap-1.5 items-center justify-center px-1\"\n\t\t\t\t\t\t\t\t\t: \"max-w-7xl gap-1.5\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.nav>\n\t\t\t\t</NavigationBarContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationBarComponent.displayName = \"NavigationBar\";\nexport const NavigationBar = React.memo(NavigationBarComponent);\n","import { cva } from \"class-variance-authority\";\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\ttype Transition,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport {\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_EXPRESSIVE,\n} from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types & Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type NavigationRailVariant = \"collapsed\" | \"expanded\" | \"modal\" | \"xr\";\nexport type NavigationRailLabelVisibility = \"labeled\" | \"auto\" | \"unlabeled\";\n\nexport interface NavigationRailItemProps {\n\tselected: boolean;\n\ticon: React.ReactNode;\n\tlabel?: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tbadge?: React.ReactNode;\n\t\"aria-label\"?: string;\n\tclassName?: string;\n}\n\nexport interface NavigationRailProps {\n\tvariant?: NavigationRailVariant;\n\tlabelVisibility?: NavigationRailLabelVisibility;\n\theader?: React.ReactNode;\n\tfab?: React.ReactNode;\n\tfabPlacement?: \"contained\" | \"spatialized\";\n\tfooter?: React.ReactNode;\n\tnarrow?: boolean;\n\topen?: boolean;\n\tonClose?: () => void;\n\tactiveIndicatorTransition?: Transition;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nconst NavigationRailContext = React.createContext<{\n\tvariant: NavigationRailVariant;\n\tlabelVisibility: NavigationRailLabelVisibility;\n\tactiveIndicatorTransition?: Transition;\n}>({ variant: \"collapsed\", labelVisibility: \"labeled\" });\n\nconst MD3_MODAL_TRANSITION = {\n\ttype: \"tween\",\n\tease: [0.05, 0.7, 0.1, 1],\n\tduration: 0.3,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CVA Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst railContainerVariants = cva(\n\t\"flex flex-col overflow-y-auto overflow-x-hidden select-none transition-colors duration-300\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tcollapsed:\n\t\t\t\t\t\"items-center h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none\",\n\t\t\t\texpanded:\n\t\t\t\t\t\"items-start h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none\",\n\t\t\t\tmodal:\n\t\t\t\t\t\"bg-m3-surface shadow-lg rounded-r-[var(--m3-shape-corner-large)] h-full pt-11 pb-4\",\n\t\t\t\txr: \"h-fit py-5 rounded-[48px] shadow-xl bg-m3-surface border border-white/5\",\n\t\t\t},\n\t\t\tnarrow: {\n\t\t\t\ttrue: \"w-20\",\n\t\t\t\tfalse: \"w-24\",\n\t\t\t},\n\t\t},\n\t\tcompoundVariants: [\n\t\t\t{ variant: \"expanded\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t\t{ variant: \"modal\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t],\n\t\tdefaultVariants: {\n\t\t\tvariant: \"collapsed\",\n\t\t\tnarrow: false,\n\t\t},\n\t},\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction cloneIconWithFill(\n\ticon: React.ReactNode,\n\tselected: boolean,\n): React.ReactNode {\n\tif (!React.isValidElement(icon)) return icon;\n\tif ((icon.type as unknown) === Icon) {\n\t\treturn React.cloneElement(\n\t\t\ticon as React.ReactElement<{ fill?: 0 | 1; animateFill?: boolean }>,\n\t\t\t{ fill: selected ? 1 : 0, animateFill: true },\n\t\t);\n\t}\n\treturn icon;\n}\n\nfunction getMenuItems(container: HTMLElement): HTMLElement[] {\n\treturn Array.from(\n\t\tcontainer.querySelectorAll<HTMLElement>(\n\t\t\t'[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n\t\t),\n\t);\n}\n\nfunction setFocusedItem(items: HTMLElement[], index: number) {\n\tfor (const item of items) item.tabIndex = -1;\n\tconst target = items[index];\n\tif (target) {\n\t\ttarget.tabIndex = 0;\n\t\ttarget.focus();\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem Sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ActivePillProps {\n\tlayoutId: string;\n\tdisableInitial?: boolean;\n}\n\nfunction ActivePill({ layoutId, disableInitial = false }: ActivePillProps) {\n\tconst { activeIndicatorTransition } = React.useContext(NavigationRailContext);\n\n\treturn (\n\t\t<m.div\n\t\t\tlayoutId={layoutId}\n\t\t\tclassName=\"absolute inset-0 bg-m3-secondary-container pointer-events-none\"\n\t\t\tstyle={{ borderRadius: 9999, zIndex: 0, originX: 0.5, originY: 0.5 }}\n\t\t\tinitial={disableInitial ? false : { opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\texit={{ opacity: 0, scale: 0.5, transition: { duration: 0.15 } }}\n\t\t\ttransition={activeIndicatorTransition || SPRING_TRANSITION_EXPRESSIVE}\n\t\t/>\n\t);\n}\n\nfunction HoverStateLayer() {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] transition-opacity duration-200 pointer-events-none z-0\" />\n\t);\n}\n\ninterface RippleLayerProps {\n\tripples: ReturnType<typeof useRippleState>[\"ripples\"];\n\tonRippleDone: ReturnType<typeof useRippleState>[\"removeRipple\"];\n}\n\nfunction RippleLayer({ ripples, onRippleDone }: RippleLayerProps) {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0\">\n\t\t\t<Ripple ripples={ripples} onRippleDone={onRippleDone} />\n\t\t</div>\n\t);\n}\n\ninterface IconContainerProps {\n\tselected: boolean;\n\tbadge?: React.ReactNode;\n\tchildren: React.ReactNode;\n}\n\nfunction IconContainer({ selected, badge, children }: IconContainerProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center size-6 transition-colors duration-200\",\n\t\t\t\tselected\n\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{badge && (\n\t\t\t\t<span className=\"absolute -top-1 -right-1 flex min-w-3 h-3 items-center justify-center rounded-full bg-m3-error px-1 text-[10px] font-medium leading-none tracking-normal text-m3-on-error ring-[1.5px] ring-m3-surface\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationRailItemComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tNavigationRailItemProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\ticon,\n\t\t\tlabel,\n\t\t\tonClick,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { variant, labelVisibility } = React.useContext(\n\t\t\tNavigationRailContext,\n\t\t);\n\t\tconst isExpanded = variant === \"expanded\" || variant === \"modal\";\n\t\tconst isModal = variant === \"modal\";\n\t\tconst enableLayout = !isModal;\n\n\t\tconst activePillId = `rail-pill-${React.useId()}`;\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst showLabel =\n\t\t\tisExpanded ||\n\t\t\tlabelVisibility === \"labeled\" ||\n\t\t\t(labelVisibility === \"auto\" && selected);\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.();\n\t\t\t},\n\t\t\t[disabled, onClick],\n\t\t);\n\n\t\tconst filledIcon = cloneIconWithFill(icon, selected);\n\n\t\tconst labelInitial = isModal\n\t\t\t? false\n\t\t\t: { opacity: 0, x: isExpanded ? -12 : 0, y: isExpanded ? 0 : -8 };\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t\t}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"group relative flex cursor-pointer transition-colors duration-200 outline-none select-none\",\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2 rounded-full\",\n\t\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t? \"w-full flex-row items-center px-3 h-14\"\n\t\t\t\t\t\t\t: \"w-full flex-col justify-center h-14\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t>\n\t\t\t\t\t{/* Pill container - adapts layout for expanded vs collapsed */}\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex z-10\",\n\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t? \"flex-row items-center w-fit h-14 px-4 gap-x-3 rounded-full\"\n\t\t\t\t\t\t\t\t: \"flex-col items-center justify-center w-full gap-y-1 rounded-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t\t<ActivePill\n\t\t\t\t\t\t\t\t\t\tlayoutId={activePillId}\n\t\t\t\t\t\t\t\t\t\tdisableInitial={isModal}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Icon pill - collapsed mode */}\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\tisExpanded ? \"size-6\" : \"h-8 w-14 mx-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{selected && <ActivePill layoutId={activePillId} />}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\tclassName=\"relative z-10 flex size-6 items-center justify-center text-current\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</m.div>\n\n\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t\t{showLabel && label && (\n\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\tkey=\"rail-label\"\n\t\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\t\tinitial={labelInitial}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, transition: { duration: 0.1 } }}\n\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"z-10 transition-colors duration-200 whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-surface\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t\t\t\t? \"text-sm font-medium tracking-wide text-left\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-xs font-medium tracking-wide\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</m.div>\n\n\t\t\t\t\t<TouchTarget />\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailItemComponent.displayName = \"NavigationRailItem\";\nexport const NavigationRailItem = React.memo(NavigationRailItemComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRail Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction useRoving(navRef: React.RefObject<HTMLElement | null>) {\n\tReact.useEffect(() => {\n\t\tif (!navRef.current) return;\n\t\tconst items = getMenuItems(navRef.current);\n\t\tconst selected = items.find(\n\t\t\t(el) => el.getAttribute(\"aria-current\") === \"page\",\n\t\t);\n\n\t\tfor (const item of items) item.tabIndex = -1;\n\t\tconst firstFocusable = selected ?? items[0];\n\t\tif (firstFocusable) firstFocusable.tabIndex = 0;\n\t}, [navRef]);\n\n\treturn React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLElement>) => {\n\t\t\tif (!navRef.current) return;\n\t\t\tconst items = getMenuItems(navRef.current);\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n\t\t\tconst keyMap: Record<string, () => number> = {\n\t\t\t\tArrowDown: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowRight: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowUp: () => (currentIndex > 0 ? currentIndex - 1 : items.length - 1),\n\t\t\t\tArrowLeft: () =>\n\t\t\t\t\tcurrentIndex > 0 ? currentIndex - 1 : items.length - 1,\n\t\t\t\tHome: () => 0,\n\t\t\t\tEnd: () => items.length - 1,\n\t\t\t};\n\n\t\t\tconst getNextIndex = keyMap[e.key];\n\n\t\t\tif (getNextIndex) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetFocusedItem(items, getNextIndex());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(e.key === \" \" || e.key === \"Enter\") &&\n\t\t\t\titems.includes(document.activeElement as HTMLElement)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\t(document.activeElement as HTMLElement).click();\n\t\t\t}\n\t\t},\n\t\t[navRef],\n\t);\n}\n\nconst NavigationRailComponent = React.forwardRef<\n\tHTMLElement,\n\tNavigationRailProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"collapsed\",\n\t\t\tlabelVisibility = \"labeled\",\n\t\t\theader,\n\t\t\tfab,\n\t\t\tfabPlacement = \"contained\",\n\t\t\tfooter,\n\t\t\tnarrow = false,\n\t\t\topen = false,\n\t\t\tonClose,\n\t\t\tactiveIndicatorTransition,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isModal = variant === \"modal\";\n\t\tconst isXr = variant === \"xr\";\n\t\tconst isSpatial = isXr && fabPlacement === \"spatialized\";\n\t\tconst applyAnimation = !isXr || !isSpatial;\n\n\t\tconst navRef = React.useRef<HTMLElement>(null);\n\t\tconst handleKeyDown = useRoving(navRef);\n\n\t\tconst setRefs = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\tnavRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\tconst navBaseClasses = cn(railContainerVariants({ variant, narrow }));\n\t\tconst modalPositioning = isModal ? \"fixed left-0 top-0 z-[100]\" : \"\";\n\n\t\tconst navHeaderSpacing = (() => {\n\t\t\tif (!isXr) return \"mb-6 min-h-10\";\n\t\t\tif (fabPlacement === \"contained\") return fab ? \"mb-10\" : \"mb-5\";\n\t\t\treturn \"mb-5\";\n\t\t})();\n\n\t\tconst navElement = (\n\t\t\t<m.nav\n\t\t\t\tkey=\"md3-nav-rail\"\n\t\t\t\tlayout={!isModal}\n\t\t\t\tref={isSpatial ? undefined : setRefs}\n\t\t\t\trole=\"navigation\"\n\t\t\t\taria-label=\"Main navigation\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tnavBaseClasses,\n\t\t\t\t\t!isSpatial && modalPositioning,\n\t\t\t\t\t!isSpatial && isModal && applyAnimation && \"will-change-transform\",\n\t\t\t\t\t!isSpatial && className,\n\t\t\t\t)}\n\t\t\t\tstyle={isSpatial ? undefined : style}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tinitial={isModal && applyAnimation ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal && applyAnimation ? { x: 0 } : false}\n\t\t\t\texit={isModal && applyAnimation ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{(header || (fab && !isSpatial)) && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full flex-col items-center justify-start shrink-0 empty:hidden\",\n\t\t\t\t\t\t\tnavHeaderSpacing,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{header}\n\t\t\t\t\t\t{header && fab && !isSpatial && (\n\t\t\t\t\t\t\t<div className={isXr ? \"h-1\" : \"h-4\"} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!isSpatial && fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\trole=\"menubar\"\n\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\tclassName=\"flex flex-col flex-1 w-full gap-y-5\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\n\t\t\t\t{footer && (\n\t\t\t\t\t<div className=\"flex w-full flex-col items-center justify-end mt-auto shrink-0 pt-4 empty:hidden\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</m.nav>\n\t\t);\n\n\t\tconst spatialFabSize = narrow\n\t\t\t? \"size-20 rounded-[40px]\"\n\t\t\t: \"size-24 rounded-[48px]\";\n\n\t\tconst spatialWrapper = (\n\t\t\t<m.div\n\t\t\t\tkey=\"md3-nav-wrapper\"\n\t\t\t\tref={setRefs}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col items-center gap-y-5 pointer-events-none\",\n\t\t\t\t\tmodalPositioning,\n\t\t\t\t\t\"m-6\",\n\t\t\t\t\tisModal && \"will-change-transform\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={style}\n\t\t\t\tinitial={isModal ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal ? { x: 0 } : false}\n\t\t\t\texit={isModal ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{fab && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center pointer-events-auto\",\n\t\t\t\t\t\t\tspatialFabSize,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{React.cloneElement(\n\t\t\t\t\tnavElement as React.ReactElement<{ className?: string }>,\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: cn(navBaseClasses, \"pointer-events-auto\"),\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t</m.div>\n\t\t);\n\n\t\tconst finalNavElement = isSpatial ? spatialWrapper : navElement;\n\n\t\tconst contextValue = {\n\t\t\tvariant,\n\t\t\tlabelVisibility,\n\t\t\tactiveIndicatorTransition,\n\t\t};\n\n\t\tif (isModal) {\n\t\t\tif (typeof document === \"undefined\") return null;\n\n\t\t\treturn createPortal(\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t{open && (\n\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\tkey=\"md3-nav-backdrop\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"linear\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"fixed inset-0 bg-black/40 z-40 will-change-[opacity]\"\n\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{open && finalNavElement}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t\t</LazyMotion>,\n\t\t\t\tdocument.body,\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t{finalNavElement}\n\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailComponent.displayName = \"NavigationRail\";\nexport const NavigationRail = React.memo(NavigationRailComponent);\n","/**\n * @file use-search-keyboard.ts\n * Keyboard navigation hook for the MD3 Search component.\n *\n * Handles:\n * - ArrowDown / ArrowUp → navigate through suggestions (role=\"option\")\n * - Enter → submit search or select active suggestion\n * - Escape → close the SearchView\n */\n\nimport * as React from \"react\";\nimport type { UseSearchKeyboardReturn } from \"../search.types\";\n\ninterface UseSearchKeyboardOptions {\n\t/** Whether the SearchView is currently open. */\n\tactive: boolean;\n\t/** Callback to close the SearchView. */\n\tonActiveChange: (active: boolean) => void;\n\t/** Callback for search submission. */\n\tonSearch: (query: string) => void;\n\t/** Current search query. */\n\tquery: string;\n\t/** Total number of suggestion items in the listbox. */\n\titemCount: number;\n\t/** Called when user selects a specific suggestion by index. */\n\tonSelectSuggestion?: (index: number) => void;\n}\n\n/**\n * Manages keyboard navigation for the Search component.\n *\n * Complies with WAI-ARIA Combobox pattern:\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n */\nexport function useSearchKeyboard({\n\tactive,\n\tonActiveChange,\n\tonSearch,\n\tquery,\n\titemCount,\n\tonSelectSuggestion,\n}: UseSearchKeyboardOptions): UseSearchKeyboardReturn {\n\tconst [activeIndex, setActiveIndex] = React.useState(-1);\n\n\t// Reset active index when SearchView closes or query changes.\n\t// Done during render phase to prevent double-renders on every keystroke,\n\t// which would otherwise cause severe layout thrashing.\n\tconst resetKeyRef = React.useRef(`${active}:${query}`);\n\tconst currentKey = `${active}:${query}`;\n\tif (resetKeyRef.current !== currentKey) {\n\t\tresetKeyRef.current = currentKey;\n\t\tsetActiveIndex(-1);\n\t}\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (!active) return;\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => (i < itemCount - 1 ? i + 1 : i));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => (i > -1 ? i - 1 : -1));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Enter\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (activeIndex >= 0 && onSelectSuggestion) {\n\t\t\t\t\t\tonSelectSuggestion(activeIndex);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonSearch(query);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Escape\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonActiveChange(false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tactive,\n\t\t\tactiveIndex,\n\t\t\titemCount,\n\t\t\tonActiveChange,\n\t\t\tonSearch,\n\t\t\tonSelectSuggestion,\n\t\t\tquery,\n\t\t],\n\t);\n\n\tconst resetActiveIndex = React.useCallback(() => {\n\t\tsetActiveIndex(-1);\n\t}, []);\n\n\treturn { activeIndex, handleKeyDown, resetActiveIndex };\n}\n","/**\n * @file search.tokens.ts\n * MD3 Expressive Search — Design tokens ported from:\n * - SearchBarTokens.kt (v0_210)\n * - SearchViewTokens.kt (v0_210)\n *\n * All dimensional values are in px (1dp = 1px on web).\n * Colors reference CSS custom properties — do NOT hardcode hex.\n * @see docs/m3/search/SearchBarTokens.kt\n * @see docs/m3/search/SearchViewTokens.kt\n */\nimport {\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"../shared/motion-tokens\";\n// ─── Dimensional Tokens ───────────────────────────────────────────────────────\n\n/**\n * Height and shape tokens for Search variants.\n * Maps directly from MD3 Kotlin token files.\n */\nexport const SearchTokens = {\n\t// ── Heights ─────────────────────────────────────────────────────────────\n\theights: {\n\t\t/** SearchBarTokens.ContainerHeight = 56dp */\n\t\tbar: 56,\n\t\t/** SearchViewTokens.DockedHeaderContainerHeight = 56dp */\n\t\tdockedHeader: 56,\n\t\t/** SearchViewTokens.FullScreenHeaderContainerHeight = 72dp */\n\t\tfullScreenHeader: 72,\n\t},\n\n\t// ── Avatar ────────────────────────────────────────────────────────────\n\t/** SearchBarTokens.AvatarSize = 30dp */\n\tavatarSize: 30,\n\n\t// ── Icon ───────────────────────────────────────────────────────────────\n\t/** Standard icon size for leading/trailing icons. */\n\ticonSize: 20,\n\t/** Touch target for interactive icons per MD3 a11y spec. */\n\ticonTouchTarget: 48,\n\n\t// ── Gap ────────────────────────────────────────────────────────────────\n\t/** Gap between SearchBar and results list when hasGap=true. */\n\tdropdownGap: 2,\n} as const;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/**\n * CSS custom property references for Search colors.\n * Maps to --md-sys-color-* tokens in the MD3 theme system.\n *\n * SearchBarTokens.kt:\n * - ContainerColor → SurfaceContainerHigh\n * - LeadingIconColor → OnSurface\n * - TrailingIconColor → OnSurfaceVariant\n * - InputTextColor → OnSurface\n * - SupportingTextColor → OnSurfaceVariant (placeholder)\n *\n * SearchViewTokens.kt:\n * - ContainerColor → SurfaceContainerHigh\n * - DividerColor → Outline\n */\nexport const SEARCH_COLORS = {\n\t/** SearchBarTokens.ContainerColor → surface-container-high */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\t/** SearchBarTokens.LeadingIconColor → on-surface */\n\tleadingIcon: \"var(--md-sys-color-on-surface)\",\n\t/** SearchBarTokens.TrailingIconColor → on-surface-variant */\n\ttrailingIcon: \"var(--md-sys-color-on-surface-variant)\",\n\t/** SearchBarTokens.InputTextColor → on-surface */\n\tinputText: \"var(--md-sys-color-on-surface)\",\n\t/** SearchBarTokens.SupportingTextColor → on-surface-variant (placeholder) */\n\tsupportingText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** SearchViewTokens.DividerColor → outline */\n\tdivider: \"var(--md-sys-color-outline)\",\n\t/** Focus indicator → secondary */\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n} as const;\n\n// ─── Typography Tokens ────────────────────────────────────────────────────────\n\n/**\n * SearchBarTokens.InputTextFont = BodyLarge (16sp / 24sp line-height).\n * SearchBarTokens.SupportingTextFont = BodyLarge.\n */\nexport const SEARCH_TYPOGRAPHY = {\n\t/** BodyLarge — used for input text and placeholder. */\n\tbodyLarge: \"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n} as const;\n\nexport const SEARCH_BAR_EXPAND_SPRING = FAST_SPATIAL_SPRING;\n\nexport const SEARCH_DOCKED_REVEAL_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const SEARCH_FULLSCREEN_SPRING = SLOW_SPATIAL_SPRING;\n\nexport const SEARCH_BAR_EXIT_SPRING = FAST_SPATIAL_SPRING;\n","/**\n * @file animated-placeholder.tsx\n * MD3 Expressive Search — Animated placeholder overlay.\n *\n * Replaces the native `::placeholder` with a GPU-accelerated `translateX`\n * animation so the placeholder text can smoothly slide from its alignment\n * position (center / right) to left when the search input is focused.\n *\n * Implementation notes:\n * - Only `transform: translateX` is animated → no layout triggers, no paint.\n * - Container width is measured once via `useLayoutEffect` (before paint) to\n * avoid a first-render flash, then kept fresh via `ResizeObserver`.\n * - xOffset is stored in `useState` so Framer Motion picks up changes and\n * re-animates smoothly on container resize.\n * - The span is never unmounted — only opacity-toggled — to preserve the\n * measurement ref between renders.\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SEARCH_COLORS, SEARCH_TYPOGRAPHY } from \"./search.tokens\";\n\n/** Spring tuned to match MD3 Standard Decelerate curve. */\nconst PLACEHOLDER_SPRING = {\n\ttype: \"spring\" as const,\n\tstiffness: 350,\n\tdamping: 30,\n\tmass: 0.8,\n};\n\ninterface AnimatedPlaceholderProps {\n\t/** Placeholder text to display. */\n\ttext: string;\n\t/** Alignment of the placeholder when idle (not focused). @default \"left\" */\n\ttextAlign: \"left\" | \"center\" | \"right\";\n\t/**\n\t * Whether the placeholder should be visible.\n\t * Pass `!query` — hide when the user has typed something.\n\t */\n\tvisible: boolean;\n\t/**\n\t * Whether the search is in an active/focused state.\n\t * When `true`, the placeholder snaps to `left` regardless of `textAlign`.\n\t */\n\tfocused: boolean;\n\t/**\n\t * The `<input>` element that this component wraps.\n\t * It should have `w-full` instead of `flex-1` since this wrapper\n\t * takes over the `flex-1` role in the parent flex layout.\n\t */\n\tchildren: React.ReactNode;\n\t/** Extra className forwarded to the wrapper div. */\n\tclassName?: string;\n}\n\n/**\n * Wraps a search `<input>` with an animated placeholder overlay.\n *\n * The wrapper div occupies `flex-1` so it fits seamlessly in the\n * horizontal flex layout used by search bar headers. The children\n * (the `<input>`) should use `w-full` to fill the wrapper.\n *\n * Accessibility: `aria-label` on the `<input>` carries the placeholder\n * text for screen readers; this span is `aria-hidden=\"true\"`.\n */\nexport function AnimatedPlaceholder({\n\ttext,\n\ttextAlign,\n\tvisible,\n\tfocused,\n\tchildren,\n\tclassName,\n}: AnimatedPlaceholderProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst spanRef = React.useRef<HTMLSpanElement | null>(null);\n\n\t// Offset in pixels from left when idle. 0 means no animation (left-aligned).\n\tconst [xOffset, setXOffset] = React.useState(0);\n\n\tconst recalculate = React.useCallback(() => {\n\t\tconst container = containerRef.current;\n\t\tconst span = spanRef.current;\n\t\tif (!container || !span || textAlign === \"left\") {\n\t\t\tsetXOffset(0);\n\t\t\treturn;\n\t\t}\n\t\tconst containerWidth = container.offsetWidth;\n\t\tconst textWidth = span.offsetWidth;\n\t\tif (textAlign === \"center\") {\n\t\t\tsetXOffset(Math.max(0, (containerWidth - textWidth) / 2));\n\t\t} else {\n\t\t\t// right\n\t\t\tsetXOffset(Math.max(0, containerWidth - textWidth));\n\t\t}\n\t}, [textAlign]);\n\n\t// Measure synchronously before first paint to prevent a position flash.\n\tReact.useLayoutEffect(() => {\n\t\trecalculate();\n\t}, [recalculate]);\n\n\t// Keep measurement fresh when the container is resized.\n\tReact.useEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\t\tconst observer = new ResizeObserver(recalculate);\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, [recalculate]);\n\n\t// When focused or no longer visible (user typed), snap to left (x=0).\n\tconst targetX = focused || !visible ? 0 : xOffset;\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"relative flex-1 min-w-0\", className)}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{/* Animated placeholder — decorative only, aria-hidden */}\n\t\t\t<m.span\n\t\t\t\tref={(el) => {\n\t\t\t\t\tspanRef.current = el;\n\t\t\t\t}}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none absolute inset-y-0 left-0\",\n\t\t\t\t\t\"flex items-center whitespace-nowrap select-none\",\n\t\t\t\t\tSEARCH_TYPOGRAPHY.bodyLarge,\n\t\t\t\t)}\n\t\t\t\tstyle={{ color: SEARCH_COLORS.supportingText }}\n\t\t\t\tanimate={{\n\t\t\t\t\tx: targetX,\n\t\t\t\t\topacity: visible ? 1 : 0,\n\t\t\t\t}}\n\t\t\t\ttransition={shouldReduceMotion ? { duration: 0 } : PLACEHOLDER_SPRING}\n\t\t\t>\n\t\t\t\t{text}\n\t\t\t</m.span>\n\t\t</div>\n\t);\n}\n","/**\n * @file search-bar.tsx\n * MD3 Expressive SearchBar — Collapsed state.\n *\n * Renders a pill-shaped search bar (CornerFull, h-56px).\n * When focused/clicked → calls onActiveChange(true) to open SearchView.\n *\n * Option B (MD3 morphing): SearchBar is wrapped in its own AnimatePresence\n * with mode=\"popLayout\". When SearchView opens, SearchBar plays an exit\n * animation (opacity → 0, scale → 0.95) before unmounting, releasing the\n * shared layoutId so SearchView can claim it and morph from the same origin.\n *\n * Role: combobox (WAI-ARIA Search Combobox pattern).\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport {\n\tSEARCH_BAR_EXIT_SPRING,\n\tSEARCH_BAR_EXPAND_SPRING,\n\tSEARCH_COLORS,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\n\n/** Default search icon (Material Symbols). */\nfunction DefaultSearchIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\tstyle={{ fontSize: SearchTokens.iconSize }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tsearch\n\t\t</span>\n\t);\n}\n\ntype SearchBarProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"className\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\t/** KeyDown handler from useSearchKeyboard. */\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\t/** Currently highlighted suggestion index (-1 = none). */\n\t\tactiveIndex: number;\n\t};\n\n/**\n * SearchBar — collapsed state of the MD3 Search component.\n *\n * Uses Framer Motion `layout` + shared `layoutId` to morph into\n * SearchView when active. Wrapped in AnimatePresence with mode=\"popLayout\"\n * so it exits (fades/scales out) before SearchView claims the layoutId.\n */\nexport function SearchBar({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tclassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tconst prevActiveRef = React.useRef(active);\n\n\tconst isRestoringFocusRef = React.useRef(false);\n\n\t// When SearchView opens, focus moves to SearchView's input.\n\t// When SearchView closes (true → false), restore focus here.\n\tReact.useEffect(() => {\n\t\tlet rafId: number;\n\t\tif (prevActiveRef.current === true && active === false) {\n\t\t\tisRestoringFocusRef.current = true;\n\t\t\tinputRef.current?.focus();\n\t\t\t// Reset after a tick to allow the focus event to fire\n\t\t\trafId = requestAnimationFrame(() => {\n\t\t\t\tisRestoringFocusRef.current = false;\n\t\t\t});\n\t\t}\n\t\tprevActiveRef.current = active;\n\t\treturn () => {\n\t\t\tif (rafId) cancelAnimationFrame(rafId);\n\t\t};\n\t}, [active]);\n\n\tconst handleFocus = () => {\n\t\tif (!active && !isRestoringFocusRef.current) {\n\t\t\tonActiveChange(true);\n\t\t}\n\t};\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\t// aria-activedescendant points to the highlighted suggestion\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\treturn (\n\t\t/*\n\t\t * AnimatePresence mode=\"popLayout\":\n\t\t * When SearchView opens (active=true), SearchBar plays its exit animation\n\t\t * first, then unmounts — releasing the shared layoutId for SearchView to\n\t\t * claim and morph from the pill shape.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{!active && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey={searchId}\n\t\t\t\t\tlayout={!shouldReduceMotion}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\ttransition={shouldReduceMotion ? undefined : SEARCH_BAR_EXPAND_SPRING}\n\t\t\t\t\tclassName={cn(\"relative\", className)}\n\t\t\t\t\tstyle={{ height: SearchTokens.heights.bar }}\n\t\t\t\t\tinitial={shouldReduceMotion ? false : { opacity: 0, scale: 0.95 }}\n\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\texit={\n\t\t\t\t\t\tshouldReduceMotion\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { opacity: 0, scale: 0.95, transition: SEARCH_BAR_EXIT_SPRING }\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Background layer — rounded-full per SearchBarTokens.ContainerShape */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0 rounded-full\"\n\t\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* <search> is the semantic element for role=\"search\" */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"relative flex h-full items-center gap-2 rounded-full px-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{leadingIcon ?? <DefaultSearchIcon />}\n\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t{/* AnimatedPlaceholder wraps the input to provide a smooth\n\t\t\t\t\t\t\t translateX animation from textAlign → left on focus. */}\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* role=\"combobox\" per WAI-ARIA combobox pattern */}\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={searchId}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={active}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t{trailingIcon && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{trailingIcon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import * as React from \"react\";\n\n/**\n * MD3 Expressive Search Context\n * Shared state for the Search orchestrator and its children.\n */\ninterface SearchContextValue {\n\t/** Unique ID for the results listbox, used for aria-controls. */\n\tlistboxId: string;\n\t/** Currently highlighted suggestion index. -1 = none. */\n\tactiveIndex: number;\n}\n\nconst SearchContext = React.createContext<SearchContextValue | null>(null);\n\n/**\n * Provider for Search component state.\n * Internal use only within the library.\n */\nexport function SearchProvider({\n\tchildren,\n\tvalue,\n}: {\n\tchildren: React.ReactNode;\n\tvalue: SearchContextValue;\n}) {\n\treturn (\n\t\t<SearchContext.Provider value={value}>{children}</SearchContext.Provider>\n\t);\n}\n\n/**\n * Hook to access Search state from children (e.g., search items).\n */\nexport function useSearch() {\n\tconst context = React.useContext(SearchContext);\n\tif (!context) {\n\t\t// If used outside Search, return defaults instead of throwing to avoid crashing simple use cases\n\t\treturn { listboxId: \"\", activeIndex: -1 };\n\t}\n\treturn context;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook to detect clicks outside of a specified element.\n *\n * @param handler - Callback function to execute when a click outside occurs.\n * @param enabled - Whether the listener is active.\n * @returns A RefObject to be attached to the target element.\n */\nexport function useClickOutside<T extends HTMLElement>(\n\thandler: () => void,\n\tenabled = true,\n) {\n\tconst ref = useRef<T>(null);\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst listener = (event: MouseEvent | TouchEvent) => {\n\t\t\tconst el = ref.current;\n\t\t\tif (!el || el.contains(event.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandler();\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", listener);\n\t\tdocument.addEventListener(\"touchstart\", listener);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", listener);\n\t\t\tdocument.removeEventListener(\"touchstart\", listener);\n\t\t};\n\t}, [handler, enabled]);\n\n\treturn ref;\n}\n","import * as React from \"react\";\n\n/**\n * Focuses `inputRef` when `active` becomes true, using a double-rAF\n * to wait for Framer Motion's layout animation to finish painting.\n */\nexport function useSearchViewFocus(\n\tinputRef: React.RefObject<HTMLInputElement | null>,\n\tactive: boolean,\n): void {\n\tReact.useEffect(() => {\n\t\tif (!active) return;\n\t\tlet raf2: number;\n\t\tconst raf1 = requestAnimationFrame(() => {\n\t\t\traf2 = requestAnimationFrame(() => {\n\t\t\t\tinputRef.current?.focus();\n\t\t\t});\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(raf1);\n\t\t\tif (raf2) cancelAnimationFrame(raf2);\n\t\t};\n\t}, [active, inputRef]);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// 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 icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SIZE_HEIGHT_STYLES: Record<string, string> = {\n\txs: \"h-8\",\n\tsm: \"h-10\",\n\tmd: \"h-14\",\n\tlg: \"h-24\",\n\txl: \"h-[8.5rem]\",\n};\n\n/**\n * Per-size container width variants (Tailwind utility classes).\n * MD3 Expressive width variants: default (1:1), narrow, wide.\n * @internal\n */\nconst WIDTH_SIZE_STYLES: Record<string, Record<string, string>> = {\n\txs: {\n\t\tdefault: \"w-8\",\n\t\tnarrow: \"w-8\",\n\t\twide: \"w-12\",\n\t},\n\tsm: {\n\t\tdefault: \"w-10\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[3.25rem]\",\n\t},\n\tmd: {\n\t\tdefault: \"w-14\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[4.5rem]\",\n\t},\n\tlg: {\n\t\tdefault: \"w-24\",\n\t\tnarrow: \"w-16\",\n\t\twide: \"w-32\",\n\t},\n\txl: {\n\t\tdefault: \"w-[8.5rem]\",\n\t\tnarrow: \"w-[6.5rem]\",\n\t\twide: \"w-[11.5rem]\",\n\t},\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container width variant following MD3 Expressive specification.\n\t * - `default`: 1:1 aspect ratio square/round container.\n\t * - `narrow`: compressed width.\n\t * - `wide`: extended width.\n\t * @default \"default\"\n\t */\n\twidthVariant?: \"default\" | \"narrow\" | \"wide\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * An optional icon to display when the icon button is in a selected toggle state (`variant=\"toggle\"` and `selected={true}`).\n\t * If omitted, falls back to `children`.\n\t */\n\tselectedIcon?: React.ReactNode;\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n\t/**\n\t * Change the component to the underlying child element and merge props/behavior.\n\t * Useful when wrapping in Next.js `<Link>` or custom anchor tags.\n\t * @default false\n\t */\n\tasChild?: boolean;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\twidthVariant = \"default\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tselectedIcon,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\tconst heightClass = SIZE_HEIGHT_STYLES[size] ?? SIZE_HEIGHT_STYLES.sm;\n\t\tconst widthClass =\n\t\t\t(WIDTH_SIZE_STYLES[size] ?? WIDTH_SIZE_STYLES.sm)[widthVariant] ??\n\t\t\tWIDTH_SIZE_STYLES.sm.default;\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey={isSelected && selectedIcon ? \"selected-content\" : \"content\"}\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelected && selectedIcon\n\t\t\t\t\t\t\t\t? selectedIcon\n\t\t\t\t\t\t\t\t: asChild\n\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\tReact.Children.only(children) as React.ReactElement<{\n\t\t\t\t\t\t\t\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t).props.children\n\t\t\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst containerClassName = cn(\n\t\t\tbaseIconButtonClasses,\n\t\t\tresolvedColorClass,\n\t\t\toutlineWidthClass,\n\t\t\tdisabledBgClass,\n\t\t\t\"overflow-hidden\",\n\t\t\theightClass,\n\t\t\twidthClass,\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(style as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t{...(restProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","import type * as React from \"react\";\nimport { IconButton } from \"../buttons/icon-button\";\nimport { SEARCH_COLORS } from \"./search.tokens\";\n\ninterface TrailingActionProps {\n\tquery: string;\n\ttrailingIcon?: React.ReactNode;\n\tonClear: () => void;\n}\n\n/** Clear button when query is non-empty, otherwise the trailing icon slot. */\nexport function TrailingAction({\n\tquery,\n\ttrailingIcon,\n\tonClear,\n}: TrailingActionProps) {\n\tif (query) {\n\t\treturn (\n\t\t\t<IconButton\n\t\t\t\tsize=\"sm\"\n\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\taria-label=\"Clear search\"\n\t\t\t\tonClick={onClear}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\t\t\tstyle={{ fontSize: 20 }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\tclose\n\t\t\t\t</span>\n\t\t\t</IconButton>\n\t\t);\n\t}\n\n\tif (trailingIcon) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{trailingIcon}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn null;\n}\n","/**\n * @file search-view-docked.tsx\n * MD3 Expressive SearchView — Docked variant.\n *\n * Displays as a popup dropdown below the SearchBar.\n * Recommended for medium and large screens (tablets, desktops).\n *\n * Shape: CornerExtraLarge (rounded-[28px]) per SearchViewTokens.DockedContainerShape.\n * Header height: 56dp per SearchViewTokens.DockedHeaderContainerHeight.\n *\n * Animation (Option B — MD3 morphing):\n * - Shares `layoutId` with SearchBar. After SearchBar exits via its own\n * AnimatePresence (mode=\"popLayout\"), this view claims the layoutId and\n * Framer Motion morphs the pill shape → rounded-[28px] container.\n * - Uses mode=\"popLayout\" so SearchBar can re-enter after this exits.\n * - Focus: double-rAF pattern syncs focus with layout animation frame.\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { useClickOutside } from \"../../hooks/useClickOutside\";\nimport { cn } from \"../../lib/utils\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport { useSearchViewFocus } from \"./hooks/use-search-view-focus\";\nimport {\n\tSEARCH_COLORS,\n\tSEARCH_DOCKED_REVEAL_SPRING,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\nimport { TrailingAction } from \"./trailing-action\";\n\ntype SearchViewDockedProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"styleType\"\n\t| \"hasGap\"\n\t| \"children\"\n\t| \"viewClassName\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\tactiveIndex: number;\n\t};\n\nexport function SearchViewDocked({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tstyleType = \"contained\",\n\thasGap = false,\n\tchildren,\n\tviewClassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchViewDockedProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tuseSearchViewFocus(inputRef, active);\n\n\tconst dropdownRef = useClickOutside<HTMLDivElement>(() => {\n\t\tonActiveChange(false);\n\t}, active);\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\treturn (\n\t\t/*\n\t\t * mode=\"popLayout\": when SearchView exits, it plays exit animation first,\n\t\t * then unmounts — freeing the layoutId for SearchBar to re-enter and morph back.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{active && (\n\t\t\t\t<m.div\n\t\t\t\t\tref={dropdownRef}\n\t\t\t\t\tkey={`${searchId}-view`}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// DockedContainerShape = CornerExtraLarge = 28dp radius\n\t\t\t\t\t\t\"rounded-[28px] overflow-hidden\",\n\t\t\t\t\t\tviewClassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : SEARCH_DOCKED_REVEAL_SPRING\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Header row — h-56px per DockedHeaderContainerHeight */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-4\"\n\t\t\t\t\t\tstyle={{ height: SearchTokens.heights.dockedHeader }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{leadingIcon}\n\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={`${searchId}-view`}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={true}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t<TrailingAction\n\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\ttrailingIcon={trailingIcon}\n\t\t\t\t\t\t\t\tonClear={() => onQueryChange(\"\")}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\n\t\t\t\t\t{/* hasGap: 2dp gap between header and results. */}\n\t\t\t\t\t{hasGap && children && <div className=\"h-0.5\" aria-hidden=\"true\" />}\n\n\t\t\t\t\t{/* Divider for \"divided\" styleType */}\n\t\t\t\t\t{styleType === \"divided\" && children && (\n\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\tclassName=\"border-0 border-t\"\n\t\t\t\t\t\t\tstyle={{ borderColor: SEARCH_COLORS.divider }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Results / Suggestions listbox */}\n\t\t\t\t\t{children && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={listboxId}\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\taria-label={`${ariaLabel} results`}\n\t\t\t\t\t\t\tclassName=\"min-h-30\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","/**\n * @file search-view-fullscreen.tsx\n * MD3 Expressive SearchView — FullScreen variant.\n *\n * Renders a full-screen overlay via React Portal.\n * Using Portal avoids z-index stacking context issues and ensures\n * the overlay always covers the entire viewport correctly.\n *\n * Animation (Option B — MD3 morphing):\n * - Shares `layoutId` with SearchBar. After SearchBar exits via its own\n * AnimatePresence (mode=\"popLayout\"), this view claims the layoutId and\n * Framer Motion morphs the pill shape → full-screen rect (CornerFull → CornerNone).\n * - mode=\"popLayout\" on this AnimatePresence enables SearchBar to re-enter\n * after this view exits.\n * - Focus: double-rAF pattern syncs focus with layout animation frame.\n *\n * Header height: 72dp per SearchViewTokens.FullScreenHeaderContainerHeight.\n * ESC key closes the view (handled by useSearchKeyboard).\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { IconButton } from \"../buttons/icon-button\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport { useSearchViewFocus } from \"./hooks/use-search-view-focus\";\nimport {\n\tSEARCH_COLORS,\n\tSEARCH_FULLSCREEN_SPRING,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\nimport { TrailingAction } from \"./trailing-action\";\n\n/** Back arrow icon for FullScreen header. */\nfunction ArrowBackIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\tstyle={{ fontSize: 24 }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tarrow_back\n\t\t</span>\n\t);\n}\n\ntype SearchViewFullScreenProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"styleType\"\n\t| \"children\"\n\t| \"viewClassName\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\tactiveIndex: number;\n\t};\n\n/**\n * SearchView FullScreen — full-screen overlay via React Portal.\n *\n * The `layoutId` shared with SearchBar enables Framer Motion to animate\n * the shape morphing from the pill (rounded-full) to a full-screen rect.\n *\n * Contained style: no divider, background preserved.\n * Divided style: HorizontalDivider between header and results.\n */\nexport function SearchViewFullScreen({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tstyleType = \"contained\",\n\tchildren,\n\tviewClassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchViewFullScreenProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tuseSearchViewFocus(inputRef, active);\n\n\t// Avoid SSR mismatch — only portal on client.\n\tconst [mounted, setMounted] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\tconst handleEscape = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.stopPropagation();\n\t\t\tonActiveChange(false);\n\t\t}\n\t};\n\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\tif (!mounted) return null;\n\n\tconst content = (\n\t\t/*\n\t\t * mode=\"popLayout\": when FullScreen exits, it plays exit animation first,\n\t\t * then unmounts — freeing the layoutId for SearchBar to re-enter and morph back\n\t\t * to the pill shape.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{active && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey={`${searchId}-fs`}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed inset-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\t\t\t// CornerNone — shape is resolved by Framer Motion layout animation\n\t\t\t\t\t\t\"rounded-none\",\n\t\t\t\t\t\tviewClassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : SEARCH_FULLSCREEN_SPRING\n\t\t\t\t\t}\n\t\t\t\t\tonKeyDown={handleEscape}\n\t\t\t\t>\n\t\t\t\t\t{/* Header — h-72px per FullScreenHeaderContainerHeight */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-2 px-4\"\n\t\t\t\t\t\tstyle={{ height: SearchTokens.heights.fullScreenHeader }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-label=\"Close search\"\n\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tonActiveChange(false);\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{leadingIcon ?? <ArrowBackIcon />}\n\t\t\t\t\t\t\t</IconButton>\n\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={`${searchId}-fs`}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={true}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t<TrailingAction\n\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\ttrailingIcon={trailingIcon}\n\t\t\t\t\t\t\t\tonClear={() => onQueryChange(\"\")}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\n\t\t\t\t\t{/* Divider for \"divided\" styleType */}\n\t\t\t\t\t{styleType === \"divided\" && (\n\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\tclassName=\"border-0 border-t shrink-0\"\n\t\t\t\t\t\t\tstyle={{ borderColor: SEARCH_COLORS.divider }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Results / Suggestions listbox — scrollable area */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={listboxId}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\taria-label={`${ariaLabel} results`}\n\t\t\t\t\t\tclassName=\"flex-1 overflow-y-auto outline-none\"\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\tif (e.target === e.currentTarget) onActiveChange(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\te.target === e.currentTarget &&\n\t\t\t\t\t\t\t\t(e.key === \"Enter\" || e.key === \" \")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tonActiveChange(false);\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\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n\n\treturn createPortal(content, document.body);\n}\n","/**\n * @file search.tsx\n * MD3 Expressive Search — Orchestrator component.\n *\n * Composes SearchBar (collapsed) + SearchView (expanded) into a single\n * developer-facing API. Routes to the correct SearchView variant based on props.\n *\n * Developer usage:\n * ```tsx\n * const [query, setQuery] = useState(\"\");\n * const [active, setActive] = useState(false);\n *\n * <Search\n * query={query}\n * onQueryChange={setQuery}\n * onSearch={(q) => doSearch(q)}\n * active={active}\n * onActiveChange={setActive}\n * variant=\"docked\"\n * styleType=\"contained\"\n * >\n * {results.map((r) => (\n * <div key={r.id} id={`${YOUR_LISTBOX_ID}-option-0`} role=\"option\">\n * {r.label}\n * </div>\n * ))}\n * </Search>\n * ```\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { useSearchKeyboard } from \"./hooks/use-search-keyboard\";\nimport type { SearchProps } from \"./search.types\";\nimport { SearchBar } from \"./search-bar\";\nimport { SearchProvider, useSearch } from \"./search-context\";\nimport { SearchViewDocked } from \"./search-view-docked\";\nimport { SearchViewFullScreen } from \"./search-view-fullscreen\";\n\n/**\n * MD3 Expressive Search — Orchestrator component.\n *\n * Renders a SearchBar (collapsed pill) and the appropriate SearchView\n * (docked popup or fullscreen overlay) based on `variant`.\n *\n * The component is fully controlled:\n * - `active` / `onActiveChange` manage open/close state.\n * - `query` / `onQueryChange` manage input value.\n *\n * Shared `searchId` (React.useId) links SearchBar and SearchView via\n * Framer Motion `layoutId` for seamless animated transitions.\n */\nfunction SearchComponent({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tvariant = \"docked\",\n\tstyleType = \"contained\",\n\thasGap = false,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tchildren,\n\tid,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tclassName,\n\tviewClassName,\n}: SearchProps) {\n\tconst generatedId = React.useId();\n\tconst searchId = id ?? generatedId;\n\tconst listboxId = `${searchId}-listbox`;\n\n\tconst itemCount = React.Children.count(children);\n\n\tconst { activeIndex, handleKeyDown } = useSearchKeyboard({\n\t\tactive,\n\t\tonActiveChange,\n\t\tonSearch,\n\t\tquery,\n\t\titemCount,\n\t});\n\n\tconst sharedProps = {\n\t\tquery,\n\t\tonQueryChange,\n\t\tonSearch,\n\t\tactive,\n\t\tonActiveChange,\n\t\tleadingIcon,\n\t\ttrailingIcon,\n\t\tplaceholder,\n\t\ttextAlign,\n\t\t\"aria-label\": ariaLabel,\n\t\tsearchId,\n\t\tlistboxId,\n\t\tonKeyDown: handleKeyDown,\n\t\tactiveIndex,\n\t} as const;\n\n\treturn (\n\t\t<SearchProvider value={{ activeIndex, listboxId }}>\n\t\t\t<m.div className={className} style={{ minHeight: 56 }}>\n\t\t\t\t<SearchBar {...sharedProps} />\n\t\t\t\t{variant === \"fullscreen\" ? (\n\t\t\t\t\t<SearchViewFullScreen\n\t\t\t\t\t\t{...sharedProps}\n\t\t\t\t\t\tstyleType={styleType}\n\t\t\t\t\t\tviewClassName={viewClassName}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</SearchViewFullScreen>\n\t\t\t\t) : (\n\t\t\t\t\t<SearchViewDocked\n\t\t\t\t\t\t{...sharedProps}\n\t\t\t\t\t\tstyleType={styleType}\n\t\t\t\t\t\thasGap={hasGap}\n\t\t\t\t\t\tviewClassName={viewClassName}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</SearchViewDocked>\n\t\t\t\t)}\n\t\t\t</m.div>\n\t\t</SearchProvider>\n\t);\n}\n\n/** MD3 Expressive Search component with `Search.useSearch` context accessor. */\nexport const Search = Object.assign(SearchComponent, { useSearch });\n","/**\n * @file badge.tsx\n *\n * MD3 Expressive Badge component.\n *\n * - `Badge` → A small status indicator. Can be a dot (no content) or labeled (with content).\n * - `BadgedBox` → Positions a Badge at the top-trailing corner of an anchor element.\n *\n * @remarks\n * Token references (Kotlin source):\n * BadgeTokens — Size=6dp (→ 6px), LargeSize=16dp (→ 16px), Shape=CornerFull, Color=Error,\n * LargeLabelTextFont=LabelSmall, LargeLabelTextColor=OnError\n *\n * BadgedBox offsets:\n * - Small (dot): BadgeOffset = 6dp → translate(50%, -50%)\n * - Large (text): HOffset=12dp, VOffset=14dp → translate(35%, -35%)\n *\n * Architecture:\n * - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes\n * - Animation: Framer Motion (`LazyMotion` + `domMax`) spring mount/unmount\n * - A11y: `role=\"status\"` with `aria-label`, decorative dots use `aria-hidden=\"true\"`\n *\n * @see https://m3.material.io/components/badge/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Exclude onDrag-family event handlers that conflict between React's HTMLAttributes\n// and Framer Motion's MotionProps (different DragEvent signatures).\ntype SafeHTMLSpanAttrs = Omit<\n\tReact.HTMLAttributes<HTMLSpanElement>,\n\t| \"onDrag\"\n\t| \"onDragStart\"\n\t| \"onDragEnd\"\n\t| \"onDragEnter\"\n\t| \"onDragLeave\"\n\t| \"onDragOver\"\n\t| \"onDrop\"\n>;\n\nexport interface BadgeProps extends SafeHTMLSpanAttrs {\n\t/**\n\t * The content to display inside the badge.\n\t * - Omitted / undefined → renders as a small 6×6px dot (decorative).\n\t * - string | number → renders as a large badge (min 16px height) with label.\n\t *\n\t * Numbers exceeding `max` are displayed as `{max}+`.\n\t * Strings longer than 4 characters are truncated to 4.\n\t */\n\tchildren?: React.ReactNode;\n\n\t/**\n\t * Maximum numeric value to display before appending \"+\".\n\t * Only applies when `children` is a number.\n\t * @example max={99} + children={150} → \"99+\"\n\t */\n\tmax?: number;\n\n\t/**\n\t * Override the background (container) color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `error` token — `bg-m3-error`.\n\t */\n\tcontainerColor?: string;\n\n\t/**\n\t * Override the text/content color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `on-error` token — `text-m3-on-error`.\n\t */\n\tcontentColor?: string;\n}\n\nexport interface BadgedBoxProps {\n\t/**\n\t * The badge element to overlay on the anchor.\n\t * Typically a `<Badge />`.\n\t */\n\tbadge: React.ReactNode;\n\n\t/**\n\t * The anchor content that the badge is attached to.\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Additional className applied to the outer wrapper `span`.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Explicitly override size detection for badge positioning.\n\t * - `'small'` → BadgeOffset = 6dp → translate(50%, -50%)\n\t * - `'large'` → HOffset=12dp/VOffset=14dp → translate(35%, -35%)\n\t * When omitted, BadgedBox auto-detects by inspecting `badge` children prop.\n\t */\n\tbadgeSize?: \"small\" | \"large\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction formatBadgeLabel(children: React.ReactNode, max?: number): string {\n\tif (typeof children === \"number\") {\n\t\treturn max !== undefined && children > max ? `${max}+` : String(children);\n\t}\n\tif (typeof children === \"string\") {\n\t\tif (max !== undefined) {\n\t\t\tconst asNum = Number(children);\n\t\t\tif (!Number.isNaN(asNum) && asNum > max) return `${max}+`;\n\t\t}\n\t\treturn children.length > 4 ? children.slice(0, 4) : children;\n\t}\n\treturn \"\";\n}\n\nfunction detectBadgeHasContent(badge: React.ReactNode): boolean {\n\treturn (\n\t\tReact.isValidElement<{ children?: React.ReactNode }>(badge) &&\n\t\tbadge.props.children != null\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Badge\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst BadgeImpl = React.forwardRef<HTMLSpanElement, BadgeProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tmax,\n\t\t\tcontainerColor,\n\t\t\tcontentColor,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst hasContent = children != null;\n\t\tconst label = hasContent ? formatBadgeLabel(children, max) : \"\";\n\t\tconst reducedMotion = useReducedMotion();\n\t\tconst isDecorative = !hasContent && !ariaLabel;\n\n\t\tconst springTransition = reducedMotion\n\t\t\t? { duration: 0 }\n\t\t\t: FAST_SPATIAL_SPRING;\n\n\t\tconst colorStyle: React.CSSProperties = {\n\t\t\t...(containerColor && { backgroundColor: containerColor }),\n\t\t\t...(contentColor && { color: contentColor }),\n\t\t\t...style,\n\t\t};\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.span\n\t\t\t\t\tref={ref}\n\t\t\t\t\trole={isDecorative ? undefined : \"status\"}\n\t\t\t\t\taria-hidden={isDecorative ? \"true\" : undefined}\n\t\t\t\t\taria-label={hasContent ? (ariaLabel ?? label) : ariaLabel}\n\t\t\t\t\tinitial={{ scale: 0, opacity: 0 }}\n\t\t\t\t\tanimate={{ scale: 1, opacity: 1 }}\n\t\t\t\t\texit={{ scale: 0, opacity: 0 }}\n\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-full ring-[1.5px] ring-m3-surface\",\n\t\t\t\t\t\t!containerColor && \"bg-m3-error\",\n\t\t\t\t\t\thasContent\n\t\t\t\t\t\t\t? cn(\n\t\t\t\t\t\t\t\t\t\"inline-flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\t\"min-w-4 h-4 px-1 text-[11px] font-medium leading-none\",\n\t\t\t\t\t\t\t\t\t!contentColor && \"text-m3-on-error\",\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: \"inline-block w-1.5 h-1.5\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={colorStyle}\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: spread safe subset of HTML attrs\n\t\t\t\t\t{...(props as any)}\n\t\t\t\t>\n\t\t\t\t\t{hasContent && label}\n\t\t\t\t</m.span>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nBadgeImpl.displayName = \"Badge\";\n\n/**\n * MD3 Expressive Badge — dynamic status indicator.\n *\n * @example\n * ```tsx\n * // Small dot badge (no content) — decorative\n * <Badge />\n *\n * // Large badge with number (truncated at max)\n * <Badge max={99}>150</Badge>\n * // → displays \"99+\"\n *\n * // Large badge with text label\n * <Badge>NEW</Badge>\n *\n * // Custom colors\n * <Badge containerColor=\"#6750A4\" contentColor=\"#FFFFFF\">3</Badge>\n * ```\n *\n * @see https://m3.material.io/components/badge/overview\n */\nexport const Badge = React.memo(BadgeImpl);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BadgedBox\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 BadgedBox — positions a Badge at the top-trailing corner of an anchor.\n *\n * Implements MD3 offset specs from Badge.kt:\n * - Small badge (dot): `BadgeOffset = 6dp` → translate(50%, -50%)\n * - Large badge (text): `BadgeWithContentHorizontalOffset = 12dp` / `VerticalOffset = 14dp`\n * → translate(35%, -35%)\n *\n * Auto-detects badge size by inspecting the badge element's children prop,\n * or accepts an explicit `badgeSize` override.\n *\n * @example\n * ```tsx\n * // Small dot on mail icon\n * <BadgedBox badge={<Badge />}>\n * <Icon name=\"mail\" />\n * </BadgedBox>\n *\n * // Count badge on notification icon\n * <BadgedBox badge={<Badge max={99}>{count}</Badge>}>\n * <Icon name=\"notifications\" />\n * </BadgedBox>\n * ```\n */\nexport function BadgedBox({\n\tbadge,\n\tchildren,\n\tclassName,\n\tbadgeSize,\n}: BadgedBoxProps) {\n\tconst isLarge = badgeSize\n\t\t? badgeSize === \"large\"\n\t\t: detectBadgeHasContent(badge);\n\n\tconst badgePositionClass = isLarge\n\t\t? \"translate-x-[35%] -translate-y-[35%]\"\n\t\t: \"translate-x-[50%] -translate-y-[50%]\";\n\n\treturn (\n\t\t<span className={cn(\"relative inline-flex\", className)}>\n\t\t\t{children}\n\t\t\t<span\n\t\t\t\tclassName={cn(\"absolute right-0 top-0\", badgePositionClass)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">{badge}</AnimatePresence>\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n","/**\n * @file tabs.tsx\n * MD3 Expressive Tabs — Root context provider and state manager.\n * Implements compound component pattern (similar to Radix UI).\n * Spec: https://m3.material.io/components/tabs/overview\n */\n\nimport { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { TabsContextValue, TabsProps } from \"./tabs.types\";\n\n// ─── Context ───────────────────────────────────────────────────────────────────\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\n/**\n * Hook to consume the Tabs context.\n * Throws if used outside a `<Tabs>` root.\n * @internal\n */\nexport function useTabsContext(): TabsContextValue {\n\tconst ctx = React.useContext(TabsContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"[MD3 Tabs] Component must be used within a <Tabs> root. \" +\n\t\t\t\t\"Ensure <TabsList>, <Tab>, and <TabsContent> are descendants of <Tabs>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n// ─── Tabs Root ─────────────────────────────────────────────────────────────────\n\nconst TabsComponent = React.forwardRef<HTMLDivElement, TabsProps>(\n\t(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue = \"\",\n\t\t\tonValueChange,\n\t\t\tautoActivate = false,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\t// ── State: selected value (controlled + uncontrolled) ──────────────────\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue);\n\t\tconst isControlled = controlledValue !== undefined;\n\t\tconst value = isControlled ? controlledValue : internalValue;\n\n\t\tconst handleValueChange = React.useCallback(\n\t\t\t(newValue: string) => {\n\t\t\t\tif (!isControlled) setInternalValue(newValue);\n\t\t\t\tonValueChange?.(newValue);\n\t\t\t},\n\t\t\t[isControlled, onValueChange],\n\t\t);\n\n\t\t// ── State: keyboard focus (roving tabindex) ────────────────────────────\n\t\t// focusedValue is separate from `value` so focus can move without selecting.\n\t\tconst [focusedValue, setFocusedValue] = React.useState(value);\n\n\t\t// Sync focusedValue when controlled value changes externally\n\t\tReact.useEffect(() => {\n\t\t\tsetFocusedValue(value);\n\t\t}, [value]);\n\n\t\t// ── Registered tabs registry ───────────────────────────────────────────\n\t\t// Tabs register/unregister themselves to enable ArrowKey navigation.\n\t\tconst [tabValues, setTabValues] = React.useState<string[]>([]);\n\n\t\tconst registerTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => {\n\t\t\t\tif (prev.includes(tabValue)) return prev;\n\t\t\t\treturn [...prev, tabValue];\n\t\t\t});\n\t\t}, []);\n\n\t\tconst unregisterTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => prev.filter((v) => v !== tabValue));\n\t\t}, []);\n\n\t\t// ── Auto-select first enabled tab when no defaultValue is provided ─────\n\t\t// Mirrors Google's behavior: if no tab is active, select the first one.\n\t\tconst hasAutoSelected = React.useRef(false);\n\n\t\t// ── Disabled tab tracking ──────────────────────────────────────────────\n\t\tconst [disabledValues, setDisabledValues] = React.useState<Set<string>>(\n\t\t\tnew Set(),\n\t\t);\n\n\t\tconst markTabDisabled = React.useCallback(\n\t\t\t(tabValue: string, disabled: boolean) => {\n\t\t\t\tsetDisabledValues((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tif (disabled) {\n\t\t\t\t\t\tnext.add(tabValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext.delete(tabValue);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\t// Auto-select first enabled tab if no value is set\n\t\tReact.useEffect(() => {\n\t\t\tif (isControlled || hasAutoSelected.current || tabValues.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value && tabValues.includes(value)) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst firstEnabled = tabValues.find((v) => !disabledValues.has(v));\n\t\t\tif (firstEnabled) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\tsetInternalValue(firstEnabled);\n\t\t\t\tsetFocusedValue(firstEnabled);\n\t\t\t}\n\t\t}, [tabValues, disabledValues, isControlled, value]);\n\n\t\t// ── Unique layout group ID for Framer Motion ───────────────────────────\n\t\tconst id = React.useId();\n\t\tconst layoutGroupId = `tabs-${id}`;\n\n\t\t// ── Context value ──────────────────────────────────────────────────────\n\t\tconst contextValue = React.useMemo<TabsContextValue>(\n\t\t\t() => ({\n\t\t\t\tvalue,\n\t\t\t\tonValueChange: handleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\tsetFocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tvalue,\n\t\t\t\thandleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<TabsContext.Provider value={contextValue}>\n\t\t\t\t\t<div ref={ref} className={cn(\"w-full\", className)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</TabsContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nTabsComponent.displayName = \"Tabs\";\n\n/**\n * MD3 Expressive Tabs root component.\n *\n * Manages tab selection state and provides context to all\n * compound sub-components. Supports both controlled and\n * uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Tabs defaultValue=\"flights\">\n * <TabsList variant=\"primary\">\n * <Tab value=\"flights\">Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * </TabsList>\n * <TabsContent value=\"flights\">Flight content</TabsContent>\n * <TabsContent value=\"trips\">Trip content</TabsContent>\n * </Tabs>\n *\n * // Controlled\n * const [tab, setTab] = useState(\"flights\");\n * <Tabs value={tab} onValueChange={setTab}>...</Tabs>\n *\n * // Auto-activate mode (focus = select)\n * <Tabs defaultValue=\"flights\" autoActivate>...</Tabs>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n */\nexport const Tabs = React.memo(TabsComponent);\n\n// ─── TabsListContext ───────────────────────────────────────────────────────────\n\n/**\n * Secondary context carrying variant + scrollable from <TabsList>.\n * Separate from TabsContext so Tabs root doesn't need these props —\n * they belong to the list, not the root.\n * @internal\n */\nexport interface TabsListContextValue {\n\tvariant: \"primary\" | \"secondary\";\n\tscrollable: boolean;\n}\n\nexport const TabsListContext = React.createContext<TabsListContextValue | null>(\n\tnull,\n);\n\n/**\n * Hook to consume TabsList-level context (variant, scrollable).\n * @internal\n */\nexport function useTabsListContext(): TabsListContextValue {\n\tconst ctx = React.useContext(TabsListContext);\n\t// Fallback to sensible defaults instead of throwing, since\n\t// Tab might be rendered without explicit context in tests.\n\treturn ctx ?? { variant: \"primary\", scrollable: false };\n}\n","/**\n * @file tabs.tokens.ts\n * MD3 Expressive Tabs — Design tokens ported from:\n * - PrimaryNavigationTabTokens.kt (v0_162)\n * - SecondaryNavigationTabTokens.kt (v0_162)\n *\n * All dimensional values are in px (dp equivalent for web).\n * @see docs/m3/tabs/PrimaryNavigationTabTokens.kt\n * @see docs/m3/tabs/SecondaryNavigationTabTokens.kt\n */\n\n/**\n * Dimensional design tokens for the MD3 Tabs component.\n *\n * Maps directly from the `.kt` token files to CSS/JS values.\n * Use as the single source of truth for sizing.\n */\nexport const TabsTokens = {\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** ContainerHeight = 48dp (text-only tab) */\n\tcontainerHeight: 48,\n\t/** IconAndLabelTextContainerHeight = 64dp (tab with icon + label stacked) */\n\tcontainerHeightWithIcon: 64,\n\n\t// ── Indicator ─────────────────────────────────────────────────────────────\n\t/** ActiveIndicatorHeight (Primary) = 3dp */\n\tprimaryIndicatorHeight: 3,\n\t/** ActiveIndicatorHeight (Secondary) = 2dp */\n\tsecondaryIndicatorHeight: 2,\n\t/**\n\t * ActiveIndicatorShape = 3dp top-left and top-right (per MD3 token, not a full pill).\n\t * Google reference: `var(--_active-indicator-shape)` resolves to `3px 3px 0 0` effectively.\n\t */\n\tindicatorBorderRadius: \"3px 3px 0 0\",\n\n\t// ── Icon ──────────────────────────────────────────────────────────────────\n\t/** IconSize = 24dp */\n\ticonSize: 24,\n\n\t// ── Scrollable layout ─────────────────────────────────────────────────────\n\t/**\n\t * Edge start/end padding for scrollable mode = 52px.\n\t * Per MD3 spec: tabs have padding on both leading and trailing edges.\n\t */\n\tscrollableEdgePadding: 52,\n\t/** Minimum tab width in scrollable mode = 90px. */\n\tscrollableMinTabWidth: 90,\n\n\t// ── Divider (Secondary only) ───────────────────────────────────────────────\n\t/** DividerHeight = 1dp */\n\tdividerHeight: 1,\n\n\t// ── Focus ring ────────────────────────────────────────────────────────────\n\t/**\n\t * Focus ring border-radius = 8px.\n\t * Google reference: `focus-ring.theme({ shape: 8px })` in _tab.scss.\n\t */\n\tfocusRingBorderRadius: 8,\n} as const;\n\n// ── MD3 Color token references (CSS custom properties) ────────────────────────\n\n/**\n * CSS custom property references for Tabs colors.\n * Maps to `--md-sys-color-*` tokens in the MD3 theme system.\n *\n * DO NOT hardcode hex values — use these references for automatic\n * light/dark theme adaptation.\n */\nexport const TabsColors = {\n\t// ── Primary variant ───────────────────────────────────────────────────────\n\t/** Primary: ActiveLabelTextColor / ActiveIconColor = Primary */\n\tprimaryActiveText: \"var(--md-sys-color-primary)\",\n\t/** Primary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tprimaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Primary: ActiveIndicatorColor = Primary */\n\tprimaryIndicator: \"var(--md-sys-color-primary)\",\n\n\t// ── Secondary variant ─────────────────────────────────────────────────────\n\t/** Secondary: ActiveLabelTextColor / ActiveIconColor = OnSurface */\n\tsecondaryActiveText: \"var(--md-sys-color-on-surface)\",\n\t/** Secondary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tsecondaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Secondary: Indicator color = Primary (same as primary variant) */\n\tsecondaryIndicator: \"var(--md-sys-color-primary)\",\n\t/** Secondary: DividerColor = SurfaceVariant */\n\tdivider: \"var(--md-sys-color-surface-variant)\",\n\n\t// ── Shared ────────────────────────────────────────────────────────────────\n\t/** ContainerColor = Surface */\n\tcontainer: \"var(--md-sys-color-surface)\",\n\t/** Focus ring indicator = Secondary */\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n\n\t// ── State overlays ────────────────────────────────────────────────────────\n\t/** Hover state layer (primary active) */\n\tprimaryActiveHover: \"var(--md-sys-color-primary)\",\n\t/** Hover state layer (inactive, both variants) */\n\tinactiveHover: \"var(--md-sys-color-on-surface)\",\n} as const;\n\n// ── Animation constants ────────────────────────────────────────────────────────\n\n/** Spring transition for the sliding indicator (FastSpatial equivalent). */\nexport const TABS_INDICATOR_SPRING = {\n\ttype: \"spring\",\n\tstiffness: 500,\n\tdamping: 40,\n} as const;\n\n/** Color transition for label/icon color animate (active ↔ inactive). */\nexport const TABS_COLOR_TRANSITION = {\n\tduration: 0.2,\n\tease: \"easeInOut\",\n} as const;\n\n/** Content fade transition when switching tabs. */\nexport const TABS_CONTENT_TRANSITION = {\n\tduration: 0.15,\n\tease: \"easeInOut\",\n} as const;\n","/**\n * @file tab.tsx\n * MD3 Expressive Tab — Individual tab button with Framer Motion indicator.\n *\n * Design decisions:\n * 1. PRIMARY indicator nested inside content wrapper → width = content width (not full button).\n * 2. SECONDARY indicator outside content wrapper → `inset-x-0` = full button width.\n * 3. ROVING TABINDEX (WAI-ARIA): only focused tab has tabIndex=0; ArrowKey moves focus, Enter/Space selects.\n * 4. DISABLED tabs are skipped in ArrowKey navigation.\n * 5. RTL: ArrowLeft/Right directions are swapped when `direction: rtl` is detected.\n * 6. INLINE ICON: icon beside label, height stays 48dp (stacked = 64dp).\n * 7. AUTO-ACTIVATE: when parent `<Tabs autoActivate>`, ArrowKey also selects.\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { BadgedBox } from \"../badge\";\nimport { useTabsContext, useTabsListContext } from \"./tabs\";\nimport {\n\tTABS_COLOR_TRANSITION,\n\tTABS_INDICATOR_SPRING,\n\tTabsColors,\n\tTabsTokens,\n} from \"./tabs.tokens\";\nimport type { TabProps } from \"./tabs.types\";\n\n// ─── Constants ──────────────────────────────────────────────────────────────────\n\n/** Minimum indicator width per MD3 spec (24dp). */\nconst INDICATOR_MIN_WIDTH = 24;\n\n// ─── Tab ───────────────────────────────────────────────────────────────────────\n\nconst TabComponent = React.forwardRef<HTMLButtonElement, TabProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\ticon,\n\t\t\tinlineIcon = false,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tvalue: selectedValue,\n\t\t\tonValueChange,\n\t\t\tfocusedValue,\n\t\t\tsetFocusedValue,\n\t\t\ttabValues,\n\t\t\tregisterTab,\n\t\t\tunregisterTab,\n\t\t\tlayoutGroupId,\n\t\t\tdisabledValues,\n\t\t\tmarkTabDisabled,\n\t\t\tautoActivate,\n\t\t} = useTabsContext();\n\n\t\tconst { variant, scrollable } = useTabsListContext();\n\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst isActive = selectedValue === value;\n\t\tconst isFocused = focusedValue === value;\n\t\tconst hasIcon = icon != null;\n\t\tconst isStackedIcon = hasIcon && !inlineIcon;\n\n\t\t// ── Refs ───────────────────────────────────────────────────────────────\n\t\tconst buttonRef = React.useRef<HTMLButtonElement | null>(null);\n\t\tconst isFirstMount = React.useRef(true);\n\n\t\t// Merge forwarded ref with internal ref\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLButtonElement | null) => {\n\t\t\t\tbuttonRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\t// ── Register/unregister with parent context on mount/unmount ──────────\n\t\tReact.useEffect(() => {\n\t\t\tregisterTab(value);\n\t\t\treturn () => unregisterTab(value);\n\t\t}, [value, registerTab, unregisterTab]);\n\n\t\t// ── Sync disabled state with parent context ────────────────────────────\n\t\tReact.useEffect(() => {\n\t\t\tmarkTabDisabled(value, disabled);\n\t\t\treturn () => markTabDisabled(value, false);\n\t\t}, [value, disabled, markTabDisabled]);\n\n\t\t// ── Keyboard navigation ────────────────────────────────────────────────\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tconst isRtl = buttonRef.current\n\t\t\t\t\t? getComputedStyle(buttonRef.current).direction === \"rtl\"\n\t\t\t\t\t: false;\n\n\t\t\t\tconst enabledValues = tabValues.filter((v) => !disabledValues.has(v));\n\t\t\t\tconst currentIndex = enabledValues.indexOf(value);\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tcase \"ArrowLeft\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst goForward = isRtl\n\t\t\t\t\t\t\t? e.key === \"ArrowLeft\"\n\t\t\t\t\t\t\t: e.key === \"ArrowRight\";\n\t\t\t\t\t\tconst nextIndex = goForward\n\t\t\t\t\t\t\t? (currentIndex + 1) % enabledValues.length\n\t\t\t\t\t\t\t: (currentIndex - 1 + enabledValues.length) %\n\t\t\t\t\t\t\t\tenabledValues.length;\n\t\t\t\t\t\tconst nextValue = enabledValues[nextIndex];\n\t\t\t\t\t\tif (nextValue) {\n\t\t\t\t\t\t\tsetFocusedValue(nextValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(nextValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Home\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst firstValue = enabledValues[0];\n\t\t\t\t\t\tif (firstValue) {\n\t\t\t\t\t\t\tsetFocusedValue(firstValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(firstValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"End\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst lastValue = enabledValues[enabledValues.length - 1];\n\t\t\t\t\t\tif (lastValue) {\n\t\t\t\t\t\t\tsetFocusedValue(lastValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(lastValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Enter\":\n\t\t\t\t\tcase \" \": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (!disabled) onValueChange(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\ttabValues,\n\t\t\t\tdisabledValues,\n\t\t\t\tvalue,\n\t\t\t\tdisabled,\n\t\t\t\tsetFocusedValue,\n\t\t\t\tonValueChange,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\t// Focus DOM node when focusedValue changes via keyboard (skip initial mount)\n\t\tReact.useEffect(() => {\n\t\t\tif (isFirstMount.current) {\n\t\t\t\tisFirstMount.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isFocused && buttonRef.current) {\n\t\t\t\tbuttonRef.current.focus({ preventScroll: true });\n\t\t\t}\n\t\t}, [isFocused]);\n\n\t\t// ── Auto-scroll active tab into view (scrollable mode) ─────────────────\n\t\t// Horizontally scrolls the nearest overflow-x container to reveal the\n\t\t// active tab. Uses scrollTo (not scrollIntoView) to avoid vertical page jumps.\n\t\tReact.useEffect(() => {\n\t\t\tif (!isActive || !scrollable || !buttonRef.current) return;\n\n\t\t\tconst btn = buttonRef.current;\n\t\t\tlet container: HTMLElement | null = btn.parentElement;\n\t\t\twhile (container) {\n\t\t\t\tconst { overflowX } = getComputedStyle(container);\n\t\t\t\tif (overflowX === \"auto\" || overflowX === \"scroll\") break;\n\t\t\t\tcontainer = container.parentElement;\n\t\t\t}\n\t\t\tif (!container) return;\n\n\t\t\tconst btnRect = btn.getBoundingClientRect();\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tconst overflowLeft = containerRect.left - btnRect.left;\n\t\t\tconst overflowRight = btnRect.right - containerRect.right;\n\n\t\t\tif (overflowLeft > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft - overflowLeft,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t} else if (overflowRight > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft + overflowRight,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t}\n\t\t}, [isActive, scrollable]);\n\n\t\t// ── Derived tokens ─────────────────────────────────────────────────────\n\t\tconst containerHeight = isStackedIcon\n\t\t\t? TabsTokens.containerHeightWithIcon\n\t\t\t: TabsTokens.containerHeight;\n\n\t\tconst activeColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryActiveText\n\t\t\t\t: TabsColors.secondaryActiveText;\n\n\t\tconst inactiveColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryInactiveText\n\t\t\t\t: TabsColors.secondaryInactiveText;\n\n\t\tconst indicatorColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryIndicator\n\t\t\t\t: TabsColors.secondaryIndicator;\n\n\t\tconst indicatorLayoutId = `${layoutGroupId}-indicator`;\n\n\t\tconst colorTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_COLOR_TRANSITION;\n\t\tconst springTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_INDICATOR_SPRING;\n\n\t\t// ── IDs for ARIA wiring ────────────────────────────────────────────────\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\t// ── Content wrapper layout ─────────────────────────────────────────────\n\t\t// inlineIcon → flex-row; stacked icon → flex-col gap-0.5; text only → flex-col\n\t\tconst contentFlexClass = inlineIcon\n\t\t\t? \"flex-row gap-2\"\n\t\t\t: isStackedIcon\n\t\t\t\t? \"flex-col gap-0.5\"\n\t\t\t\t: \"flex-col gap-0\";\n\n\t\t// Badge placement\n\t\tconst shouldWrapIconWithBadge = isStackedIcon && badge != null;\n\t\tconst shouldAppendInlineBadge = !isStackedIcon && badge != null;\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={mergedRef}\n\t\t\t\tid={tabId}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"tab\"\n\t\t\t\taria-selected={isActive}\n\t\t\t\taria-controls={panelId}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttabIndex={isFocused ? 0 : -1}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\tonValueChange(value);\n\t\t\t\t\t\tsetFocusedValue(value);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonFocus={() => setFocusedValue(value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center\",\n\t\t\t\t\t\"cursor-pointer select-none\",\n\t\t\t\t\tscrollable ? \"shrink-0\" : \"flex-1\",\n\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\"focus-visible:rounded-lg\",\n\t\t\t\t\t\"rounded-none\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\theight: containerHeight,\n\t\t\t\t\tzIndex: isActive ? 1 : 0,\n\t\t\t\t\t...(scrollable && { minWidth: TabsTokens.scrollableMinTabWidth }),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/*\n\t\t\t\t * Content wrapper — PRIMARY INDICATOR TECHNIQUE:\n\t\t\t\t * Indicator lives inside this wrapper → width matches content (not button).\n\t\t\t\t * inlineIcon: flex-row places icon beside label, height stays 48dp.\n\t\t\t\t */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex h-full items-center justify-center\",\n\t\t\t\t\t\tcontentFlexClass,\n\t\t\t\t\t)}\n\t\t\t\t\tanimate={{ color: isActive ? activeColor : inactiveColor }}\n\t\t\t\t\ttransition={colorTransition}\n\t\t\t\t>\n\t\t\t\t\t{/* Icon (optional) — 24dp per MD3 token */}\n\t\t\t\t\t{hasIcon && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\taria-hidden={!shouldWrapIconWithBadge ? \"true\" : undefined}\n\t\t\t\t\t\t\tclassName={cn(\"flex shrink-0 items-center justify-center\")}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: TabsTokens.iconSize,\n\t\t\t\t\t\t\t\theight: TabsTokens.iconSize,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{shouldWrapIconWithBadge ? (\n\t\t\t\t\t\t\t\t<BadgedBox badge={badge}>\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">{icon}</span>\n\t\t\t\t\t\t\t\t</BadgedBox>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span className=\"size-full\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Label text — TitleSmall per MD3 typography token */}\n\t\t\t\t\t<span className=\"text-title-sm font-medium whitespace-nowrap\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Inline Badge */}\n\t\t\t\t\t{shouldAppendInlineBadge && (\n\t\t\t\t\t\t<span className=\"ml-1 flex items-center justify-center\">\n\t\t\t\t\t\t\t{badge}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/*\n\t\t\t\t\t * PRIMARY INDICATOR\n\t\t\t\t\t * Inside content wrapper → width matches content.\n\t\t\t\t\t * `layoutId` enables shared layout animation across tabs.\n\t\t\t\t\t */}\n\t\t\t\t\t{variant === \"primary\" && isActive && (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-1/2 -translate-x-1/2\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: TabsTokens.primaryIndicatorHeight,\n\t\t\t\t\t\t\t\tminWidth: INDICATOR_MIN_WIDTH,\n\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</m.div>\n\n\t\t\t\t{/*\n\t\t\t\t * SECONDARY INDICATOR\n\t\t\t\t * Outside content wrapper → `inset-x-0` = full button width.\n\t\t\t\t */}\n\t\t\t\t{variant === \"secondary\" && isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"absolute bottom-0 inset-x-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: TabsTokens.secondaryIndicatorHeight,\n\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\n\nTabComponent.displayName = \"Tab\";\n\n/**\n * MD3 Expressive Tab component — individual tab button.\n *\n * Must be a direct child of `<TabsList>`. Implements WAI-ARIA Tabs pattern\n * with roving tabindex keyboard navigation.\n *\n * - **Primary variant**: indicator width = content (text + icon) width.\n * - **Secondary variant**: indicator width = full button hit area.\n * - **Disabled**: Skipped entirely in ArrowKey navigation (cannot be focused).\n * - **inlineIcon**: Icon beside (not above) label; height stays 48dp.\n * - Framer Motion `layoutId` animates indicator with spring physics.\n * - ArrowLeft/Right respect RTL direction automatically.\n *\n * @example\n * ```tsx\n * <Tab value=\"flights\" icon={<Icon name=\"flight\" />}>Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * <Tab value=\"explore\" disabled>Explore</Tab>\n * <Tab value=\"hotels\" icon={<Icon name=\"hotel\" />} inlineIcon>Hotels</Tab>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const Tab = React.memo(TabComponent);\n","/**\n * @file tabs-content.tsx\n * MD3 Expressive TabsContent — Animated panel component.\n *\n * Implements WAI-ARIA tabpanel role with:\n * - AnimatePresence for fade transition on tab switch\n * - Proper aria-labelledby pointing to the associated <Tab>\n * - tabIndex=0 so keyboard users can Tab from the tablist into the panel\n * - Hidden panels are removed from the DOM (not just visually hidden)\n * to prevent screen readers from reading inactive content\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useTabsContext } from \"./tabs\";\nimport { TABS_CONTENT_TRANSITION } from \"./tabs.tokens\";\nimport type { TabsContentProps } from \"./tabs.types\";\n\n// ─── TabsContent ───────────────────────────────────────────────────────────────\n\nconst TabsContentComponent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n\t({ value, className, children }, ref) => {\n\t\tconst { value: selectedValue, layoutGroupId } = useTabsContext();\n\t\tconst isActive = selectedValue === value;\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\t// ARIA wiring: panel is labelled by its corresponding <Tab> button\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\tconst contentTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_CONTENT_TRANSITION;\n\n\t\treturn (\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t{isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tid={panelId}\n\t\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\t\taria-labelledby={tabId}\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"focus:outline-none w-full\",\n\t\t\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={contentTransition}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\n\nTabsContentComponent.displayName = \"TabsContent\";\n\n/**\n * MD3 Expressive TabsContent panel component.\n *\n * Each panel corresponds to a `<Tab>` with the same `value`.\n * Only the active panel is rendered in the DOM — inactive panels\n * are fully unmounted (not `display: none`) to prevent screen readers\n * from reading hidden content.\n *\n * Fade animation is applied on both enter and exit via Framer Motion\n * `AnimatePresence`. We use `mode=\"popLayout\"` to prevent height layout shifting\n * during tab transitions. Animation is automatically disabled when the user\n * has enabled `prefers-reduced-motion`.\n *\n * @example\n * ```tsx\n * <TabsContent value=\"flights\">\n * <p>Available flights...</p>\n * </TabsContent>\n * ```\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const TabsContent = React.memo(TabsContentComponent);\n","/**\n * @file tabs-list.tsx\n * MD3 Expressive TabsList — Container component for tab buttons.\n *\n * Responsibilities:\n * - Applies variant (primary/secondary) layout and styling\n * - Manages horizontal scroll for scrollable mode (52px edge padding per MD3)\n * - Renders the bottom divider for secondary variant\n * - Scopes Framer Motion LayoutGroup so indicators animate correctly\n * when multiple <Tabs> instances are on the same page\n * - Restores focus to activeTab when keyboard focus leaves the tablist\n * (matches Google's `focusout` handler on <md-tabs>)\n */\n\nimport { LayoutGroup } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { TabsListContext, useTabsContext } from \"./tabs\";\nimport { TabsTokens } from \"./tabs.tokens\";\nimport type { TabsListProps } from \"./tabs.types\";\n\n// ─── TabsList ──────────────────────────────────────────────────────────────────\n\nconst TabsListComponent = React.forwardRef<HTMLDivElement, TabsListProps>(\n\t(\n\t\t{\n\t\t\tvariant,\n\t\t\tscrollable = false,\n\t\t\tbackgroundColor,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { layoutGroupId, value, setFocusedValue } = useTabsContext();\n\n\t\t// Unique layout group ID scoped to this TabsList instance.\n\t\tconst listLayoutId = `${layoutGroupId}-list`;\n\n\t\t// ── TabsListContext: provide variant + scrollable to children ──────────\n\t\tconst listContextValue = React.useMemo(\n\t\t\t() => ({ variant, scrollable }),\n\t\t\t[variant, scrollable],\n\t\t);\n\n\t\t// ── Background color ───────────────────────────────────────────────────\n\t\tconst bgColor = backgroundColor ?? \"var(--md-sys-color-surface)\";\n\n\t\t// ── Focusout handler — restore roving focus to active tab ──────────────\n\t\t// When keyboard focus leaves the tablist entirely (e.g. user presses Tab\n\t\t// to move to the panel), reset `focusedValue` back to the selected tab.\n\t\t// This ensures the next time the user Tabs back into the tablist, focus\n\t\t// lands on the active tab — not the last arrow-key-focused tab.\n\t\t// Mirrors Google's `handleFocusout` in tabs.ts:\n\t\t// \"restore focus to selected item when blurring the tab bar\"\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLDivElement>) => {\n\t\t\t\t// `relatedTarget` is the element receiving focus.\n\t\t\t\t// If it's still inside the tablist, this is an internal focus move\n\t\t\t\t// (e.g. clicking another tab) — don't restore.\n\t\t\t\tconst listEl = e.currentTarget;\n\t\t\t\tif (listEl.contains(e.relatedTarget as Node | null)) return;\n\n\t\t\t\t// Focus left the tablist — restore focusedValue to the active tab.\n\t\t\t\tsetFocusedValue(value);\n\t\t\t},\n\t\t\t[value, setFocusedValue],\n\t\t);\n\n\t\treturn (\n\t\t\t<TabsListContext.Provider value={listContextValue}>\n\t\t\t\t{/* LayoutGroup scopes shared layout animation so indicators from different Tabs instances don't bleed into each other. */}\n\t\t\t\t<LayoutGroup id={listLayoutId}>\n\t\t\t\t\t{/* Outer wrapper: positioning context for the secondary divider */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\t\t\tstyle={{ backgroundColor: bgColor }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-row items-stretch\",\n\t\t\t\t\t\t\t\tscrollable &&\n\t\t\t\t\t\t\t\t\t\"overflow-x-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tscrollable\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Secondary variant: bottom divider — absolute so it doesn't affect tab layout flow */}\n\t\t\t\t\t\t{variant === \"secondary\" && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-0 right-0\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\theight: TabsTokens.dividerHeight,\n\t\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-surface-variant)\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</LayoutGroup>\n\t\t\t</TabsListContext.Provider>\n\t\t);\n\t},\n);\n\nTabsListComponent.displayName = \"TabsList\";\n\n/**\n * MD3 Expressive TabsList container component.\n *\n * Renders a horizontal row of `<Tab>` components with MD3-compliant\n * layout (fixed or scrollable) and variant styling (primary or secondary).\n *\n * - **Primary**: Tabs divide available width equally, indicator width = content width.\n * - **Secondary**: Tabs divide equally + full-width indicator + bottom divider line.\n * - **Scrollable**: Tabs have min-width (90px), scroll horizontally with 52px edge padding.\n * - **Focusout**: When focus leaves the tablist, roving focus resets to the active tab.\n *\n * @example\n * ```tsx\n * <TabsList variant=\"primary\" scrollable={false}>\n * <Tab value=\"tab1\">Tab 1</Tab>\n * <Tab value=\"tab2\">Tab 2</Tab>\n * </TabsList>\n *\n * <TabsList variant=\"secondary\" scrollable={true} aria-label=\"Content sections\">\n * <Tab value=\"a\">Alpha</Tab>\n * <Tab value=\"b\">Beta</Tab>\n * </TabsList>\n * ```\n */\nexport const TabsList = React.memo(TabsListComponent);\n","/**\n * Color configuration types and standard values for the FloatingToolbar component.\n * Maps MD3 design tokens to CSS custom properties used in Tailwind CSS.\n */\n\n/**\n * Color configuration types and standard values for the FloatingToolbar component.\n * Maps MD3 design tokens to CSS custom properties used in Tailwind CSS.\n */\n\nexport type ToolbarVariant =\n\t| \"standard\"\n\t| \"vibrant\"\n\t| \"surface-high\"\n\t| \"surface-highest\"\n\t| \"tertiary\"\n\t| \"xr\";\n\nexport interface FloatingToolbarColors {\n\t/** The background color of the toolbar container */\n\ttoolbarContainerColor?: string;\n\t/** The color of the content (icons, text) inside the toolbar */\n\ttoolbarContentColor?: string;\n\t/** The background color of the FAB container */\n\tfabContainerColor?: string;\n\t/** The color of the content inside the FAB */\n\tfabContentColor?: string;\n}\n\n/**\n * Standard color configuration for the floating toolbar.\n * Uses surface container for the toolbar and secondary container for the FAB.\n */\nexport const standardFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-surface-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n};\n\n/**\n * Vibrant color configuration for the floating toolbar.\n * Uses primary container for the toolbar and tertiary container for the FAB.\n */\nexport const vibrantFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-primary-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-primary-container)\",\n\tfabContainerColor: \"var(--md-sys-color-tertiary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-tertiary-container)\",\n};\n\n/**\n * Surface Container High color configuration for the toolbar (XR / Elevated).\n */\nexport const surfaceContainerHighFloatingToolbarColors: FloatingToolbarColors =\n\t{\n\t\ttoolbarContainerColor: \"var(--md-sys-color-surface-container-high)\",\n\t\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\t\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\t\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n\t};\n\n/**\n * Surface Container Highest color configuration for the toolbar (XR / Elevated).\n */\nexport const surfaceContainerHighestFloatingToolbarColors: FloatingToolbarColors =\n\t{\n\t\ttoolbarContainerColor: \"var(--md-sys-color-surface-container-highest)\",\n\t\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\t\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\t\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n\t};\n\n/**\n * Tertiary Container color configuration for the toolbar.\n */\nexport const tertiaryContainerFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-tertiary-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-tertiary-container)\",\n\tfabContainerColor: \"var(--md-sys-color-primary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-primary-container)\",\n};\n\n/**\n * XR Glassmorphic color configuration for the toolbar.\n * Uses semi-transparent surface container high with backdrop blur.\n */\nexport const xrFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor:\n\t\t\"color-mix(in srgb, var(--md-sys-color-surface-container-high) 80%, transparent)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\tfabContainerColor:\n\t\t\"color-mix(in srgb, var(--md-sys-color-secondary-container) 85%, transparent)\",\n\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n};\n\n/**\n * Helper function to resolve FloatingToolbarColors based on variant prop or custom override.\n */\nexport function getToolbarColors(\n\tvariant: ToolbarVariant = \"standard\",\n\tcustomColors?: FloatingToolbarColors,\n): FloatingToolbarColors {\n\tif (customColors) return customColors;\n\n\tswitch (variant) {\n\t\tcase \"vibrant\":\n\t\t\treturn vibrantFloatingToolbarColors;\n\t\tcase \"surface-high\":\n\t\t\treturn surfaceContainerHighFloatingToolbarColors;\n\t\tcase \"surface-highest\":\n\t\t\treturn surfaceContainerHighestFloatingToolbarColors;\n\t\tcase \"tertiary\":\n\t\t\treturn tertiaryContainerFloatingToolbarColors;\n\t\tcase \"xr\":\n\t\t\treturn xrFloatingToolbarColors;\n\t\tdefault:\n\t\t\treturn standardFloatingToolbarColors;\n\t}\n}\n","import * as React from \"react\";\n\nexport interface ToolbarContextValue {\n\torientation: \"horizontal\" | \"vertical\";\n\titemClassName?: string;\n}\n\nexport const ToolbarContext = React.createContext<ToolbarContextValue | null>(\n\tnull,\n);\n\nexport function useToolbarContext() {\n\treturn React.useContext(ToolbarContext);\n}\n","import { m, useMotionValueEvent, useScroll } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarColors,\n\tgetToolbarColors,\n\ttype ToolbarVariant,\n} from \"./toolbar-colors\";\nimport { ToolbarContext } from \"./toolbar-context\";\n\nexport interface BottomDockedToolbarProps {\n\t/** Color variant: standard, vibrant, surface-high, surface-highest, tertiary, or xr */\n\tvariant?: ToolbarVariant;\n\t/** Custom colors override */\n\tcolors?: FloatingToolbarColors;\n\t/** Whether to hide on scroll */\n\thideOnScroll?: boolean;\n\t/** Scroll container ref for scroll behavior (if empty, uses window scroll) */\n\tscrollContainerRef?: React.RefObject<HTMLElement | null>;\n\t/** Start content (left-aligned) */\n\tstartContent?: React.ReactNode;\n\t/** End content (right-aligned) */\n\tendContent?: React.ReactNode;\n\t/** Center content */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Horizontal padding (px) applied to the toolbar container.\n\t * MD3 spec requires a minimum of 16dp on leading and trailing edges.\n\t * @default 16\n\t */\n\tpaddingX?: number;\n\t/**\n\t * Layout distribution of toolbar content.\n\t * - `\"between\"` – leading/center/trailing spread across full width (default, compact screens).\n\t * - `\"center\"` – all content centered; ideal for medium+ screen widths.\n\t * - `\"end-weighted\"` – key action is centered while others are pushed to the edges.\n\t * @default \"between\"\n\t */\n\tjustify?: \"between\" | \"center\" | \"end-weighted\";\n\t/**\n\t * Container shape.\n\t * - `\"none\"` – straight corners (MD3 default for mobile docked toolbars).\n\t * - `\"large\"` – large rounded corners (recommended for web / large screens).\n\t * - `\"full\"` – fully pill-shaped.\n\t *\n\t * MD3 guideline: *\"On web and large screens, the docked toolbar can be rounded.\"*\n\t * @default \"none\"\n\t */\n\tshape?: \"none\" | \"large\" | \"full\";\n\tclassName?: string;\n\t\"aria-label\"?: string;\n}\n\n/**\n * A full-width docked toolbar typically fixed at the bottom of the screen.\n * Replaces the deprecated Bottom App Bar in MD3 Expressive.\n *\n * @example\n * ```tsx\n * <BottomDockedToolbar hideOnScroll startContent={<IconButton aria-label=\"Menu\"><Icon name=\"menu\" /></IconButton>}>\n * <div className=\"flex gap-2\">\n * <IconButton aria-label=\"Search\"><Icon name=\"search\" /></IconButton>\n * <IconButton aria-label=\"Edit\"><Icon name=\"edit\" /></IconButton>\n * </div>\n * </BottomDockedToolbar>\n * ```\n */\nexport const BottomDockedToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tBottomDockedToolbarProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\thideOnScroll = false,\n\t\t\tscrollContainerRef,\n\t\t\tstartContent,\n\t\t\tendContent,\n\t\t\tchildren,\n\t\t\tpaddingX = 16,\n\t\t\tjustify = \"between\",\n\t\t\tshape = \"none\",\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\n\t\tconst { scrollY } = useScroll(\n\t\t\tscrollContainerRef ? { container: scrollContainerRef } : undefined,\n\t\t);\n\n\t\tconst [isHidden, setIsHidden] = React.useState(false);\n\t\tconst lastScrollY = React.useRef(0);\n\n\t\tuseMotionValueEvent(scrollY, \"change\", (latest) => {\n\t\t\tif (!hideOnScroll) return;\n\n\t\t\tconst diff = latest - lastScrollY.current;\n\n\t\t\tif (latest <= 0) {\n\t\t\t\tsetIsHidden(false);\n\t\t\t\tlastScrollY.current = 0;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (Math.abs(diff) > 10) {\n\t\t\t\tsetIsHidden(diff > 0);\n\t\t\t\tlastScrollY.current = latest;\n\t\t\t}\n\t\t});\n\n\t\tconst cssVars = {\n\t\t\t\"--toolbar-bg\": colors.toolbarContainerColor,\n\t\t\t\"--toolbar-color\": colors.toolbarContentColor,\n\t\t} as React.CSSProperties;\n\n\t\tconst SHAPE_CLASSES = {\n\t\t\tnone: \"\",\n\t\t\tlarge: \"rounded-2xl\",\n\t\t\tfull: \"rounded-full\",\n\t\t};\n\n\t\tconst justifyClass =\n\t\t\tjustify === \"center\" ? \"justify-center gap-4\" : \"justify-between\";\n\n\t\tconst isXr = variant === \"xr\";\n\n\t\treturn (\n\t\t\t<ToolbarContext.Provider value={{ orientation: \"horizontal\" }}>\n\t\t\t\t<m.div\n\t\t\t\t\tref={ref}\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\taria-label={ariaLabel || \"Bottom Docked Toolbar\"}\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\ty: isHidden ? \"100%\" : \"0%\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...cssVars,\n\t\t\t\t\t\tbackgroundColor: \"var(--toolbar-bg)\",\n\t\t\t\t\t\tcolor: \"var(--toolbar-color)\",\n\t\t\t\t\t\t// Apply safe area inset for mobile bottom indicators\n\t\t\t\t\t\tpaddingBottom: \"env(safe-area-inset-bottom, 0px)\",\n\t\t\t\t\t\tpaddingLeft: paddingX,\n\t\t\t\t\t\tpaddingRight: paddingX,\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed bottom-0 left-0 right-0 w-full z-40 text-(--toolbar-color) [&_.text-m3-on-surface-variant]:text-current\",\n\t\t\t\t\t\t\"flex items-center h-16\",\n\t\t\t\t\t\tjustifyClass,\n\t\t\t\t\t\tSHAPE_CLASSES[shape],\n\t\t\t\t\t\tisXr\n\t\t\t\t\t\t\t? \"backdrop-blur-md border-t border-white/10 shadow-lg\"\n\t\t\t\t\t\t\t: \"shadow-[0_-1px_3px_rgba(0,0,0,0.1)]\",\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center justify-start flex-1 shrink-0\">\n\t\t\t\t\t\t{startContent}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t\tjustify === \"center\" ? \"gap-1\" : \"flex-1 shrink-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex items-center justify-end flex-1 shrink-0\">\n\t\t\t\t\t\t{endContent}\n\t\t\t\t\t</div>\n\t\t\t\t</m.div>\n\t\t\t</ToolbarContext.Provider>\n\t\t);\n\t},\n);\nBottomDockedToolbar.displayName = \"BottomDockedToolbar\";\n","/**\n * Design tokens for the MD3 Expressive Toolbars components.\n * Extracted from `FloatingToolbarTokens.kt` and `FabBaselineTokens.kt`.\n */\n\nexport const FloatingToolbarTokens = {\n\tContainerBetweenSpace: 4,\n\tContainerExternalPadding: 16,\n\tContainerHeight: 64,\n\tContainerLeadingSpace: 8,\n\tContainerShape: \"full\",\n\tContainerTrailingSpace: 8,\n\tVerticalContainerExternalPadding: 24,\n} as const;\n\nexport const FabBaselineTokens = {\n\tContainerHeight: 56,\n\tContainerWidth: 56,\n\tMediumContainerHeight: 80,\n\tMediumContainerWidth: 80,\n\tIconSize: 24,\n\tMediumIconSize: 28,\n} as const;\n\nexport const ToolbarToFabGap = 8;\n\n/**\n * Design tokens for the ToolbarDivider component.\n * The divider is a decorative separator used to group toolbar actions.\n */\nexport const ToolbarDividerTokens = {\n\t/** Divider line thickness in px */\n\tThickness: 1,\n\t/** Divider size as a fraction of the toolbar container dimension */\n\tHeightRatio: 0.5,\n} as const;\n\n/**\n * Design tokens for the ToolbarIconButton component.\n * Sizes follow MD3 Expressive touch-target minimums (48dp height always).\n * - narrow: de-emphasised secondary actions\n * - default: standard icon button\n * - wide: primary action emphasis inside the toolbar\n */\nexport const ToolbarIconButtonTokens = {\n\tNarrowWidth: 40,\n\tDefaultWidth: 48,\n\tWideWidth: 64,\n\t/** Minimum touch-target height per MD3 accessibility guidelines */\n\tHeight: 48,\n\t/** Icon size in dp — larger than standard 24dp to fill the 48dp button properly */\n\tIconSize: 28,\n} as const;\n\n/**\n * Design tokens for the ToolbarToggleButton component.\n * Follows MD3 Expressive 'Button toggleable' building block specifications.\n */\nexport const ToolbarToggleButtonTokens = {\n\tHeight: 48,\n\tMinWidth: 95,\n\tIconSize: 24,\n\tPaddingX: 16,\n\tGap: 8,\n} as const;\n","import { AnimatePresence, m, type Variants } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarColors,\n\tgetToolbarColors,\n\ttype ToolbarVariant,\n} from \"./toolbar-colors\";\nimport { ToolbarContext } from \"./toolbar-context\";\nimport type { FloatingToolbarScrollBehavior } from \"./toolbar-scroll-behavior\";\nimport { FloatingToolbarTokens } from \"./toolbar-tokens\";\n\nexport interface FloatingToolbarProps {\n\t/** Whether the toolbar is expanded, showing startContent and endContent */\n\texpanded: boolean;\n\t/** Orientation of the toolbar */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/** Color variant: standard, vibrant, surface-high, surface-highest, tertiary, or xr */\n\tvariant?: ToolbarVariant;\n\t/** Color configuration override */\n\tcolors?: FloatingToolbarColors;\n\t/** Shape variant: full = pill shape (default), large = large rounded */\n\tshape?: \"full\" | \"large\";\n\t/** Padding inside toolbar container */\n\tcontentPadding?: React.CSSProperties | string;\n\t/** Scroll behavior hook result */\n\tscrollBehavior?: FloatingToolbarScrollBehavior;\n\t/** Start content (shown when expanded, usually on the left/top) */\n\tstartContent?: React.ReactNode;\n\t/** End content (shown when expanded, usually on the right/bottom) */\n\tendContent?: React.ReactNode;\n\t/** Main toolbar content (always visible) */\n\tchildren: React.ReactNode;\n\t/** Whether to disable the internal scroll translation (useful when parent handles it) */\n\tdisableScrollTranslation?: boolean;\n\t/** Whether to disable layout animation (useful when nested inside FloatingToolbarWithFab) */\n\tdisableLayoutAnimation?: boolean;\n\t/**\n\t * Gap (px) between items in the center children slot.\n\t * Corresponds to MD3 `ContainerBetweenSpace` token (4dp default).\n\t * @default 4\n\t */\n\titemGap?: number;\n\t/** Alignment (justify-content) of the center children slot */\n\tchildrenAlignment?: \"start\" | \"center\" | \"end\";\n\t/** Custom CSS class applied to each child item in the toolbar slots */\n\titemClassName?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\t\"aria-label\"?: string;\n}\n\n// --- Module-level helpers ---\n\nconst ALIGNMENT_CLASS: Record<\"start\" | \"center\" | \"end\", string> = {\n\tstart: \"justify-start\",\n\tcenter: \"justify-center\",\n\tend: \"justify-end\",\n};\n\nfunction resolveScrollTranslation(\n\tscrollBehavior: FloatingToolbarScrollBehavior | undefined,\n\tdisabled: boolean | undefined,\n): { x: number | string; y: number | string } {\n\tif (!scrollBehavior || disabled) return { x: 0, y: 0 };\n\tconst { offset, exitDirection } = scrollBehavior;\n\tconst percent = offset * -100;\n\tswitch (exitDirection) {\n\t\tcase \"top\":\n\t\t\treturn { y: `${-percent}%`, x: 0 };\n\t\tcase \"bottom\":\n\t\t\treturn { y: `${percent}%`, x: 0 };\n\t\tcase \"start\":\n\t\t\treturn { x: `${-percent}%`, y: 0 };\n\t\tcase \"end\":\n\t\t\treturn { x: `${percent}%`, y: 0 };\n\t\tdefault:\n\t\t\treturn { x: 0, y: 0 };\n\t}\n}\n\nfunction buildSlotVariants(\n\txHidden: string | number,\n\tyHidden: string | number,\n\tisHorizontal: boolean,\n): Variants {\n\treturn {\n\t\thidden: {\n\t\t\tx: xHidden,\n\t\t\ty: yHidden,\n\t\t\topacity: 0,\n\t\t\tscale: 0.9,\n\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\theight: isHorizontal ? \"auto\" : 0,\n\t\t\ttransition: SPRING_TRANSITION,\n\t\t},\n\t\tvisible: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\topacity: 1,\n\t\t\tscale: 1,\n\t\t\twidth: \"auto\",\n\t\t\theight: \"auto\",\n\t\t\ttransition: SPRING_TRANSITION,\n\t\t},\n\t};\n}\n\nfunction applyItemClassName(\n\tnodes: React.ReactNode,\n\titemClassName: string,\n): React.ReactNode {\n\treturn React.Children.map(nodes, (child) => {\n\t\tif (!React.isValidElement(child)) return child;\n\t\tconst element = child as React.ReactElement<{ className?: string }>;\n\t\treturn React.cloneElement(element, {\n\t\t\tclassName: cn(element.props.className, itemClassName),\n\t\t});\n\t});\n}\n\n// --- Component ---\n\n/**\n * Internal component for rendering the toolbar logic.\n * Consumers should use HorizontalFloatingToolbar or VerticalFloatingToolbar.\n */\nconst FloatingToolbarBase = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarProps\n>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\torientation = \"horizontal\",\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\tshape = \"full\",\n\t\t\tcontentPadding,\n\t\t\tscrollBehavior,\n\t\t\tstartContent,\n\t\t\tendContent,\n\t\t\tchildren,\n\t\t\tdisableScrollTranslation,\n\t\t\tdisableLayoutAnimation,\n\t\t\titemGap = FloatingToolbarTokens.ContainerBetweenSpace,\n\t\t\tchildrenAlignment = \"center\",\n\t\t\titemClassName,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\t\tconst isHorizontal = orientation === \"horizontal\";\n\t\tconst isStringPadding = typeof contentPadding === \"string\";\n\n\t\tconst cssVars = {\n\t\t\t\"--toolbar-bg\": colors.toolbarContainerColor,\n\t\t\t\"--toolbar-color\": colors.toolbarContentColor,\n\t\t\t\"--toolbar-size\": `${FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t...(isStringPadding ? {} : contentPadding),\n\t\t\t...style,\n\t\t} as React.CSSProperties;\n\n\t\tconst isScrolledOff = scrollBehavior && scrollBehavior.offset < 0;\n\t\tconst isXr = variant === \"xr\";\n\t\tconst shadowClass = isXr\n\t\t\t? \"shadow-lg border border-white/10 backdrop-blur-md\"\n\t\t\t: expanded\n\t\t\t\t? \"shadow-md\"\n\t\t\t\t: \"shadow-sm\";\n\t\tconst containerShapeClass =\n\t\t\tshape === \"full\" ? \"rounded-full\" : \"rounded-2xl\";\n\n\t\tconst leadingVariants = buildSlotVariants(\n\t\t\tisHorizontal ? \"-100%\" : 0,\n\t\t\tisHorizontal ? 0 : \"100%\",\n\t\t\tisHorizontal,\n\t\t);\n\t\tconst trailingVariants = buildSlotVariants(\n\t\t\tisHorizontal ? \"100%\" : 0,\n\t\t\tisHorizontal ? 0 : \"-100%\",\n\t\t\tisHorizontal,\n\t\t);\n\n\t\tconst processNodes = (nodes: React.ReactNode) =>\n\t\t\titemClassName ? applyItemClassName(nodes, itemClassName) : nodes;\n\n\t\tconst scrollTranslation = resolveScrollTranslation(\n\t\t\tscrollBehavior,\n\t\t\tdisableScrollTranslation,\n\t\t);\n\n\t\treturn (\n\t\t\t<ToolbarContext.Provider value={{ orientation, itemClassName }}>\n\t\t\t\t<m.div\n\t\t\t\t\tref={ref}\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={scrollTranslation}\n\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\taria-label={ariaLabel || \"Floating Toolbar\"}\n\t\t\t\t\t\taria-orientation={orientation}\n\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\tinert={isScrolledOff ? true : undefined}\n\t\t\t\t\t\t{...(disableLayoutAnimation ? {} : { layout: \"position\" as const })}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...cssVars,\n\t\t\t\t\t\t\tbackgroundColor: \"var(--toolbar-bg)\",\n\t\t\t\t\t\t\tcolor: \"var(--toolbar-color)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex pointer-events-auto relative text-(--toolbar-color) [&_.text-m3-on-surface-variant]:text-current\",\n\t\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t\t? \"max-w-[min(90vw,100%)] h-(--toolbar-size)\"\n\t\t\t\t\t\t\t\t: \"max-h-[min(90vh,100%)] w-(--toolbar-size) h-fit\",\n\t\t\t\t\t\t\tcontainerShapeClass,\n\t\t\t\t\t\t\tshadowClass,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex-1 w-full h-full rounded-[inherit] scrollbar-hide\",\n\t\t\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t\t\t? \"overflow-x-auto overflow-y-visible\"\n\t\t\t\t\t\t\t\t\t: \"overflow-y-auto overflow-x-visible\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center min-w-0 min-h-0\",\n\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row h-full\" : \"flex-col w-full\",\n\t\t\t\t\t\t\t\t\tisStringPadding\n\t\t\t\t\t\t\t\t\t\t? contentPadding\n\t\t\t\t\t\t\t\t\t\t: isHorizontal\n\t\t\t\t\t\t\t\t\t\t\t? \"px-2\"\n\t\t\t\t\t\t\t\t\t\t\t: \"py-2\",\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\tgap: itemGap,\n\t\t\t\t\t\t\t\t\t...(isStringPadding ? {} : contentPadding),\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<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{expanded && startContent && (\n\t\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\t\tkey=\"start\"\n\t\t\t\t\t\t\t\t\t\t\tvariants={leadingVariants}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex shrink-0 items-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{processNodes(startContent)}\n\t\t\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex flex-1 items-center min-w-0 min-h-0 h-full\",\n\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\tALIGNMENT_CLASS[childrenAlignment],\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{processNodes(children)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{expanded && endContent && (\n\t\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\t\tkey=\"end\"\n\t\t\t\t\t\t\t\t\t\t\tvariants={trailingVariants}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex shrink-0 items-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{processNodes(endContent)}\n\t\t\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</m.div>\n\t\t\t</ToolbarContext.Provider>\n\t\t);\n\t},\n);\nFloatingToolbarBase.displayName = \"FloatingToolbarBase\";\n\n/**\n * A horizontal floating toolbar that displays navigation and key actions.\n * It can be positioned anywhere on the screen and floats over the rest of the content.\n *\n * @example\n * ```tsx\n * const [expanded, setExpanded] = useState(true);\n * const scrollBehavior = useFloatingToolbarScrollBehavior({ exitDirection: 'bottom' });\n *\n * <HorizontalFloatingToolbar\n * expanded={expanded}\n * scrollBehavior={scrollBehavior}\n * startContent={<IconButton icon=\"undo\" />}\n * endContent={<IconButton icon=\"redo\" />}\n * >\n * <IconButton icon=\"bold\" />\n * <IconButton icon=\"italic\" />\n * </HorizontalFloatingToolbar>\n * ```\n *\n * @see https://m3.material.io/components/toolbars/guidelines\n */\nexport const HorizontalFloatingToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tOmit<FloatingToolbarProps, \"orientation\">\n>((props, ref) => (\n\t<FloatingToolbarBase ref={ref} orientation=\"horizontal\" {...props} />\n));\nHorizontalFloatingToolbar.displayName = \"HorizontalFloatingToolbar\";\n\n/**\n * A vertical floating toolbar that displays navigation and key actions.\n * It floats over the rest of the content.\n *\n * @example\n * ```tsx\n * <VerticalFloatingToolbar expanded={true}>\n * <IconButton icon=\"bold\" />\n * </VerticalFloatingToolbar>\n * ```\n */\nexport const VerticalFloatingToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tOmit<FloatingToolbarProps, \"orientation\">\n>((props, ref) => (\n\t<FloatingToolbarBase ref={ref} orientation=\"vertical\" {...props} />\n));\nVerticalFloatingToolbar.displayName = \"VerticalFloatingToolbar\";\n","import { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarProps,\n\tHorizontalFloatingToolbar,\n\tVerticalFloatingToolbar,\n} from \"./floating-toolbar\";\nimport { getToolbarColors } from \"./toolbar-colors\";\nimport {\n\tFabBaselineTokens,\n\tFloatingToolbarTokens,\n\tToolbarToFabGap,\n} from \"./toolbar-tokens\";\n\nexport interface FloatingToolbarWithFabProps extends FloatingToolbarProps {\n\t/** FAB element (use FAB component or custom node) */\n\tfloatingActionButton: React.ReactNode;\n\t/** FAB position for horizontal: 'start' | 'end'. For vertical: 'top' | 'bottom' */\n\tfabPosition?: \"start\" | \"end\" | \"top\" | \"bottom\";\n\t/** Animation duration override */\n\tanimationDuration?: number;\n\t/** Start content (explicitly declared to resolve type issues) */\n\tstartContent?: React.ReactNode;\n\t/** End content (explicitly declared to resolve type issues) */\n\tendContent?: React.ReactNode;\n\t/**\n\t * Size of the FAB container.\n\t * - `\"default\"` → 56×56px (`FabBaselineTokens.ContainerHeight`)\n\t * - `\"medium\"` → 80×80px (`FabBaselineTokens.MediumContainerHeight`)\n\t *\n\t * MD3: pair a medium FAB with the toolbar to give it greater visual prominence.\n\t * @default \"default\"\n\t */\n\tfabSize?: \"default\" | \"medium\";\n}\n\nconst FloatingToolbarWithFabBase = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\torientation = \"horizontal\",\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\tfloatingActionButton,\n\t\t\tfabPosition = orientation === \"horizontal\" ? \"end\" : \"bottom\",\n\t\t\tanimationDuration = 0.3,\n\t\t\tscrollBehavior,\n\t\t\tfabSize = \"default\",\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\n\t\tconst isHorizontal = orientation === \"horizontal\";\n\n\t\tconst effectiveExpanded =\n\t\t\texpanded && (!scrollBehavior || scrollBehavior.isExpanded);\n\n\t\tconst isFabBefore = fabPosition === \"start\" || fabPosition === \"top\";\n\n\t\tconst resolvedFabSize =\n\t\t\tfabSize === \"medium\"\n\t\t\t\t? FabBaselineTokens.MediumContainerHeight\n\t\t\t\t: FabBaselineTokens.ContainerHeight;\n\n\t\tconst transitionSpec = {\n\t\t\t...SPRING_TRANSITION,\n\t\t\tduration: animationDuration,\n\t\t};\n\n\t\tconst SHADOW_PADDING = 24;\n\n\t\tconst fabContainerNode = (\n\t\t\t<m.div\n\t\t\t\tlayout\n\t\t\t\tkey=\"fab-container\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: `${resolvedFabSize}px`,\n\t\t\t\t\theight: `${resolvedFabSize}px`,\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center justify-center relative z-10\",\n\t\t\t\t\t\"*:w-full *:h-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{floatingActionButton}\n\t\t\t</m.div>\n\t\t);\n\n\t\treturn (\n\t\t\t<div ref={ref} style={style}>\n\t\t\t\t<m.div\n\t\t\t\t\tlayout\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\tgap: effectiveExpanded ? `${ToolbarToFabGap}px` : \"0px\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={transitionSpec}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center pointer-events-auto\",\n\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t? \"flex-row h-(--toolbar-size)\"\n\t\t\t\t\t\t\t: \"flex-col w-(--toolbar-size) h-fit\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--fab-size\": `${resolvedFabSize}px`,\n\t\t\t\t\t\t\t\"--toolbar-size\": `${FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFabBefore && fabContainerNode}\n\n\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t{effectiveExpanded && (\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tkey=\"toolbar-content-wrapper\"\n\t\t\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t\t\tscale: 0.9,\n\t\t\t\t\t\t\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t\theight: !isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tscale: 1,\n\t\t\t\t\t\t\t\t\twidth: \"auto\",\n\t\t\t\t\t\t\t\t\theight: \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\texit={{\n\t\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t\t\tscale: 0.9,\n\t\t\t\t\t\t\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t\theight: !isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={transitionSpec}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tpadding: SHADOW_PADDING,\n\t\t\t\t\t\t\t\t\tmargin: -SHADOW_PADDING,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center shrink-0 min-w-0 min-h-0 overflow-hidden relative z-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isHorizontal ? (\n\t\t\t\t\t\t\t\t\t<HorizontalFloatingToolbar\n\t\t\t\t\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\t\t\t\t\tcolors={colors}\n\t\t\t\t\t\t\t\t\t\tdisableScrollTranslation\n\t\t\t\t\t\t\t\t\t\tdisableLayoutAnimation\n\t\t\t\t\t\t\t\t\t\tclassName={className ? cn(\"h-full\", className) : undefined}\n\t\t\t\t\t\t\t\t\t\t{...props}\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<VerticalFloatingToolbar\n\t\t\t\t\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\t\t\t\t\tcolors={colors}\n\t\t\t\t\t\t\t\t\t\tdisableScrollTranslation\n\t\t\t\t\t\t\t\t\t\tdisableLayoutAnimation\n\t\t\t\t\t\t\t\t\t\tclassName={className ? cn(\"w-full\", className) : undefined}\n\t\t\t\t\t\t\t\t\t\t{...props}\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.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t{!isFabBefore && fabContainerNode}\n\t\t\t\t</m.div>\n\t\t\t</div>\n\t\t);\n\t},\n);\nFloatingToolbarWithFabBase.displayName = \"FloatingToolbarWithFabBase\";\n\n/**\n * A horizontal floating toolbar paired with a FAB.\n */\nexport const HorizontalFloatingToolbarWithFab = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>((props, ref) => (\n\t<FloatingToolbarWithFabBase ref={ref} orientation=\"horizontal\" {...props} />\n));\nHorizontalFloatingToolbarWithFab.displayName =\n\t\"HorizontalFloatingToolbarWithFab\";\n\n/**\n * A vertical floating toolbar paired with a FAB.\n */\nexport const VerticalFloatingToolbarWithFab = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>((props, ref) => (\n\t<FloatingToolbarWithFabBase ref={ref} orientation=\"vertical\" {...props} />\n));\nVerticalFloatingToolbarWithFab.displayName = \"VerticalFloatingToolbarWithFab\";\n","/**\n * @file toolbar-divider.tsx\n *\n * A decorative divider for use inside MD3 Toolbar components.\n * Renders as a thin line that visually separates groups of toolbar actions.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport { FloatingToolbarTokens, ToolbarDividerTokens } from \"./toolbar-tokens\";\n\nexport interface ToolbarDividerProps {\n\t/**\n\t * The toolbar's orientation context.\n\t * - `\"horizontal\"` toolbar → renders a **vertical** divider line.\n\t * - `\"vertical\"` toolbar → renders a **horizontal** divider line.\n\t * @default \"horizontal\"\n\t */\n\torientation?: \"horizontal\" | \"vertical\";\n\tclassName?: string;\n}\n\n/**\n * A thin decorative separator for grouping actions inside a Toolbar.\n *\n * Inherits its color from the toolbar's `--toolbar-color` CSS variable via\n * `currentColor`, so it automatically adapts to both standard and vibrant\n * color configurations.\n *\n * @example\n * ```tsx\n * <HorizontalFloatingToolbar expanded={true}>\n * <IconButton aria-label=\"Bold\"><BoldIcon /></IconButton>\n * <IconButton aria-label=\"Italic\"><ItalicIcon /></IconButton>\n * <ToolbarDivider />\n * <IconButton aria-label=\"Align left\"><AlignLeftIcon /></IconButton>\n * </HorizontalFloatingToolbar>\n * ```\n */\nexport const ToolbarDivider: React.FC<ToolbarDividerProps> = ({\n\torientation: propsOrientation,\n\tclassName,\n}) => {\n\tconst context = useToolbarContext();\n\tconst orientation = propsOrientation || context?.orientation || \"horizontal\";\n\tconst isHorizontalToolbar = orientation === \"horizontal\";\n\n\treturn (\n\t\t<hr\n\t\t\taria-orientation={isHorizontalToolbar ? \"vertical\" : \"horizontal\"}\n\t\t\tclassName={cn(\n\t\t\t\t\"shrink-0 bg-current opacity-30 border-none\",\n\t\t\t\tisHorizontalToolbar\n\t\t\t\t\t? \"w-px h-8 self-center mx-1\"\n\t\t\t\t\t: \"h-px w-8 self-center my-1\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\twidth: isHorizontalToolbar\n\t\t\t\t\t? `${ToolbarDividerTokens.Thickness}px`\n\t\t\t\t\t: `${ToolbarDividerTokens.HeightRatio * FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t\theight: isHorizontalToolbar\n\t\t\t\t\t? `${ToolbarDividerTokens.HeightRatio * FloatingToolbarTokens.ContainerHeight}px`\n\t\t\t\t\t: `${ToolbarDividerTokens.Thickness}px`,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nToolbarDivider.displayName = \"ToolbarDivider\";\n","/**\n * @file toolbar-icon-button.tsx\n *\n * A thin wrapper around the MD3 `IconButton` component, pre-configured\n * for use inside Toolbar slots.\n *\n * Supports the three emphasis variants described in the MD3 Flexibility & slots\n * spec, plus narrow/wide sizing for asymmetric visual hierarchy.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { type BaseIconButtonProps, IconButton } from \"../buttons/icon-button\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport { ToolbarIconButtonTokens } from \"./toolbar-tokens\";\n\nexport interface ToolbarIconButtonProps\n\textends Omit<BaseIconButtonProps, \"colorStyle\" | \"size\" | \"shape\"> {\n\t/**\n\t * Visual emphasis variant.\n\t *\n\t * ⚠️ Avoid emphasising more than one action at a time.\n\t * @default \"standard\"\n\t */\n\temphasis?: ToolbarIconButtonVariant;\n\t/**\n\t * Button width sizing.\n\t *\n\t * Height is always `48px` to meet MD3 touch-target requirements.\n\t * @default \"default\"\n\t */\n\ttoolbarSize?: ToolbarIconButtonSize;\n\t/**\n\t * Whether the icon button is in a selected/active toggle state.\n\t */\n\tselected?: boolean;\n\t/**\n\t * Change the default rendered element to the one passed as a child, merging their props and behavior.\n\t */\n\tasChild?: boolean;\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\"aria-label\": string;\n}\n\n/**\n * Width sizing for a toolbar icon button.\n *\n * MD3 guideline: *\"Use wide and narrow icon buttons\"* to create visual hierarchy.\n * Touch-target height is always 48dp regardless of width.\n *\n * - `narrow` → 40px wide (secondary, de-emphasised)\n * - `default` → 48px wide (standard square touch target)\n * - `wide` → 64px wide (primary emphasis, draws eye)\n */\nexport type ToolbarIconButtonSize = \"narrow\" | \"default\" | \"wide\";\n\n/**\n * Visual emphasis variant for a toolbar icon button.\n *\n * MD3 guideline: *\"Use different icon button color styles, such as filled,\n * tonal, and standard.\"*\n *\n * ⚠️ **Avoid emphasising more than one action at a time.**\n * Use `\"filled\"` or `\"tonal\"` for the single highest-priority action and\n * keep all other buttons as `\"standard\"`.\n */\nexport type ToolbarIconButtonVariant = \"standard\" | \"tonal\" | \"filled\";\n\nconst TOOLBAR_ICON_BUTTON_WIDTH: Record<ToolbarIconButtonSize, string> = {\n\tnarrow: \"w-[40px]\",\n\tdefault: \"w-[48px]\",\n\twide: \"w-[64px]\",\n};\n\nconst VARIANT_TO_COLOR_STYLE: Record<\n\tToolbarIconButtonVariant,\n\t\"standard\" | \"filled\" | \"tonal\"\n> = {\n\tstandard: \"standard\",\n\ttonal: \"tonal\",\n\tfilled: \"filled\",\n};\n\n/**\n * An MD3 icon button optimised for use inside Toolbar slots.\n *\n * Wraps the project's `IconButton` and adds:\n * - Three emphasis styles (`standard`, `tonal`, `filled`) via `emphasis` prop.\n * - Three width sizes (`narrow`, `default`, `wide`) for visual hierarchy.\n * - Support for `selected` state (Toggleable Icon Button per MD3 spec).\n * - Support for `asChild` slot delegation.\n * - Always `rounded-full` shape (required for floating toolbars per MD3 spec).\n * - Always 48dp height to meet MD3 accessibility touch-target requirements.\n *\n * @example\n * ```tsx\n * // Standard (default) — use for most actions\n * <ToolbarIconButton aria-label=\"Share\">\n * <ShareIcon />\n * </ToolbarIconButton>\n *\n * // Toggleable state\n * <ToolbarIconButton selected={isSelected} aria-label=\"Bookmark\" onClick={() => setIsSelected(!isSelected)}>\n * <BookmarkIcon />\n * </ToolbarIconButton>\n * ```\n *\n * @see https://m3.material.io/components/toolbars/guidelines\n */\nexport const ToolbarIconButton = React.forwardRef<\n\tHTMLButtonElement,\n\tToolbarIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\temphasis = \"standard\",\n\t\t\ttoolbarSize = \"default\",\n\t\t\tselected,\n\t\t\tasChild,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useToolbarContext();\n\t\tconst widthClass = TOOLBAR_ICON_BUTTON_WIDTH[toolbarSize];\n\t\tconst colorStyle = VARIANT_TO_COLOR_STYLE[emphasis];\n\n\t\tconst iconButtonProps =\n\t\t\tselected !== undefined\n\t\t\t\t? ({\n\t\t\t\t\t\tvariant: \"toggle\" as const,\n\t\t\t\t\t\tselected: Boolean(selected),\n\t\t\t\t\t} as const)\n\t\t\t\t: ({\n\t\t\t\t\t\tvariant: \"default\" as const,\n\t\t\t\t\t} as const);\n\n\t\treturn (\n\t\t\t<IconButton\n\t\t\t\tref={ref}\n\t\t\t\tasChild={asChild}\n\t\t\t\tcolorStyle={colorStyle}\n\t\t\t\tsize=\"md\"\n\t\t\t\tshape=\"round\"\n\t\t\t\ticonSize={ToolbarIconButtonTokens.IconSize}\n\t\t\t\t{...iconButtonProps}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"h-[48px]\",\n\t\t\t\t\twidthClass,\n\t\t\t\t\temphasis === \"standard\" &&\n\t\t\t\t\t\t!selected &&\n\t\t\t\t\t\t\"text-current hover:bg-current/8 active:bg-current/12\",\n\t\t\t\t\temphasis === \"standard\" &&\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\"bg-current/16 text-current hover:bg-current/20 active:bg-current/24\",\n\t\t\t\t\tcontext?.itemClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nToolbarIconButton.displayName = \"ToolbarIconButton\";\n","import { useMotionValueEvent, useScroll } from \"motion/react\";\nimport { type RefObject, useEffect, useRef, useState } from \"react\";\n\n/**\n * Configuration options for the `useFloatingToolbarScrollBehavior` hook.\n */\nexport interface UseFloatingToolbarScrollBehaviorOptions {\n\t/** Direction toolbar exits: 'top' | 'bottom' | 'start' | 'end'. Defaults to 'bottom'. */\n\texitDirection?: \"top\" | \"bottom\" | \"start\" | \"end\";\n\t/** Scroll distance threshold to trigger collapse (in px). Defaults to 10. */\n\tcollapseThreshold?: number;\n\t/** Scroll distance threshold to trigger expand (in px). Defaults to 10. */\n\texpandThreshold?: number;\n\t/** Optional ref to a scrollable container. If not provided, it listens to window scroll. */\n\tscrollContainerRef?: RefObject<HTMLElement | null>;\n}\n\n/**\n * The resulting behavior object returned by `useFloatingToolbarScrollBehavior`.\n */\nexport interface FloatingToolbarScrollBehavior {\n\t/** Current offset. 0 is fully visible, -1 is fully hidden. */\n\toffset: number;\n\t/** Whether the toolbar is currently expanded. */\n\tisExpanded: boolean;\n\t/** Optional scroll handler to bind to a React scrollable container (legacy fallback). */\n\tonScroll?: (event: React.UIEvent<HTMLElement>) => void;\n\t/** Manually update the expanded state of the toolbar. */\n\tsetExpanded: (expanded: boolean) => void;\n\t/** The configured exit direction. */\n\texitDirection: \"top\" | \"bottom\" | \"start\" | \"end\";\n}\n\n/**\n * A hook that provides scroll behavior for floating toolbars, allowing them to\n * collapse (exit) when scrolling down and expand (enter) when scrolling up.\n * Leverages Framer Motion's useScroll internally for optimized performance.\n *\n * @param options Configuration options for scroll behavior.\n * @returns An object containing the current scroll state and handlers.\n *\n * @example\n * ```tsx\n * const scrollBehavior = useFloatingToolbarScrollBehavior({\n * exitDirection: 'bottom',\n * collapseThreshold: 20\n * });\n *\n * <HorizontalFloatingToolbar scrollBehavior={scrollBehavior}>\n * <IconButton icon=\"bold\" />\n * </HorizontalFloatingToolbar>\n * ```\n */\nexport function useFloatingToolbarScrollBehavior(\n\toptions: UseFloatingToolbarScrollBehaviorOptions = {},\n): FloatingToolbarScrollBehavior {\n\tconst {\n\t\texitDirection = \"bottom\",\n\t\tcollapseThreshold = 10,\n\t\texpandThreshold = 10,\n\t\tscrollContainerRef,\n\t} = options;\n\n\tconst [isExpanded, setIsExpanded] = useState(true);\n\tconst [offset, setOffset] = useState(0); // 0 to -1\n\n\tconst { scrollY } = useScroll({\n\t\tcontainer: scrollContainerRef,\n\t});\n\n\tconst lastScrollY = useRef(0);\n\tconst accumulatedScroll = useRef(0);\n\n\tuseMotionValueEvent(scrollY, \"change\", (currentScrollY) => {\n\t\tconst deltaY = currentScrollY - lastScrollY.current;\n\n\t\t// Ignore bouncing (negative scroll or past max scroll on macOS)\n\t\tif (currentScrollY < 0) return;\n\n\t\tlastScrollY.current = currentScrollY;\n\n\t\t// Only accumulate if we are scrolling in the same direction\n\t\tif (Math.sign(deltaY) !== Math.sign(accumulatedScroll.current)) {\n\t\t\taccumulatedScroll.current = deltaY;\n\t\t} else {\n\t\t\taccumulatedScroll.current += deltaY;\n\t\t}\n\n\t\tif (deltaY > 0 && isExpanded) {\n\t\t\t// Scrolling down -> collapse\n\t\t\tif (accumulatedScroll.current > collapseThreshold) {\n\t\t\t\tsetIsExpanded(false);\n\t\t\t\tsetOffset(-1);\n\t\t\t}\n\t\t} else if (deltaY < 0 && !isExpanded) {\n\t\t\t// Scrolling up -> expand\n\t\t\tif (Math.abs(accumulatedScroll.current) > expandThreshold) {\n\t\t\t\tsetIsExpanded(true);\n\t\t\t\tsetOffset(0);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Accessibility: Always force expanded if forced-colors mode or accessibility preferences\n\tuseEffect(() => {\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst matchMedia = window.matchMedia(\"(forced-colors: active)\");\n\t\t\tif (matchMedia.matches) {\n\t\t\t\tsetIsExpanded(true);\n\t\t\t\tsetOffset(0);\n\t\t\t}\n\n\t\t\tconst listener = (e: MediaQueryListEvent) => {\n\t\t\t\tif (e.matches) {\n\t\t\t\t\tsetIsExpanded(true);\n\t\t\t\t\tsetOffset(0);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmatchMedia.addEventListener(\"change\", listener);\n\t\t\treturn () => matchMedia.removeEventListener(\"change\", listener);\n\t\t}\n\t}, []);\n\n\tconst setExpanded = (expanded: boolean) => {\n\t\tsetIsExpanded(expanded);\n\t\tsetOffset(expanded ? 0 : -1);\n\t};\n\n\t// Dummy onScroll for legacy compatibility if users still attach it\n\tconst onScroll = () => {};\n\n\treturn {\n\t\toffset,\n\t\tisExpanded,\n\t\tonScroll,\n\t\tsetExpanded,\n\t\texitDirection,\n\t};\n}\n","/**\n * @file toolbar-toggle-button.tsx\n *\n * An MD3 Expressive toggle button with icon and text label for Toolbar slots.\n * Implements the 'Button toggleable' building block from MD3 Toolbar guidelines.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Ripple, useRippleState } from \"../ripple\";\nimport { FAST_SPATIAL_SPRING } from \"../shared/motion-tokens\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport { ToolbarToggleButtonTokens } from \"./toolbar-tokens\";\n\nconst MOTION_PROP_KEYS = [\n\t\"animate\",\n\t\"exit\",\n\t\"initial\",\n\t\"transition\",\n\t\"variants\",\n\t\"whileHover\",\n\t\"whileTap\",\n\t\"whileFocus\",\n\t\"whileDrag\",\n\t\"whileInView\",\n\t\"onAnimationStart\",\n\t\"onAnimationComplete\",\n\t\"onUpdate\",\n\t\"onDragStart\",\n\t\"onDragEnd\",\n\t\"onDrag\",\n\t\"onDirectionLock\",\n\t\"onDragTransitionEnd\",\n\t\"layout\",\n\t\"layoutId\",\n\t\"onLayoutAnimationComplete\",\n] as const;\n\nexport interface ToolbarToggleButtonProps\n\textends Omit<HTMLMotionProps<\"button\">, \"children\"> {\n\t/**\n\t * Visual emphasis variant.\n\t * @default \"standard\"\n\t */\n\temphasis?: \"standard\" | \"tonal\" | \"filled\";\n\t/**\n\t * Whether the button is in a selected/active state.\n\t * @default false\n\t */\n\tselected?: boolean;\n\t/**\n\t * Leading icon component or node.\n\t */\n\ticon?: React.ReactNode;\n\t/**\n\t * Button text label / content.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Scale compression factor when pressed/clicked.\n\t * MD3 Expressive default: 0.95.\n\t * @default 0.95\n\t */\n\tpressScale?: number;\n\t/**\n\t * Horizontal spring bounce offset (in px) when pressed/clicked.\n\t * Oscillates left and right then contracts back to center.\n\t * Set to 0 to disable horizontal bounce.\n\t * @default 6\n\t */\n\tpressBounceOffset?: number;\n\t/**\n\t * Enable MD3 state layer ripple effect on click.\n\t * @default true\n\t */\n\tripple?: boolean;\n\t/**\n\t * Delegation prop to merge props onto a child element (Radix Slot).\n\t */\n\tasChild?: boolean;\n\tclassName?: string;\n}\n\n/**\n * An MD3 pill-shaped toggle button with optional leading icon and text label.\n *\n * Meets MD3 Expressive touch-target requirements (48dp height minimum, ~95dp width).\n * Features Material Design 3 Expressive spring press animation (`FAST_SPATIAL_SPRING`),\n * horizontal spring bounce oscillation (left-right bounce), and configurable ripple state layer.\n *\n * @example\n * ```tsx\n * const [selected, setSelected] = useState(false);\n *\n * <ToolbarToggleButton\n * selected={selected}\n * onClick={() => setSelected(!selected)}\n * icon={<EditIcon />}\n * >\n * Edit\n * </ToolbarToggleButton>\n * ```\n */\nexport const ToolbarToggleButton = React.forwardRef<\n\tHTMLButtonElement,\n\tToolbarToggleButtonProps\n>(\n\t(\n\t\t{\n\t\t\temphasis = \"standard\",\n\t\t\tselected = false,\n\t\t\ticon,\n\t\t\tchildren,\n\t\t\tpressScale = 0.95,\n\t\t\tpressBounceOffset = 6,\n\t\t\tripple = true,\n\t\t\tasChild = false,\n\t\t\tclassName,\n\t\t\ttype = \"button\",\n\t\t\tdisabled,\n\t\t\tonPointerDown: onPointerDownProp,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useToolbarContext();\n\n\t\tconst {\n\t\t\tripples,\n\t\t\tonPointerDown: handleRipplePointerDown,\n\t\t\tremoveRipple,\n\t\t} = useRippleState({\n\t\t\tdisabled: Boolean(disabled) || !ripple,\n\t\t});\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tif (!disabled && ripple) {\n\t\t\t\t\thandleRipplePointerDown(e);\n\t\t\t\t}\n\t\t\t\tonPointerDownProp?.(e);\n\t\t\t},\n\t\t\t[disabled, ripple, handleRipplePointerDown, onPointerDownProp],\n\t\t);\n\n\t\tconst baseClasses =\n\t\t\t\"relative overflow-hidden inline-flex items-center justify-center min-w-[95px] h-[48px] px-4 rounded-full text-sm font-medium transition-colors select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/40 disabled:pointer-events-none disabled:opacity-38\";\n\n\t\tconst variantClasses = {\n\t\t\tstandard: selected\n\t\t\t\t? \"bg-current/16 text-current hover:bg-current/20 active:bg-current/24\"\n\t\t\t\t: \"bg-transparent text-current hover:bg-current/8 active:bg-current/12\",\n\t\t\ttonal: selected\n\t\t\t\t? \"bg-m3-secondary-container text-m3-on-secondary-container hover:shadow-sm\"\n\t\t\t\t: \"bg-m3-surface-container-high text-m3-on-surface hover:bg-m3-surface-container-highest\",\n\t\t\tfilled: selected\n\t\t\t\t? \"bg-m3-primary text-m3-on-primary hover:shadow-sm\"\n\t\t\t\t: \"bg-m3-surface-container-highest text-m3-on-surface hover:bg-m3-surface-container-high\",\n\t\t};\n\n\t\tconst combinedClassName = cn(\n\t\t\tbaseClasses,\n\t\t\tvariantClasses[emphasis],\n\t\t\tcontext?.itemClassName,\n\t\t\tclassName,\n\t\t);\n\n\t\tconst whileTapConfig = React.useMemo(\n\t\t\t() => ({\n\t\t\t\tscale: pressScale,\n\t\t\t\tx: pressBounceOffset\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t-pressBounceOffset,\n\t\t\t\t\t\t\tpressBounceOffset,\n\t\t\t\t\t\t\t-pressBounceOffset / 2,\n\t\t\t\t\t\t\tpressBounceOffset / 2,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t]\n\t\t\t\t\t: 0,\n\t\t\t}),\n\t\t\t[pressScale, pressBounceOffset],\n\t\t);\n\n\t\tconst transitionConfig = React.useMemo(\n\t\t\t() => ({\n\t\t\t\tscale: FAST_SPATIAL_SPRING,\n\t\t\t\tx: {\n\t\t\t\t\tduration: 0.35,\n\t\t\t\t\tease: \"easeInOut\" as const,\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[],\n\t\t);\n\n\t\tconst mainContent = (\n\t\t\t<span className=\"inline-flex items-center justify-center h-full gap-2\">\n\t\t\t\t{icon && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"shrink-0 inline-flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t\theight: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{children &&\n\t\t\t\t\t(typeof children === \"string\" || typeof children === \"number\" ? (\n\t\t\t\t\t\t<span>{children}</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tchildren\n\t\t\t\t\t))}\n\t\t\t</span>\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\tconst childContent = child.props.children;\n\n\t\t\tconst innerChildContent = (\n\t\t\t\t<>\n\t\t\t\t\t{ripple && (\n\t\t\t\t\t\t<Ripple\n\t\t\t\t\t\t\tripples={ripples}\n\t\t\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"inline-flex items-center justify-center h-full gap-2\">\n\t\t\t\t\t\t{icon ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 inline-flex items-center justify-center\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\twidth: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t\t\t\t\theight: ToolbarToggleButtonTokens.IconSize,\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{icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{typeof childContent === \"string\" ||\n\t\t\t\t\t\t\t\ttypeof childContent === \"number\" ? (\n\t\t\t\t\t\t\t\t\t<span>{childContent}</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tchildContent\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\tchildContent\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t);\n\n\t\t\tconst strippedProps = { ...props } as Record<string, unknown>;\n\t\t\tfor (const key of MOTION_PROP_KEYS) delete strippedProps[key];\n\t\t\tdelete strippedProps.children;\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={selected}\n\t\t\t\t\t\tclassName={combinedClassName}\n\t\t\t\t\t\tonPointerDown={\n\t\t\t\t\t\t\thandlePointerDown as unknown as React.PointerEventHandler<HTMLElement>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{...(strippedProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerChildContent })}\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={type}\n\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\twhileTap={whileTapConfig}\n\t\t\t\t\ttransition={transitionConfig}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tclassName={combinedClassName}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{ripple && (\n\t\t\t\t\t\t<Ripple\n\t\t\t\t\t\t\tripples={ripples}\n\t\t\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{mainContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nToolbarToggleButton.displayName = \"ToolbarToggleButton\";\n"]}
1
+ {"version":3,"sources":["../src/ui/shared/motion-tokens.ts","../src/ui/app-bar/app-bar.tokens.ts","../src/lib/utils.ts","../src/ui/app-bar/app-bar-item-button.tsx","../src/ui/menu/menu-animations.ts","../src/ui/menu/menu-context.tsx","../src/ui/menu/menu-tokens.ts","../src/ui/menu/context-menu.tsx","../src/ui/menu/menu.tsx","../src/ui/menu/menu-divider.tsx","../src/ui/menu/menu-group.tsx","../src/ui/shared/constants.ts","../src/ui/icon.tsx","../src/ui/menu/menu-item.tsx","../src/ui/menu/sub-menu.tsx","../src/ui/menu/vertical-menu.tsx","../src/ui/app-bar/app-bar-overflow-indicator.tsx","../src/ui/app-bar/app-bar-column.tsx","../src/ui/app-bar/app-bar-row.tsx","../src/ui/app-bar/hooks/use-app-bar-scroll.ts","../src/ui/app-bar/bottom-app-bar.tsx","../src/ui/app-bar/docked-toolbar.tsx","../src/ui/app-bar/hooks/use-flexible-app-bar.ts","../src/ui/app-bar/large-flexible-app-bar.tsx","../src/ui/app-bar/medium-flexible-app-bar.tsx","../src/ui/app-bar/search-app-bar.tsx","../src/ui/app-bar/search-view.tsx","../src/ui/app-bar/small-app-bar.tsx","../src/ui/ripple.tsx","../src/ui/shared/touch-target.tsx","../src/ui/navigation-bar.tsx","../src/ui/navigation-rail.tsx","../src/ui/search/hooks/use-search-keyboard.ts","../src/ui/search/search.tokens.ts","../src/ui/search/animated-placeholder.tsx","../src/ui/search/search-bar.tsx","../src/ui/search/search-context.tsx","../src/hooks/useClickOutside.ts","../src/ui/search/hooks/use-search-view-focus.ts","../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/buttons/icon-button/icon-button.tsx","../src/ui/search/trailing-action.tsx","../src/ui/search/search-view-docked.tsx","../src/ui/search/search-view-fullscreen.tsx","../src/ui/search/search.tsx","../src/ui/badge.tsx","../src/ui/tabs/tabs.tsx","../src/ui/tabs/tabs.tokens.ts","../src/ui/tabs/tab.tsx","../src/ui/tabs/tabs-content.tsx","../src/ui/tabs/tabs-list.tsx","../src/ui/toolbar/toolbar-colors.ts","../src/ui/toolbar/toolbar-context.tsx","../src/ui/toolbar/docked-toolbar.tsx","../src/ui/toolbar/toolbar-tokens.ts","../src/ui/toolbar/floating-toolbar.tsx","../src/ui/toolbar/floating-toolbar-with-fab.tsx","../src/ui/toolbar/toolbar-divider.tsx","../src/ui/toolbar/toolbar-icon-button.tsx","../src/ui/toolbar/toolbar-scroll-behavior.ts","../src/ui/toolbar/toolbar-toggle-button.tsx"],"names":["React","jsx","React2","_a","React3","AnimatePresence","m","React4","DropdownMenu2","React5","children","itemPosition","React6","React7","ContextMenu2","DropdownMenu3","jsxs","React8","Sub","ContextMenu3","DropdownMenu4","SubTrigger","SubContent","Portal","React9","Fragment","React10","React11","React12","useReducedMotion","React13","React14","React15","React16","RippleItem","React17","Slot","LazyMotion","domMax","React18","cva","cloneIconWithFill","ActivePill","HoverStateLayer","RippleLayer","IconContainer","React19","React20","React21","React22","useRef","useEffect","React23","React24","IndeterminateSvg","DeterminateSvg","React25","React26","React27","FlatLinearTrack","React28","WavyLinearTrack","useMotionValue","React29","React30","React31","_b","React32","ArrowBackIcon","React33","createPortal","React34","React35","React37","React38","React39","React40","React41","React42","React43","React44","useState","useScroll","useMotionValueEvent","React45"],"mappings":"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","file":"navigation.mjs","sourcesContent":["/**\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 app-bar.tokens.ts\n * MD3 Expressive App Bar — Design tokens ported from:\n * - AppBarTokens.kt (shared tokens)\n * - AppBarSmallTokens.kt\n * - AppBarMediumFlexibleTokens.kt\n * - AppBarLargeFlexibleTokens.kt\n * - BottomAppBarTokens.kt\n * - DockedToolbarTokens.kt\n * - FabSecondaryContainerTokens.kt\n *\n * All dimensional values are in px (dp equivalents for web at 1dp = 1px).\n * Colors reference CSS custom properties — do NOT hardcode hex.\n * @see docs/m3/app-bars/\n */\n\nimport { DEFAULT_SPATIAL_SPRING } from \"../shared/motion-tokens\";\n\n// ─── Dimensional Tokens ───────────────────────────────────────────────────────\n\n/**\n * Height and spacing tokens for all App Bar variants.\n * Maps directly from MD3 Kotlin token files.\n */\nexport const AppBarTokens = {\n\t// ── Heights ─────────────────────────────────────────────────────────────\n\theights: {\n\t\t/** SmallAppBar height. AppBarSmallTokens.ContainerHeight = 64dp */\n\t\tsmall: 64,\n\t\t/** Collapsed height for flexible variants. = SmallAppBar height. */\n\t\tflexibleCollapsed: 64,\n\t\t/** MediumFlexibleAppBar expanded height (without subtitle). AppBarMediumFlexibleTokens */\n\t\tmediumFlexExpanded: 112,\n\t\t/** MediumFlexibleAppBar expanded height (with subtitle). */\n\t\tmediumFlexWithSubtitleExpanded: 136,\n\t\t/** LargeFlexibleAppBar expanded height (without subtitle). AppBarLargeFlexibleTokens */\n\t\tlargeFlexExpanded: 120,\n\t\t/** LargeFlexibleAppBar expanded height (with subtitle). */\n\t\tlargeFlexWithSubtitleExpanded: 152,\n\t\t/** BottomAppBar height. BottomAppBarTokens.ContainerHeight = 80dp */\n\t\tbottom: 80,\n\t\t/** DockedToolbar height. DockedToolbarTokens.ContainerHeight = 64dp */\n\t\tdockedToolbar: 64,\n\t},\n\n\t// ── Icon and Avatar sizes ──────────────────────────────────────────────\n\t/** AppBarTokens.IconSize = 24dp */\n\ticonSize: 24,\n\t/** AppBarTokens.AvatarSize = 32dp */\n\tavatarSize: 32,\n\n\t// ── Spacing ──────────────────────────────────────────────────────────────\n\t/** AppBarTokens.LeadingSpace = 4dp */\n\tleadingSpace: 4,\n\t/** AppBarTokens.TrailingSpace = 4dp */\n\ttrailingSpace: 4,\n\t/** AppBarTokens.IconButtonSpace = 0dp (no gap between icon buttons) */\n\ticonButtonSpace: 0,\n\n\t// ── Docked Toolbar spacing ────────────────────────────────────────────\n\tdockedToolbar: {\n\t\t/** DockedToolbarTokens.ContainerLeadingSpace = 16dp */\n\t\tleadingSpace: 16,\n\t\t/** DockedToolbarTokens.ContainerTrailingSpace = 16dp */\n\t\ttrailingSpace: 16,\n\t\t/** DockedToolbarTokens.ContainerMinSpacing = 4dp */\n\t\tminSpacing: 4,\n\t\t/** DockedToolbarTokens.ContainerMaxSpacing = 32dp */\n\t\tmaxSpacing: 32,\n\t},\n\n\t// ── Touch targets ─────────────────────────────────────────────────────\n\t/** Minimum 48px touch target for icon buttons per MD3 accessibility spec. */\n\ticonButtonTouchTarget: 48,\n} as const;\n\n// ─── Typography Tokens ────────────────────────────────────────────────────────\n\n/**\n * MD3 type scale values mapped to Tailwind CSS class strings.\n * Used across App Bar variants for consistent typography.\n *\n * Values derived from MD3 Material Type Scale specification.\n */\nexport const appBarTypography = {\n\t/**\n\t * SmallAppBar title (collapsed state for flexible variants).\n\t * AppBarSmallTokens.TitleFont = TitleLarge\n\t * Spec: 22sp / 28sp line-height / medium weight\n\t */\n\ttitleLarge: \"text-[22px] leading-[28px] font-medium tracking-[0px]\",\n\n\t/**\n\t * SmallAppBar subtitle.\n\t * AppBarSmallTokens.SubtitleFont = LabelMedium\n\t * Spec: 12sp / 16sp line-height / medium weight / 0.5px tracking\n\t */\n\tlabelMedium: \"text-[12px] leading-[16px] font-medium tracking-[0.5px]\",\n\n\t/**\n\t * MediumFlexibleAppBar expanded title.\n\t * AppBarMediumFlexibleTokens.TitleFont = HeadlineMedium\n\t * Spec: 28sp / 36sp line-height / normal weight\n\t */\n\theadlineMedium: \"text-[28px] leading-[36px] font-normal tracking-[0px]\",\n\n\t/**\n\t * MediumFlexibleAppBar subtitle.\n\t * AppBarMediumFlexibleTokens.SubtitleFont = LabelLarge\n\t * Spec: 14sp / 20sp line-height / medium weight / 0.1px tracking\n\t */\n\tlabelLarge: \"text-[14px] leading-[20px] font-medium tracking-[0.1px]\",\n\n\t/**\n\t * LargeFlexibleAppBar expanded title.\n\t * AppBarLargeFlexibleTokens.TitleFont = DisplaySmall\n\t * Spec: 36sp / 44sp line-height / normal weight / -0.25px tracking\n\t */\n\tdisplaySmall: \"text-[36px] leading-[44px] font-normal tracking-[-0.25px]\",\n\n\t/**\n\t * LargeFlexibleAppBar subtitle.\n\t * AppBarLargeFlexibleTokens.SubtitleFont = TitleMedium\n\t * Spec: 16sp / 24sp line-height / medium weight / 0.15px tracking\n\t */\n\ttitleMedium: \"text-[16px] leading-6 font-medium tracking-[0.15px]\",\n} as const;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/**\n * CSS custom property references for App Bar colors.\n * Maps to --md-sys-color-* tokens in the MD3 theme system.\n *\n * IMPORTANT: Never hardcode hex/rgba values here — these references\n * automatically adapt to light/dark theme via the MD3ThemeProvider.\n *\n * AppBarTokens.kt spec:\n * - ContainerColor → md-sys-color-surface\n * - OnScrollContainerColor → md-sys-color-surface-container\n */\nexport const APP_BAR_COLORS = {\n\t// ── Container ────────────────────────────────────────────────────────────\n\t/** Default background. AppBarTokens.ContainerColor → surface */\n\tcontainer: \"var(--md-sys-color-surface)\",\n\t/** Background when content is scrolled. AppBarTokens.OnScrollContainerColor → surface-container */\n\tscrolledContainer: \"var(--md-sys-color-surface-container)\",\n\n\t// ── Content ──────────────────────────────────────────────────────────────\n\t/** Title color. AppBarTokens.TitleColor → on-surface */\n\ttitle: \"var(--md-sys-color-on-surface)\",\n\t/** Subtitle color. AppBarTokens.SubtitleColor → on-surface-variant */\n\tsubtitle: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Navigation icon color. AppBarTokens.LeadingIconColor → on-surface */\n\tnavigationIcon: \"var(--md-sys-color-on-surface)\",\n\t/** Action icon color. AppBarTokens.TrailingIconColor → on-surface-variant */\n\tactionIcon: \"var(--md-sys-color-on-surface-variant)\",\n\n\t// ── Search Bar ───────────────────────────────────────────────────────────\n\t/** Search bar pill background. → surface-container-high */\n\tsearchBarBg: \"var(--md-sys-color-surface-container-high)\",\n\t/** Search bar text/icon color. */\n\tsearchBarContent: \"var(--md-sys-color-on-surface-variant)\",\n\n\t// ── Bottom App Bar ───────────────────────────────────────────────────────\n\t/** BottomAppBarTokens.ContainerColor → surface-container */\n\tbottomContainer: \"var(--md-sys-color-surface-container)\",\n\n\t// ── FAB on Bottom App Bar ────────────────────────────────────────────────\n\t/** FabSecondaryContainerTokens.ContainerColor → secondary-container */\n\tfabContainer: \"var(--md-sys-color-secondary-container)\",\n\t/** FabSecondaryContainerTokens.IconColor → on-secondary-container */\n\tfabIcon: \"var(--md-sys-color-on-secondary-container)\",\n} as const;\n\n// ─── Animation Constants ──────────────────────────────────────────────────────\n\n/**\n * Color transition when App Bar background changes on scroll.\n * MD3 Standard easing: cubic-bezier(0.2, 0, 0, 1), 200ms.\n */\nexport const APP_BAR_COLOR_TRANSITION = {\n\tduration: 0.2,\n\tease: [0.2, 0, 0, 1] as [number, number, number, number],\n} as const;\n\n/**\n * Spring animation for enterAlways behavior (hide/show on scroll direction).\n * Equivalent to MD3 FastSpatial motion scheme.\n */\nexport const APP_BAR_ENTER_ALWAYS_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const APP_BAR_BOTTOM_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const SEARCH_VIEW_SPRING = DEFAULT_SPATIAL_SPRING;\n\n/**\n * Title crossfade transition for flexible App Bars.\n * Short duration keeps the collapse feeling snappy.\n */\nexport const APP_BAR_TITLE_FADE = {\n\tduration: 0.15,\n\tease: \"easeInOut\",\n} as const;\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 app-bar-item-button.tsx\n * Shared icon button renderer for AppBarRow and AppBarColumn items.\n *\n * Extracted from duplicate RowItem/ColumnItem implementations.\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { APP_BAR_COLORS, AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarItem } from \"./app-bar.types\";\n\ninterface AppBarItemButtonProps {\n\titem: AppBarItem;\n}\n\n/**\n * Renders a single App Bar action item as an icon button.\n * Handles clickable, toggleable, and custom item types.\n */\nexport function AppBarItemButton({ item }: AppBarItemButtonProps) {\n\tconst isDisabled = item.enabled === false;\n\n\tif (item.type === \"custom\" && item.appBarContent) {\n\t\treturn <>{item.appBarContent}</>;\n\t}\n\n\tconst buttonClassName = cn(\n\t\t\"flex items-center justify-center rounded-full\",\n\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\tisDisabled && \"opacity-38 pointer-events-none\",\n\t);\n\n\tconst buttonStyle = {\n\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t};\n\n\tif (item.type === \"toggleable\") {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={buttonClassName}\n\t\t\t\tstyle={{\n\t\t\t\t\t...buttonStyle,\n\t\t\t\t\tcolor: item.checked\n\t\t\t\t\t\t? APP_BAR_COLORS.navigationIcon\n\t\t\t\t\t\t: APP_BAR_COLORS.actionIcon,\n\t\t\t\t}}\n\t\t\t\taria-label={item.label}\n\t\t\t\taria-pressed={item.checked}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tonClick={() => item.onCheckedChange?.(!item.checked)}\n\t\t\t>\n\t\t\t\t{item.icon}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={buttonClassName}\n\t\t\tstyle={{ ...buttonStyle, color: APP_BAR_COLORS.actionIcon }}\n\t\t\taria-label={item.label}\n\t\t\tdisabled={isDisabled}\n\t\t\tonClick={item.onClick}\n\t\t>\n\t\t\t{item.icon}\n\t\t</button>\n\t);\n}\n","// ─── MD3 Expressive Menu — Framer Motion Animation Variants ──────────────────\n// FastSpatial: md.sys.motion.spring.fast.spatial\n// MD3: stiffness=800, dampingRatio=0.6 → Framer damping ≈ 33.94\n// FastEffects: md.sys.motion.spring.fast.effects (CSS fallback used for exit)\n// MD3: duration=150ms, cubic-bezier(0.31, 0.94, 0.34, 1.00)\n\nimport type { Variants } from \"motion/react\";\nimport {\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n} from \"../shared/motion-tokens\";\n\nexport { FAST_EFFECTS_SPRING, FAST_SPATIAL_SPRING };\n\n/** FastEffects CSS-fallback transition — used for opacity/exit animations */\nexport const FAST_EFFECTS_TRANSITION = {\n\tduration: 0.15,\n\tease: [0.31, 0.94, 0.34, 1.0] as [number, number, number, number],\n} as const;\n\n// ─── Menu popup container ─────────────────────────────────────────────────────\n\n/**\n * Enter/exit animation for the menu popup container.\n * Scale from 0.8→1.0 with FastSpatial spring.\n * Transform-origin is driven by the Radix CSS variable\n * `--radix-dropdown-menu-content-transform-origin`.\n */\nexport const MENU_CONTAINER_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\tscale: 0.8,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.8,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n\n// ─── Selected check icon ──────────────────────────────────────────────────────\n\n/** Size of the check icon in px (20dp per SegmentedMenuTokens.ItemLeadingIconSize) */\nexport const MENU_CHECK_ICON_SIZE = 20;\n\n/**\n * Expand/collapse animation for the check icon that appears when a MenuItem is\n * selected. Uses horizontal expansion (width + marginInlineEnd) with FastSpatial.\n *\n * ONLY used for the animated check ↔ selectedIcon swap in selectable items.\n * Regular (static) leading icons should NOT use these variants.\n */\nexport const CHECK_ICON_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\twidth: 0,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\twidth: MENU_CHECK_ICON_SIZE,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\twidth: 0,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n\n// ─── SubMenu content ──────────────────────────────────────────────────────────\n\n/** SubMenu popup uses the same FastSpatial/FastEffects pattern as root menu */\nexport const SUBMENU_CONTAINER_VARIANTS: Variants = {\n\thidden: {\n\t\topacity: 0,\n\t\tscale: 0.9,\n\t\tx: -4,\n\t},\n\tvisible: {\n\t\topacity: 1,\n\t\tscale: 1,\n\t\tx: 0,\n\t\ttransition: FAST_SPATIAL_SPRING,\n\t},\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.9,\n\t\tx: -4,\n\t\ttransition: FAST_EFFECTS_TRANSITION,\n\t},\n};\n","// ─── MD3 Expressive Menu — React Context ──────────────────────────────────────\nimport * as React from \"react\";\nimport type {\n\tMenuColorVariant,\n\tMenuPrimitive,\n\tMenuVariant,\n} from \"./menu-types\";\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\ninterface MenuContextValue {\n\t/** Visual variant: baseline (M3 standard) or expressive (shape-morphing) */\n\tvariant: MenuVariant;\n\t/** Color variant inherited by all children unless overridden */\n\tcolorVariant: MenuColorVariant;\n\t/**\n\t * Which Radix primitive family drives this menu:\n\t * - \"dropdown\" → @radix-ui/react-dropdown-menu (button/field trigger)\n\t * - \"context\" → @radix-ui/react-context-menu (right-click trigger)\n\t * - \"static\" → plain HTML via Slot (VerticalMenu, always-visible)\n\t */\n\tmenuPrimitive: MenuPrimitive;\n\t/**\n\t * Whether the menu popup is currently open.\n\t * Used by MenuContent to drive AnimatePresence for exit animations.\n\t */\n\topen: boolean;\n\t/** Setter forwarded from Menu root — kept in sync with Radix Root open state */\n\tonOpenChange: (open: boolean) => void;\n}\n\n// ─── Backward-compat derived getter ───────────────────────────────────────────\n// Components that still reference `isStatic` (MenuGroup, etc.) use this helper\n// during the incremental migration period.\nexport function isStaticPrimitive(primitive: MenuPrimitive): boolean {\n\treturn primitive === \"static\";\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst MenuContext = React.createContext<MenuContextValue>({\n\tvariant: \"baseline\",\n\tcolorVariant: \"standard\",\n\tmenuPrimitive: \"dropdown\",\n\topen: false,\n\tonOpenChange: () => {},\n});\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\nexport interface MenuProviderProps {\n\tvariant?: MenuVariant;\n\tcolorVariant?: MenuColorVariant;\n\tmenuPrimitive?: MenuPrimitive;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: React.ReactNode;\n}\n\nexport function MenuProvider({\n\tvariant = \"baseline\",\n\tcolorVariant = \"standard\",\n\tmenuPrimitive = \"dropdown\",\n\topen,\n\tonOpenChange,\n\tchildren,\n}: MenuProviderProps) {\n\tconst value = React.useMemo<MenuContextValue>(\n\t\t() => ({ variant, colorVariant, menuPrimitive, open, onOpenChange }),\n\t\t[variant, colorVariant, menuPrimitive, open, onOpenChange],\n\t);\n\n\treturn <MenuContext.Provider value={value}>{children}</MenuContext.Provider>;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the nearest MenuContext value.\n * Safe to use outside a MenuProvider (returns default: baseline, dropdown, closed).\n *\n * Includes backward-compat shims:\n * - `menuVariant` → alias for `variant` (deprecated, will be removed)\n * - `isStatic` → `menuPrimitive === \"static\"`\n */\nexport function useMenuContext(): MenuContextValue & {\n\tisStatic: boolean;\n\tmenuVariant: MenuVariant;\n} {\n\tconst ctx = React.useContext(MenuContext);\n\treturn React.useMemo(\n\t\t() => ({\n\t\t\t...ctx,\n\t\t\tisStatic: ctx.menuPrimitive === \"static\",\n\t\t\tmenuVariant: ctx.variant,\n\t\t}),\n\t\t[ctx],\n\t);\n}\n","// ─── MD3 Expressive Menu — Design Token Constants ─────────────────────────────\n// Sourced from: SegmentedMenuTokens.kt, StandardMenuTokens.kt, VibrantMenuTokens.kt,\n// MenuTokens.kt, MenuDefaults.kt, ListTokens.kt\n\nimport { cornerRadius } from \"@bug-on/m3-tokens\";\n\n// ─── Spacing (px → dp) ────────────────────────────────────────────────────────\n\n/** Horizontal padding for menu items: 16dp (ItemLeadingSpace / ItemTrailingSpace) */\nexport const MENU_ITEM_HORIZONTAL_PADDING = \"px-4\"; // 16dp\n\n/** Horizontal padding for baseline menu items: 12dp */\nexport const MENU_BASELINE_ITEM_HORIZONTAL_PADDING = \"px-3\"; // 12dp\n\n/** Min height for selectable items: 44dp (SegmentedMenuTokens.Item) */\nexport const MENU_ITEM_MIN_HEIGHT = \"min-h-11\"; // 44dp = 11 * 4px\n\n/** Min height for standard list items: 48dp (MenuListItemContainerHeight) */\nexport const MENU_LIST_ITEM_MIN_HEIGHT = \"min-h-12\"; // 48dp\n\n/** Min width of menu container: 112dp (DropdownMenuItemDefaultMinWidth) */\nexport const MENU_MIN_WIDTH = \"min-w-28\"; // 112dp\n\n/** Max width of menu container: 280dp (DropdownMenuItemDefaultMaxWidth) */\nexport const MENU_MAX_WIDTH = \"max-w-70\"; // 280dp\n\n/** Gap between MenuGroup segments: 2dp (SegmentedMenuTokens.SegmentedGap) */\nexport const MENU_GROUP_GAP = \"gap-0.5\"; // 2dp\n\n/** Internal group vertical padding: 4dp (DropdownMenuGroupVerticalPadding) */\nexport const MENU_GROUP_PADDING_Y = \"py-1\"; // 4dp\n\n/** Popup container vertical padding: 8dp (DropdownMenuVerticalPadding) */\nexport const MENU_POPUP_PADDING_Y = \"py-2\"; // 8dp\n\n/** Leading icon size: 20dp (SegmentedMenuTokens.ItemLeadingIconSize) */\nexport const MENU_ICON_SIZE = 20;\n\n// ─── Container Shape ──────────────────────────────────────────────────────────\n\n/**\n * Menu popup container shape: CornerExtraSmall = 4px.\n * Source: MenuTokens.ContainerShape = ShapeKeyTokens.CornerExtraSmall\n */\nexport const MENU_CONTAINER_SHAPE = \"rounded-[4px]\"; // CornerExtraSmall\n\n/**\n * Shape for Baseline menu item (no shape morphing, edge-to-edge state layer).\n */\nexport const BASELINE_ITEM_SHAPE = \"rounded-none\";\n\n// ─── Shape: CSS border-radius values (used with motion/react `animate`) ────────\n// These are used for animated shape morphing via Framer Motion's `borderRadius`\n// property — NOT as Tailwind classes (Tailwind cannot animate between values).\n\n/**\n * Shape values for MenuGroup container (borderRadius CSS shorthand string).\n * Format: \"topLeft topRight bottomRight bottomLeft\"\n *\n * Source: MenuDefaults.kt groupShape() + SegmentedMenuTokens/ShapeTokens\n * - ContainerShape (standalone) = CornerLarge (16px) all corners\n * - InactiveContainerShape = CornerSmall (8px) all corners\n * - Leading group: topStart=CornerLarge, topEnd=CornerLarge, bottomStart=CornerSmall, bottomEnd=CornerSmall\n * - Middle group: GroupShape = CornerSmall (8px)\n * - Trailing group: topStart=CornerSmall, topEnd=CornerSmall, bottomStart=CornerLarge, bottomEnd=CornerLarge\n */\nexport const GROUP_SHAPES = {\n\t/** Active standalone group shape: CornerLarge all corners (16px) */\n\tstandaloneActive: `${cornerRadius.large}px`,\n\t/**\n\t * Active leading group shape: top=CornerLarge(16px), bottom=CornerSmall(8px)\n\t * Source: SegmentedMenuTokens — LeadingContainerShape:\n\t * topStart=CornerLarge, topEnd=CornerLarge, bottomStart=CornerSmall, bottomEnd=CornerSmall\n\t */\n\tleadingActive: `${cornerRadius.large}px ${cornerRadius.large}px ${cornerRadius.small}px ${cornerRadius.small}px`,\n\t/** Active middle group shape: CornerExtraSmall all corners (4px) */\n\tmiddleActive: `${cornerRadius.extraSmall}px`,\n\t/**\n\t * Active trailing group shape: top=CornerSmall(8px), bottom=CornerLarge(16px)\n\t * Source: SegmentedMenuTokens — TrailingContainerShape:\n\t * topStart=CornerSmall, topEnd=CornerSmall, bottomStart=CornerLarge, bottomEnd=CornerLarge\n\t */\n\ttrailingActive: `${cornerRadius.small}px ${cornerRadius.small}px ${cornerRadius.large}px ${cornerRadius.large}px`,\n\t/** Inactive (default, pre-hover) shape for all groups: CornerExtraSmall (4px) */\n\tinactive: `${cornerRadius.extraSmall}px`,\n} as const;\n\n/**\n * Shape values for MenuItem (borderRadius CSS shorthand string).\n * Used as Tailwind classes via arbitrary values for static rendering.\n * Animated shape (selected ↔ unselected) is handled via `transition-[border-radius]`.\n *\n * Source: MenuDefaults.kt itemShape() + SegmentedMenuTokens/ShapeTokens\n * - leading item: topStart/topEnd=CornerMedium(12px), bottomStart/bottomEnd=CornerExtraSmall(4px)\n * - middle item: CornerExtraSmall all (ItemShape = 4px)\n * - trailing item: topStart/topEnd=CornerExtraSmall(4px), bottomStart/bottomEnd=CornerMedium(12px)\n * - standalone item: same as middle (ItemShape = 4px)\n * - selected (all positions): CornerMedium all (ItemSelectedShape = 12px)\n */\nexport const ITEM_SHAPE_CLASSES = {\n\tleading: \"rounded-t-[12px] rounded-b-[4px]\",\n\tmiddle: \"rounded-[4px]\",\n\ttrailing: \"rounded-t-[4px] rounded-b-[12px]\",\n\tstandalone: \"rounded-[4px]\",\n\tselected: \"rounded-[12px]\",\n} as const;\n\n// ─── Color token Tailwind classes ─────────────────────────────────────────────\n\n/**\n * Standard color variant tokens (SurfaceContainerLow-based).\n * Source: StandardMenuTokens.kt\n *\n * Container: SurfaceContainerLow\n * Text: OnSurface\n * Icons: OnSurfaceVariant\n * Selected container: TertiaryContainer\n * Selected text/icons: OnTertiaryContainer\n */\nexport const STANDARD_COLORS = {\n\t/** Group/popup container background (StandardMenuTokens.ContainerColor) */\n\tcontainerBg: \"bg-m3-surface-container-low\",\n\t/** Label text color (StandardMenuTokens.ItemLabelTextColor) */\n\tlabelText: \"text-m3-on-surface\",\n\t/** Leading/trailing icon color (StandardMenuTokens.ItemLeadingIconColor) */\n\ticonColor: \"text-m3-on-surface-variant\",\n\t/** Supporting text below label (StandardMenuTokens.ItemSupportingTextColor) */\n\tsupportingTextColor: \"text-m3-on-surface-variant\",\n\t/** Trailing supporting text (StandardMenuTokens.ItemTrailingSupportingTextColor) */\n\ttrailingSupportingTextColor: \"text-m3-on-surface-variant\",\n\t/** Trailing icon color (StandardMenuTokens.ItemTrailingIconColor) */\n\ttrailingIconColor: \"text-m3-on-surface-variant\",\n\t/** Hover state layer (OnSurface @ 8% opacity) */\n\thoverLayer: \"hover:bg-m3-on-surface/8\",\n\t/** Focus state layer (OnSurface @ 12% opacity) */\n\tfocusLayer: \"focus:bg-m3-on-surface/12\",\n\t/** Selected item background (StandardMenuTokens.ItemSelectedContainerColor) */\n\tselectedBg: \"bg-m3-tertiary-container\",\n\t/** Selected item text (StandardMenuTokens.ItemSelectedLabelTextColor) */\n\tselectedText: \"text-m3-on-tertiary-container\",\n\t/** Selected item icon (StandardMenuTokens.ItemSelectedLeadingIconColor) */\n\tselectedIcon: \"text-m3-on-tertiary-container\",\n\t/** Disabled opacity: 38% (StandardMenuTokens.ItemDisabledLabelTextOpacity) */\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n/**\n * Baseline color variant tokens.\n * Container uses SurfaceContainer, Selected uses SecondaryContainer.\n */\nexport const BASELINE_COLORS = {\n\tcontainerBg: \"bg-m3-surface-container\",\n\tlabelText: \"text-m3-on-surface\",\n\ticonColor: \"text-m3-on-surface-variant\",\n\tsupportingTextColor: \"text-m3-on-surface-variant\",\n\ttrailingSupportingTextColor: \"text-m3-on-surface-variant\",\n\ttrailingIconColor: \"text-m3-on-surface-variant\",\n\thoverLayer: \"hover:bg-m3-on-surface/8\",\n\tfocusLayer: \"focus:bg-m3-on-surface/12\",\n\tselectedBg: \"bg-m3-secondary-container\",\n\tselectedText: \"text-m3-on-secondary-container\",\n\tselectedIcon: \"text-m3-on-secondary-container\",\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n/**\n * Vibrant color variant tokens (TertiaryContainer-based).\n * Source: VibrantMenuTokens.kt\n *\n * Container: TertiaryContainer\n * Text: OnTertiaryContainer\n * Icons: OnTertiaryContainer\n * Selected container: Tertiary\n * Selected text/icons: OnTertiary\n */\nexport const VIBRANT_COLORS = {\n\t/** Group/popup container background (VibrantMenuTokens.ContainerColor) */\n\tcontainerBg: \"bg-m3-tertiary-container\",\n\t/** Label text color (VibrantMenuTokens.ItemLabelTextColor) */\n\tlabelText: \"text-m3-on-tertiary-container\",\n\t/** Leading/trailing icon color (VibrantMenuTokens.ItemLeadingIconColor) */\n\ticonColor: \"text-m3-on-tertiary-container\",\n\t/** Supporting text below label (VibrantMenuTokens.ItemSupportingTextColor) */\n\tsupportingTextColor: \"text-m3-on-tertiary-container\",\n\t/** Trailing supporting text (VibrantMenuTokens.ItemTrailingSupportingTextColor) */\n\ttrailingSupportingTextColor: \"text-m3-on-tertiary-container\",\n\t/** Trailing icon color (VibrantMenuTokens.ItemTrailingIconColor) */\n\ttrailingIconColor: \"text-m3-on-tertiary-container\",\n\t/** Hover state layer (OnTertiaryContainer @ 8% opacity) */\n\thoverLayer: \"hover:bg-m3-on-tertiary-container/8\",\n\t/** Focus state layer (OnTertiaryContainer @ 12% opacity) */\n\tfocusLayer: \"focus:bg-m3-on-tertiary-container/12\",\n\t/** Selected item background (VibrantMenuTokens.ItemSelectedContainerColor = Tertiary) */\n\tselectedBg: \"bg-m3-tertiary\",\n\t/** Selected item text (VibrantMenuTokens.ItemSelectedLabelTextColor = OnTertiary) */\n\tselectedText: \"text-m3-on-tertiary\",\n\t/** Selected item icon (VibrantMenuTokens.ItemSelectedLeadingIconColor = OnTertiary) */\n\tselectedIcon: \"text-m3-on-tertiary\",\n\t/** Disabled opacity: 38% (VibrantMenuTokens.ItemDisabledLabelTextOpacity) */\n\tdisabledOpacity: \"data-disabled:opacity-[0.38]\",\n} as const;\n\n// ─── Divider ──────────────────────────────────────────────────────────────────\n\n/**\n * HorizontalDivider padding: horizontal=12dp, vertical=2dp.\n * Source: MenuDefaults.HorizontalDividerPadding\n */\nexport const DIVIDER_PADDING = \"mx-3 my-0.5\"; // 12dp horizontal, 2dp vertical\nexport const DIVIDER_COLOR = \"bg-m3-outline-variant\";\n","// ─── MD3 Expressive Menu — ContextMenu (right-click / long-press) ─────────────\n// Wraps @radix-ui/react-context-menu and provides MenuContext with\n// menuPrimitive=\"context\" so MenuItem automatically selects ContextMenu primitives.\n//\n// Visual styling is identical to Menu — baseline or expressive variant.\n// Positioning, scroll lock, and outside click are all handled by Radix.\nimport * as RxContextMenu from \"@radix-ui/react-context-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./menu-animations\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tContextMenuContentProps,\n\tContextMenuProps,\n\tContextMenuTriggerProps,\n} from \"./menu-types\";\n\n// ─── ContextMenu (Root) ───────────────────────────────────────────────────────\n\n/**\n * Root of a context menu (right-click / long-press triggered popup).\n *\n * Wraps `@radix-ui/react-context-menu` Root and provides `MenuContext` with\n * `menuPrimitive=\"context\"` so nested `MenuItem` components automatically use\n * ContextMenu Radix primitives for correct accessibility and keyboard navigation.\n *\n * @example\n * // Baseline context menu\n * <ContextMenu variant=\"baseline\">\n * <ContextMenuTrigger asChild>\n * <div>Right-click me</div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <MenuItem>Copy</MenuItem>\n * <MenuItem>Paste</MenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * @example\n * // Expressive context menu with groups\n * <ContextMenu variant=\"expressive\">\n * <ContextMenuTrigger asChild><canvas /></ContextMenuTrigger>\n * <ContextMenuContent>\n * <MenuGroup>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * </MenuGroup>\n * <MenuGroup>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * </ContextMenuContent>\n * </ContextMenu>\n */\nexport function ContextMenu({\n\tchildren,\n\tvariant = \"baseline\",\n\tcolorVariant = \"standard\",\n}: ContextMenuProps) {\n\tconst [open, setOpen] = React.useState(false);\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant={variant}\n\t\t\tcolorVariant={colorVariant}\n\t\t\tmenuPrimitive=\"context\"\n\t\t\topen={open}\n\t\t\tonOpenChange={setOpen}\n\t\t>\n\t\t\t<RxContextMenu.Root onOpenChange={setOpen}>{children}</RxContextMenu.Root>\n\t\t</MenuProvider>\n\t);\n}\nContextMenu.displayName = \"ContextMenu\";\n\n// ─── ContextMenuTrigger ───────────────────────────────────────────────────────\n\n/**\n * The trigger area for a ContextMenu. Right-click (or long-press on touch)\n * within this area opens the context menu.\n *\n * Use `asChild` to apply trigger behavior to your own element without an\n * extra wrapper `<span>`.\n */\nexport const ContextMenuTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof RxContextMenu.Trigger>,\n\tContextMenuTriggerProps &\n\t\tReact.ComponentPropsWithoutRef<typeof RxContextMenu.Trigger>\n>(({ children, asChild = true, ...props }, ref) => (\n\t<RxContextMenu.Trigger ref={ref} asChild={asChild} {...props}>\n\t\t{children}\n\t</RxContextMenu.Trigger>\n));\nContextMenuTrigger.displayName = \"ContextMenuTrigger\";\n\n// ─── ContextMenuContent (popup panel) ─────────────────────────────────────────\n\n/**\n * The popup container for the context menu's contents.\n *\n * Renders into a portal via Radix. Uses Framer Motion `AnimatePresence` for\n * smooth enter/exit animations. Transform-origin is automatically set by\n * Radix via `--radix-context-menu-content-transform-origin`.\n *\n * Visual styling follows `variant` from `ContextMenuContext`:\n * - `baseline` → CornerExtraSmall (4px), standard M3 styling\n * - `expressive` → rounded-2xl, shape-morphing groups, elevation-2\n *\n * @param hasOverflow - Set true when using SubMenu to prevent clipping\n */\nexport const ContextMenuContent = React.forwardRef<\n\tReact.ComponentRef<typeof RxContextMenu.Content>,\n\tContextMenuContentProps &\n\t\tOmit<\n\t\t\tReact.ComponentPropsWithoutRef<typeof RxContextMenu.Content>,\n\t\t\t\"asChild\"\n\t\t>\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\thasOverflow = false,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\topen,\n\t\t\tvariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t\tconst colors =\n\t\t\tvariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isExpressiveGap =\n\t\t\tvariant === \"expressive\" && separatorStyle === \"gap\";\n\n\t\tconst containerClassName =\n\t\t\tvariant === \"expressive\"\n\t\t\t\t? cn(\n\t\t\t\t\t\t\"z-50 flex flex-col w-full\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tisExpressiveGap ? MENU_GROUP_GAP : \"\",\n\t\t\t\t\t\tisExpressiveGap ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"rounded-2xl\",\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"elevation-2\",\n\t\t\t\t\t\thasOverflow || isExpressiveGap\n\t\t\t\t\t\t\t? \"overflow-visible\"\n\t\t\t\t\t\t\t: \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)\n\t\t\t\t: cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\thasOverflow ? \"overflow-visible\" : \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t);\n\n\t\t// Helper to recursively flatten fragments\n\t\tconst flattenChildren = (nodes: React.ReactNode): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(nodes).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tlet renderedChildren: React.ReactNode = children;\n\n\t\tif (variant === \"expressive\") {\n\t\t\tconst validChildren = flattenChildren(children);\n\t\t\tconst groupCount = validChildren.length;\n\n\t\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\t\tReact.cloneElement(\n\t\t\t\t\tchild as React.ReactElement<{\n\t\t\t\t\t\tindex?: number;\n\t\t\t\t\t\tcount?: number;\n\t\t\t\t\t\tisGapVariant?: boolean;\n\t\t\t\t\t\tclassName?: string;\n\t\t\t\t\t}>,\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tcount: groupCount,\n\t\t\t\t\t\tisGapVariant: isExpressiveGap,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\trenderedChildren =\n\t\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"mx-3 my-0.5 h-px border-0 bg-m3-outline-variant\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, [])\n\t\t\t\t\t: enhancedChildren;\n\t\t}\n\n\t\treturn (\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<RxContextMenu.Portal forceMount>\n\t\t\t\t\t\t<RxContextMenu.Content ref={ref} asChild forceMount {...props}>\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.95, y: -4 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1, y: 0 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.95, y: -4 }}\n\t\t\t\t\t\t\t\ttransition={FAST_SPATIAL_SPRING}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(props.style as React.CSSProperties),\n\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\"var(--radix-context-menu-content-transform-origin)\",\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{renderedChildren}\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</RxContextMenu.Content>\n\t\t\t\t\t</RxContextMenu.Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\nContextMenuContent.displayName = \"ContextMenuContent\";\n","// ─── MD3 Expressive Menu — Root (Menu, MenuTrigger, MenuContent) ─────────────\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { MENU_CONTAINER_VARIANTS } from \"./menu-animations\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuContentProps,\n\tMenuGroupProps,\n\tMenuProps,\n\tMenuTriggerProps,\n} from \"./menu-types\";\n\n// ─── Menu (Root) ──────────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive Menu root component.\n *\n * Wraps Radix `DropdownMenu.Root` and provides `MenuContext` with `colorVariant`\n * and `open` state to all descendant MenuItem and MenuGroup components.\n *\n * @example\n * <Menu colorVariant=\"standard\">\n * <MenuTrigger asChild>\n * <IconButton name=\"more_vert\" />\n * </MenuTrigger>\n * <MenuContent>\n * <MenuGroup index={0} count={2}>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * </MenuGroup>\n * <MenuGroup index={1} count={2}>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * </MenuContent>\n * </Menu>\n */\nexport function Menu({\n\tchildren,\n\tvariant,\n\tmenuVariant,\n\tcolorVariant = \"standard\",\n\topen: controlledOpen,\n\tonOpenChange: controlledOnOpenChange,\n\tdefaultOpen,\n\t...props\n}: MenuProps &\n\tOmit<React.ComponentPropsWithoutRef<typeof DropdownMenu.Root>, \"children\">) {\n\t// Support deprecated menuVariant prop\n\tconst resolvedVariant = variant ?? menuVariant ?? \"baseline\";\n\n\t// Support both controlled and uncontrolled open state.\n\t// Initialize internalOpen from defaultOpen so that `defaultOpen={true}` works.\n\tconst [internalOpen, setInternalOpen] = React.useState(\n\t\t() => defaultOpen ?? false,\n\t);\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : internalOpen;\n\n\tconst handleOpenChange = React.useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) setInternalOpen(next);\n\t\t\tcontrolledOnOpenChange?.(next);\n\t\t},\n\t\t[isControlled, controlledOnOpenChange],\n\t);\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant={resolvedVariant}\n\t\t\tcolorVariant={colorVariant}\n\t\t\topen={open}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t>\n\t\t\t<DropdownMenu.Root\n\t\t\t\t{...props}\n\t\t\t\tdefaultOpen={defaultOpen}\n\t\t\t\topen={isControlled ? open : undefined}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DropdownMenu.Root>\n\t\t</MenuProvider>\n\t);\n}\nMenu.displayName = \"Menu\";\n\n// ─── MenuTrigger ──────────────────────────────────────────────────────────────\n\n/**\n * The trigger element that opens/closes the Menu.\n *\n * Use `asChild` to merge trigger behavior with your own element (e.g. a Button or IconButton).\n */\nexport const MenuTrigger = React.forwardRef<\n\tReact.ComponentRef<typeof DropdownMenu.Trigger>,\n\tMenuTriggerProps & React.ComponentPropsWithoutRef<typeof DropdownMenu.Trigger>\n>(({ children, asChild = true, ...props }, ref) => (\n\t<DropdownMenu.Trigger ref={ref} asChild={asChild} {...props}>\n\t\t{children}\n\t</DropdownMenu.Trigger>\n));\nMenuTrigger.displayName = \"MenuTrigger\";\n\n// ─── MenuContent (popup panel) ────────────────────────────────────────────────\n\n/**\n * The popup container for the menu's contents.\n *\n * Renders into a portal. Uses Radix `forceMount` + Framer Motion `AnimatePresence`\n * so the exit animation (scale + opacity via FastEffects) plays before the portal\n * unmounts. The `open` state is read from `MenuContext`.\n *\n * Transform-origin is automatically set via the Radix CSS variable\n * `--radix-dropdown-menu-content-transform-origin`.\n *\n * @param hasOverflow - Set true when using SubMenu to prevent clipping\n */\nexport const MenuContent = React.forwardRef<\n\tReact.ComponentRef<typeof DropdownMenu.Content>,\n\tMenuContentProps &\n\t\tOmit<React.ComponentPropsWithoutRef<typeof DropdownMenu.Content>, \"asChild\">\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tsideOffset = 6,\n\t\t\tside = \"bottom\",\n\t\t\talign = \"start\",\n\t\t\thasOverflow = false,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\topen,\n\t\t\tvariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t\t// Baseline always uses baseline colors; expressive uses colorVariant\n\t\tconst colors =\n\t\t\tvariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isExpressiveGap =\n\t\t\tvariant === \"expressive\" && separatorStyle === \"gap\";\n\n\t\t// Expressive variant: large rounded container with elevation (unless gap variant)\n\t\t// Baseline variant: CornerExtraSmall (4px) container\n\t\tconst containerClassName =\n\t\t\tvariant === \"expressive\"\n\t\t\t\t? cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tisExpressiveGap ? MENU_GROUP_GAP : \"\",\n\t\t\t\t\t\tisExpressiveGap ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"rounded-2xl\",\n\t\t\t\t\t\tisExpressiveGap ? \"\" : \"elevation-2\",\n\t\t\t\t\t\thasOverflow || isExpressiveGap\n\t\t\t\t\t\t\t? \"overflow-visible\"\n\t\t\t\t\t\t\t: \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)\n\t\t\t\t: cn(\n\t\t\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\thasOverflow ? \"overflow-visible\" : \"overflow-hidden\",\n\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t);\n\n\t\t// Helper to recursively flatten fragments\n\t\tconst flattenChildren = (nodes: React.ReactNode): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(nodes).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tlet renderedChildren: React.ReactNode = children;\n\n\t\tif (variant === \"expressive\") {\n\t\t\tconst validChildren = flattenChildren(children);\n\t\t\tconst groupCount = validChildren.length;\n\n\t\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\t\tReact.cloneElement(child as React.ReactElement<MenuGroupProps>, {\n\t\t\t\t\tindex: i,\n\t\t\t\t\tcount: groupCount,\n\t\t\t\t\tisGapVariant: isExpressiveGap,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\trenderedChildren =\n\t\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"mx-3 my-0.5 h-px border-0 bg-m3-outline-variant\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, [])\n\t\t\t\t\t: enhancedChildren;\n\t\t}\n\n\t\treturn (\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<DropdownMenu.Portal forceMount>\n\t\t\t\t\t\t<DropdownMenu.Content\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t\t\t\tside={side}\n\t\t\t\t\t\t\talign={align}\n\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\tforceMount\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t\t\tvariants={MENU_CONTAINER_VARIANTS}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t...(props.style as React.CSSProperties),\n\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\"var(--radix-dropdown-menu-content-transform-origin)\",\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{renderedChildren}\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</DropdownMenu.Content>\n\t\t\t\t\t</DropdownMenu.Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\nMenuContent.displayName = \"MenuContent\";\n","// ─── MD3 Expressive Menu — MenuDivider ───────────────────────────────────────\n// Spec: HorizontalDividerPadding = PaddingValues(horizontal = 12.dp, vertical = 2.dp)\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMenuContext } from \"./menu-context\";\nimport type { MenuDividerProps } from \"./menu-types\";\n\n/**\n * A horizontal divider for use between MenuItems or MenuGroups.\n *\n * Uses traditional line-based separation (as opposed to the gap-based\n * separation in MenuGroup, which is the Expressive default).\n *\n * Spec: horizontal=12dp padding, vertical=2dp padding, `outline-variant` color.\n *\n * @example\n * <MenuContent>\n * <MenuItem>Cut</MenuItem>\n * <MenuDivider />\n * <MenuItem>Paste</MenuItem>\n * </MenuContent>\n */\nexport const MenuDivider = React.forwardRef<HTMLHRElement, MenuDividerProps>(\n\t({ className, ...props }, ref) => {\n\t\tconst { menuVariant } = useMenuContext();\n\n\t\treturn (\n\t\t\t<DropdownMenu.Separator asChild>\n\t\t\t\t<hr\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Baseline: 8dp vertical margin, 0 horizontal. Expressive: 12dp horizontal, 2dp vertical\n\t\t\t\t\t\tmenuVariant === \"baseline\" ? \"my-2 mx-0\" : \"mx-3 my-0.5\",\n\t\t\t\t\t\t// 1px height line\n\t\t\t\t\t\t\"h-px border-0\",\n\t\t\t\t\t\t// outline-variant color\n\t\t\t\t\t\t\"bg-m3-outline-variant\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</DropdownMenu.Separator>\n\t\t);\n\t},\n);\nMenuDivider.displayName = \"MenuDivider\";\n","// ─── MD3 Expressive Menu — MenuGroup ────────────────────────────────────────\n// Gap-based grouping with shape morphing on hover (core Expressive feature)\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./menu-animations\";\n\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tGROUP_SHAPES,\n\tMENU_GROUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuGroupPosition,\n\tMenuGroupProps,\n\tMenuItemPosition,\n\tMenuItemProps,\n} from \"./menu-types\";\n\n// Extend MenuGroupProps with data-* attributes for testing and aria- attributes\ntype MenuGroupDivProps = MenuGroupProps & {\n\t[key: `data-${string}`]: string | undefined;\n\tid?: string;\n\t\"aria-label\"?: string;\n\t\"aria-labelledby\"?: string;\n};\n\n// ─── Position helper ──────────────────────────────────────────────────────────\n\nfunction getGroupPosition(index: number, count: number): MenuGroupPosition {\n\tif (count === 1) return \"standalone\";\n\tif (index === 0) return \"leading\";\n\tif (index === count - 1) return \"trailing\";\n\treturn \"middle\";\n}\n\nfunction getGroupActiveShape(position: MenuGroupPosition): string {\n\treturn GROUP_SHAPES[\n\t\t`${position}Active` as keyof typeof GROUP_SHAPES\n\t] as string;\n}\n\n// ─── MenuGroup ────────────────────────────────────────────────────────────────\n\n/**\n * A container that groups MenuItem elements with gap-based visual separation —\n * the defining feature of MD3 Expressive menus.\n *\n * Shape morphing: on hover, the container's border-radius transitions from the\n * \"inactive\" small shape to the \"active\" large shape via a FastSpatial spring.\n * The shape depends on the group's position (leading/middle/trailing/standalone).\n *\n * MenuItem children automatically receive `itemPosition` props based on their\n * index within the group.\n *\n * @example\n * <MenuContent>\n * <MenuGroup>\n * <MenuItem>Cut</MenuItem>\n * <MenuItem>Copy</MenuItem>\n * <MenuItem>Paste</MenuItem>\n * </MenuGroup>\n * <MenuGroup>\n * <MenuItem>Select All</MenuItem>\n * </MenuGroup>\n * </MenuContent>\n */\nexport const MenuGroup = React.forwardRef<HTMLDivElement, MenuGroupDivProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tlabel,\n\t\t\tindex = 0,\n\t\t\tcount = 1,\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tisGapVariant,\n\t\t\titemPosition,\n\t\t\tclassName,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tmenuVariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t\tisStatic,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst position = getGroupPosition(index, count);\n\t\tconst activeShape = getGroupActiveShape(position);\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst currentShape =\n\t\t\tisStatic || isHovered ? activeShape : GROUP_SHAPES.inactive;\n\n\t\tconst handlePointerEnter = React.useCallback(() => setIsHovered(true), []);\n\t\tconst handlePointerLeave = React.useCallback(() => setIsHovered(false), []);\n\n\t\t// Helper to recursively flatten fragments and collect valid elements.\n\t\t// This is necessary because cloneElement cannot be used on React.Fragment.\n\t\tconst flattenChildren = (\n\t\t\tchildren: React.ReactNode,\n\t\t): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(children).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\tconst validChildren = flattenChildren(children);\n\t\tconst itemCount = validChildren.length;\n\n\t\tconst enhancedChildren = validChildren.map((child, i) => {\n\t\t\tconst itemPosition: MenuItemPosition =\n\t\t\t\titemCount === 1\n\t\t\t\t\t? \"standalone\"\n\t\t\t\t\t: i === 0\n\t\t\t\t\t\t? \"leading\"\n\t\t\t\t\t\t: i === itemCount - 1\n\t\t\t\t\t\t\t? \"trailing\"\n\t\t\t\t\t\t\t: \"middle\";\n\n\t\t\treturn React.cloneElement(child as React.ReactElement<MenuItemProps>, {\n\t\t\t\titemPosition,\n\t\t\t\tcolorVariant,\n\t\t\t});\n\t\t});\n\n\t\treturn (\n\t\t\t<m.div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label={label}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative\",\n\t\t\t\t\t// In baseline variant, MenuGroup is transparent so it shouldn't clip.\n\t\t\t\t\t// In expressive variant, it needs overflow-hidden to clip hover states to its morphing shape.\n\t\t\t\t\tmenuVariant === \"baseline\" ? \"\" : \"overflow-hidden\",\n\t\t\t\t\t// Vertical padding: 2dp for gap variant (to match Figma), 4dp for baseline\n\t\t\t\t\tisGapVariant ? \"py-0.5\" : MENU_GROUP_PADDING_Y,\n\t\t\t\t\t// Horizontal padding: 4dp for expressive menus (both static and popup), 0 for baseline\n\t\t\t\t\tmenuVariant === \"expressive\" ? \"px-1\" : \"\",\n\t\t\t\t\t// Gap variant has floating segments, so each group manages its own shadow\n\t\t\t\t\tisGapVariant ? \"elevation-2\" : \"\",\n\t\t\t\t\t// Background based on color variant (transparent for baseline to avoid double-layering)\n\t\t\t\t\tmenuVariant === \"baseline\" ? \"bg-transparent\" : colors.containerBg,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tanimate={{ borderRadius: currentShape }}\n\t\t\t\ttransition={FAST_SPATIAL_SPRING}\n\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{/* Optional group label: labelSmall typography, 12dp horizontal padding */}\n\t\t\t\t{label && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t// Padding: 12dp top, 12dp horizontal, 8dp bottom (MD3 spec)\n\t\t\t\t\t\t\t\"block pt-3 px-3 pb-2\",\n\t\t\t\t\t\t\t\"text-label-small\",\n\t\t\t\t\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t\t\t\t\t? \"text-m3-on-surface-variant\"\n\t\t\t\t\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t\t\t\t\t? \"text-m3-on-tertiary-container\"\n\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{enhancedChildren}\n\t\t\t</m.div>\n\t\t);\n\t},\n);\nMenuGroup.displayName = \"MenuGroup\";\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","// ─── MD3 Expressive Menu — MenuItem ─────────────────────────────────────────\n// Shape morphing + Standard/Vibrant color variants + selection state\n// Animation: only selectable items animate the leading icon slot\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../icon\";\nimport { CHECK_ICON_VARIANTS, MENU_CHECK_ICON_SIZE } from \"./menu-animations\";\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tBASELINE_ITEM_SHAPE,\n\tITEM_SHAPE_CLASSES,\n\tMENU_BASELINE_ITEM_HORIZONTAL_PADDING,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuItemPosition,\n\tMenuItemProps,\n\tMenuVariant,\n} from \"./menu-types\";\n\n// ─── Shape helper ─────────────────────────────────────────────────────────────\n\nfunction getItemShapeClass(\n\tposition: MenuItemPosition,\n\tselected: boolean,\n\tisStatic: boolean = false,\n\tmenuVariant: MenuVariant = \"expressive\",\n): string {\n\tif (menuVariant === \"baseline\") return BASELINE_ITEM_SHAPE;\n\tif (selected) return ITEM_SHAPE_CLASSES.selected;\n\t// Vertical Menu standalone items have 12px border radius\n\tif (isStatic && position === \"standalone\") return \"rounded-[12px]\";\n\treturn ITEM_SHAPE_CLASSES[position];\n}\n\n// ─── MenuItem ─────────────────────────────────────────────────────────────────\n\n/**\n * An interactive item within a Menu or MenuGroup.\n *\n * ### Shape morphing\n * `itemPosition` (auto-set by MenuGroup) controls border-radius. When `selected=true`,\n * shape overrides to `CornerMedium (12px)` with a CSS transition.\n *\n * ### Leading icon animation\n * - **Selectable items** (`selected` prop defined): `AnimatePresence` swaps between\n * a check icon and the user `leadingIcon` using FastSpatial expand + FastEffects fade.\n * - **Static items** (`selected` prop undefined): `leadingIcon` renders at fixed width\n * with no enter/exit animation (matches Android's static rendering).\n *\n * ### Selected state\n * Container color transitions with `transition-colors duration-150` (maps to\n * Android's `animateColorAsState` with `FastEffects` spec).\n */\nexport const MenuItem = React.forwardRef<HTMLDivElement, MenuItemProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tleadingIcon,\n\t\t\ttrailingIcon,\n\t\t\tsupportingText,\n\t\t\ttrailingText,\n\t\t\tselected,\n\t\t\tdisabled = false,\n\t\t\titemPosition = \"standalone\",\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tkeepOpen = false,\n\t\t\tclassName,\n\t\t\tisSubTrigger,\n\t\t\tvalue,\n\t\t\trole,\n\t\t\t...rest\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tmenuVariant,\n\t\t\tcolorVariant: contextColorVariant,\n\t\t\tmenuPrimitive,\n\t\t} = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t? BASELINE_COLORS\n\t\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t\t: STANDARD_COLORS;\n\n\t\tconst isStaticMenu = menuPrimitive === \"static\";\n\t\tconst shapeClass = getItemShapeClass(\n\t\t\titemPosition,\n\t\t\t!!selected,\n\t\t\tisStaticMenu,\n\t\t\tmenuVariant,\n\t\t);\n\n\t\t// A selectable item is one where `selected` prop is explicitly passed\n\t\t// (even if false). Non-selectable items do not animate the leading slot.\n\t\tconst isSelectable = selected !== undefined && !isSubTrigger;\n\n\t\t// Determine which Radix primitive to use based on selection state and role\n\t\tconst isCheckbox =\n\t\t\trole === \"menuitemcheckbox\" ||\n\t\t\t(selected !== undefined && !role && !isSubTrigger);\n\t\tconst isRadio = role === \"menuitemradio\";\n\n\t\t// Select the correct Radix primitive based on which menu family is active.\n\t\t// static → Slot (plain HTML, manages own ARIA)\n\t\t// context → @radix-ui/react-context-menu primitives\n\t\t// dropdown (default) → @radix-ui/react-dropdown-menu primitives\n\t\tconst ItemPrimitive =\n\t\t\tisStaticMenu || isSubTrigger\n\t\t\t\t? Slot\n\t\t\t\t: menuPrimitive === \"context\"\n\t\t\t\t\t? ((isCheckbox\n\t\t\t\t\t\t\t? ContextMenu.CheckboxItem\n\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t? ContextMenu.RadioItem\n\t\t\t\t\t\t\t\t: ContextMenu.Item) as React.ElementType)\n\t\t\t\t\t: ((isCheckbox\n\t\t\t\t\t\t\t? DropdownMenu.CheckboxItem\n\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t? DropdownMenu.RadioItem\n\t\t\t\t\t\t\t\t: DropdownMenu.Item) as React.ElementType);\n\n\t\treturn (\n\t\t\t<ItemPrimitive\n\t\t\t\tref={ref}\n\t\t\t\t{...(isStaticMenu || isSubTrigger\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t\trole ||\n\t\t\t\t\t\t\t\t(isCheckbox\n\t\t\t\t\t\t\t\t\t? \"menuitemcheckbox\"\n\t\t\t\t\t\t\t\t\t: isRadio\n\t\t\t\t\t\t\t\t\t\t? \"menuitemradio\"\n\t\t\t\t\t\t\t\t\t\t: \"menuitem\"),\n\t\t\t\t\t\t\t\"aria-checked\": isCheckbox || isRadio ? !!selected : undefined,\n\t\t\t\t\t\t\t\"aria-disabled\": disabled ? true : undefined,\n\t\t\t\t\t\t\ttabIndex: disabled ? -1 : 0,\n\t\t\t\t\t\t\tonKeyDown: (e: React.KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tonClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonClick,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t\tonSelect: keepOpen ? (e: Event) => e.preventDefault() : undefined,\n\t\t\t\t\t\t\tonClick,\n\t\t\t\t\t\t\t...(isCheckbox || isRadio ? { checked: !!selected } : {}),\n\t\t\t\t\t\t\t...(isRadio ? { value: value ?? \"\" } : {}),\n\t\t\t\t\t\t\tasChild: true,\n\t\t\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t// Role provided by Radix primitives via asChild, or manually set when static\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Layout\n\t\t\t\t\t\t\"relative flex w-full cursor-pointer select-none items-center outline-none\",\n\t\t\t\t\t\t// Sizing: min-h 48dp, min-w 112dp, max-w 280dp\n\t\t\t\t\t\t\"min-h-12 min-w-28 max-w-70\",\n\t\t\t\t\t\t// Horizontal padding\n\t\t\t\t\t\tmenuVariant === \"baseline\"\n\t\t\t\t\t\t\t? MENU_BASELINE_ITEM_HORIZONTAL_PADDING\n\t\t\t\t\t\t\t: \"px-4\",\n\t\t\t\t\t\t// Spacing between items\n\t\t\t\t\t\tisStaticMenu ? \"my-0.5\" : \"\",\n\t\t\t\t\t\t// Shape morphing (position-based + selected override)\n\t\t\t\t\t\tshapeClass,\n\t\t\t\t\t\t// Animate border-radius AND background-color together (FastEffects: 150ms)\n\t\t\t\t\t\t\"transition-[border-radius,background-color] duration-150 ease-in\",\n\t\t\t\t\t\t// Colors based on variant + selection\n\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t? cn(colors.selectedBg, colors.selectedText)\n\t\t\t\t\t\t\t: cn(colors.labelText),\n\t\t\t\t\t\t// State layers (only on unselected items)\n\t\t\t\t\t\t!selected && colors.hoverLayer,\n\t\t\t\t\t\t!selected && colors.focusLayer,\n\t\t\t\t\t\t// Focus visible ring (WCAG 2.4.11 — visible focus indicator)\n\t\t\t\t\t\t// Uses ring-inset so the ring doesn't overflow the item bounds.\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t\t\t\t// Disabled\n\t\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...rest}\n\t\t\t\t>\n\t\t\t\t\t{/* ── Leading slot ── */}\n\t\t\t\t\t{(isSelectable || leadingIcon) && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex h-5 w-5 shrink-0 items-center justify-center mr-3\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelectable ? (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false} mode=\"wait\">\n\t\t\t\t\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\tkey=\"check\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tcolors.selectedIcon,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tvariants={CHECK_ICON_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"check\" fill={1} size={MENU_CHECK_ICON_SIZE} />\n\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t) : leadingIcon ? (\n\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tcolors.iconColor,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tvariants={CHECK_ICON_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{leadingIcon}\n\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t// Spacer for selectable items with no icon, to keep text aligned\n\t\t\t\t\t\t\t\t\t\t<div className=\"w-5\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t// Static icon for non-selectable items\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full items-center justify-center\",\n\t\t\t\t\t\t\t\t\t\tcolors.iconColor,\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{leadingIcon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* ── Label + Supporting Text ── */}\n\t\t\t\t\t<span className=\"flex flex-1 flex-col\">\n\t\t\t\t\t\t<span className=\"text-body-large leading-snug\">{children}</span>\n\t\t\t\t\t\t{supportingText && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-body-medium leading-snug\",\n\t\t\t\t\t\t\t\t\t// Source: StandardMenuTokens.ItemSupportingTextColor / VibrantMenuTokens\n\t\t\t\t\t\t\t\t\tselected ? colors.selectedText : colors.supportingTextColor,\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{supportingText}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* ── Trailing: shortcut text OR trailing icon ── */}\n\t\t\t\t\t{(trailingText || trailingIcon) && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t// Minimum 12dp gap from label column (ListTokens)\n\t\t\t\t\t\t\t\t\"ml-3 flex shrink-0 items-center\",\n\t\t\t\t\t\t\t\t// Source: StandardMenuTokens.ItemTrailingIconColor / VibrantMenuTokens\n\t\t\t\t\t\t\t\tselected ? colors.selectedText : colors.trailingIconColor,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden={trailingIcon ? \"true\" : undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailingText ? (\n\t\t\t\t\t\t\t\t<span className=\"text-label-small tracking-wider\">\n\t\t\t\t\t\t\t\t\t{trailingText}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\ttrailingIcon\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</ItemPrimitive>\n\t\t);\n\t},\n);\nMenuItem.displayName = \"MenuItem\";\n","// ─── MD3 Expressive Menu — SubMenu ───────────────────────────────────────────\n// Nested sub-menu triggered by hover/keyboard on a MenuItem\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../icon\";\nimport { SUBMENU_CONTAINER_VARIANTS } from \"./menu-animations\";\nimport { useMenuContext } from \"./menu-context\";\nimport {\n\tBASELINE_COLORS,\n\tMENU_CONTAINER_SHAPE,\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tMENU_POPUP_PADDING_Y,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuColorVariant,\n\tMenuItemProps,\n\tSubMenuProps,\n} from \"./menu-types\";\n\n/**\n * A nested SubMenu that opens from a trigger MenuItem.\n *\n * Keyboard: ArrowRight opens, ArrowLeft/Escape closes (handled by Radix).\n * The parent MenuContent should set `hasOverflow={true}` when SubMenus are used.\n *\n * ### Hover delays\n * `hoverOpenDelay` (default: 200ms) — time before the submenu opens on hover.\n * `hoverCloseDelay` (default: 300ms) — time before the submenu closes after pointer-leave.\n * These delays allow the user to safely move diagonally from trigger to submenu content\n * without accidental close (safe polygon behavior from Radix still applies).\n *\n * @example\n * <MenuContent hasOverflow>\n * <SubMenu\n * trigger={\n * <MenuItem trailingIcon={<Icon name=\"chevron_right\" size={20} />}>\n * Share\n * </MenuItem>\n * }\n * >\n * <MenuItem>Via Email</MenuItem>\n * <MenuItem>Via Link</MenuItem>\n * </SubMenu>\n * </MenuContent>\n */\nexport function SubMenu({\n\tchildren,\n\ttrigger,\n\tside = \"right\",\n\tcolorVariant: propColorVariant,\n\thoverOpenDelay = 200,\n\thoverCloseDelay = 300,\n}: SubMenuProps) {\n\tconst { colorVariant: contextColorVariant, menuPrimitive } = useMenuContext();\n\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\n\t// Controlled open state for hover delay support.\n\t// Note: We use Radix's controlled mode carefully — Radix still handles keyboard\n\t// and the safe polygon logic internally when we pass open/onOpenChange.\n\tconst [open, setOpen] = React.useState(false);\n\tconst openTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t);\n\n\tconst clearTimers = React.useCallback(() => {\n\t\tif (openTimerRef.current) clearTimeout(openTimerRef.current);\n\t\tif (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n\t}, []);\n\n\tconst handleTriggerPointerEnter = React.useCallback(() => {\n\t\tclearTimers();\n\t\topenTimerRef.current = setTimeout(() => setOpen(true), hoverOpenDelay);\n\t}, [hoverOpenDelay, clearTimers]);\n\n\tconst handleTriggerPointerLeave = React.useCallback(() => {\n\t\tclearTimers();\n\t\tcloseTimerRef.current = setTimeout(() => setOpen(false), hoverCloseDelay);\n\t}, [hoverCloseDelay, clearTimers]);\n\n\tconst handleContentPointerEnter = React.useCallback(() => {\n\t\t// Keep open when pointer moves into the submenu content\n\t\tclearTimers();\n\t}, [clearTimers]);\n\n\tconst handleContentPointerLeave = React.useCallback(() => {\n\t\tclearTimers();\n\t\tcloseTimerRef.current = setTimeout(() => setOpen(false), hoverCloseDelay);\n\t}, [hoverCloseDelay, clearTimers]);\n\n\t// Cleanup timers on unmount\n\tReact.useEffect(() => () => clearTimers(), [clearTimers]);\n\n\t// Select the correct Radix Sub primitives based on which menu family is active.\n\tconst Sub = menuPrimitive === \"context\" ? ContextMenu.Sub : DropdownMenu.Sub;\n\tconst SubTrigger =\n\t\tmenuPrimitive === \"context\"\n\t\t\t? ContextMenu.SubTrigger\n\t\t\t: DropdownMenu.SubTrigger;\n\tconst SubContent =\n\t\tmenuPrimitive === \"context\"\n\t\t\t? ContextMenu.SubContent\n\t\t\t: DropdownMenu.SubContent;\n\tconst Portal =\n\t\tmenuPrimitive === \"context\" ? ContextMenu.Portal : DropdownMenu.Portal;\n\n\treturn (\n\t\t<Sub open={open} onOpenChange={setOpen}>\n\t\t\t{/* SubTrigger renders its own element (no asChild) so it can correctly\n\t\t\t * compute the bounding box for SubContent positioning. */}\n\t\t\t<SubTrigger\n\t\t\t\tclassName=\"w-full outline-none\"\n\t\t\t\tonPointerEnter={handleTriggerPointerEnter}\n\t\t\t\tonPointerLeave={handleTriggerPointerLeave}\n\t\t\t>\n\t\t\t\t{React.isValidElement(trigger)\n\t\t\t\t\t? React.cloneElement(trigger as React.ReactElement<MenuItemProps>, {\n\t\t\t\t\t\t\tisSubTrigger: true,\n\t\t\t\t\t\t\t// Auto-add chevron if missing\n\t\t\t\t\t\t\ttrailingIcon: (trigger.props as MenuItemProps).trailingIcon || (\n\t\t\t\t\t\t\t\t<Icon name=\"chevron_right\" size={20} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t})\n\t\t\t\t\t: trigger}\n\t\t\t</SubTrigger>\n\n\t\t\t{/* SubMenu popup */}\n\t\t\t<AnimatePresence>\n\t\t\t\t{open && (\n\t\t\t\t\t<Portal forceMount>\n\t\t\t\t\t\t<SubContent\n\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\talignOffset={-4}\n\t\t\t\t\t\t\tforceMount\n\t\t\t\t\t\t\tclassName=\"outline-none\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SubMenuContent\n\t\t\t\t\t\t\t\tside={side}\n\t\t\t\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\t\t\t\tonPointerEnter={handleContentPointerEnter}\n\t\t\t\t\t\t\t\tonPointerLeave={handleContentPointerLeave}\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</SubMenuContent>\n\t\t\t\t\t\t</SubContent>\n\t\t\t\t\t</Portal>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</Sub>\n\t);\n}\nSubMenu.displayName = \"SubMenu\";\n\n/**\n * Inner wrapper to handle animations.\n */\nfunction SubMenuContent({\n\tchildren,\n\tside,\n\tcolorVariant: propColorVariant,\n\tonPointerEnter,\n\tonPointerLeave,\n}: {\n\tchildren: React.ReactNode;\n\tside: \"left\" | \"right\";\n\tcolorVariant?: MenuColorVariant;\n\tonPointerEnter?: React.PointerEventHandler<HTMLDivElement>;\n\tonPointerLeave?: React.PointerEventHandler<HTMLDivElement>;\n}) {\n\tconst { menuVariant, colorVariant: contextColorVariant } = useMenuContext();\n\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\tconst colors =\n\t\tmenuVariant === \"baseline\"\n\t\t\t? BASELINE_COLORS\n\t\t\t: colorVariant === \"vibrant\"\n\t\t\t\t? VIBRANT_COLORS\n\t\t\t\t: STANDARD_COLORS;\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"menu\"\n\t\t\taria-orientation=\"vertical\"\n\t\t\tonPointerEnter={onPointerEnter}\n\t\t\tonPointerLeave={onPointerLeave}\n\t\t\tclassName={cn(\n\t\t\t\t\"z-50 flex flex-col\",\n\t\t\t\t// Width constraints\n\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t// Vertical padding: 8dp\n\t\t\t\tMENU_POPUP_PADDING_Y,\n\t\t\t\t// Gap between groups: 2dp\n\t\t\t\tMENU_GROUP_GAP,\n\t\t\t\t// Container background\n\t\t\t\tcolors.containerBg,\n\t\t\t\t// Container shape: CornerExtraSmall (4px)\n\t\t\t\tMENU_CONTAINER_SHAPE,\n\t\t\t\t// Elevation-2 shadow\n\t\t\t\t\"elevation-2\",\n\t\t\t\t// Overflow clip\n\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\"outline-none\",\n\t\t\t)}\n\t\t\tvariants={SUBMENU_CONTAINER_VARIANTS}\n\t\t\tinitial=\"hidden\"\n\t\t\tanimate=\"visible\"\n\t\t\texit=\"exit\"\n\t\t\tstyle={{\n\t\t\t\ttransformOrigin: side === \"right\" ? \"top left\" : \"top right\",\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</m.div>\n\t);\n}\nSubMenuContent.displayName = \"SubMenuContent\";\n","// ─── MD3 Expressive Menu — Vertical Menu (always-visible static variant) ──────\n// Spec: SegmentedMenuTokens + MenuDefaults — two sub-variants:\n// • Gap → gap-0.5 (2dp) between groups, no divider line\n// • Divider → outline-variant <hr> between groups\n//\n// Key difference from Menu (baseline):\n// • No portal, no popup animation, no trigger\n// • Always rendered (static)\n// • Shape morphing on hover works identically (reuses MenuGroup)\n// • Still provides MenuContext with isStatic=true so MenuItems know to use Slot\n//\n// Vertical Menu Gap architecture:\n// • Outer container: NO overflow-hidden (would clip group shape morphing!)\n// Instead, elevation shadow is applied here, bg is transparent.\n// • Each MenuGroup manages its own background + border-radius via Framer Motion.\n// • The 2dp gap between groups is transparent — page background shows through.\n//\n// Vertical Menu Divider architecture:\n// • Outer container applies containerBg + overflow-hidden + rounded-2xl\n// (groups inside all stay flush, no shape morph needed for divider variant).\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { MenuProvider, useMenuContext } from \"./menu-context\";\nimport { MenuGroup } from \"./menu-group\";\nimport {\n\tMENU_GROUP_GAP,\n\tMENU_MAX_WIDTH,\n\tMENU_MIN_WIDTH,\n\tSTANDARD_COLORS,\n\tVIBRANT_COLORS,\n} from \"./menu-tokens\";\nimport type {\n\tMenuGroupProps,\n\tVerticalMenuContentProps,\n\tVerticalMenuDividerProps,\n\tVerticalMenuProps,\n\tVerticalMenuSeparatorStyle,\n} from \"./menu-types\";\n\n// ─── VerticalMenuDivider ──────────────────────────────────────────────────────\n\n/**\n * A plain horizontal divider for use between groups in a VerticalMenuContent\n * with `separatorStyle=\"divider\"`.\n *\n * Uses the same visual spec as MenuDivider (outline-variant color, 12dp\n * horizontal padding, 2dp vertical padding) but is a plain `<hr>` — no Radix\n * dependency, safe inside static (non-popup) contexts.\n *\n * @example\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuDivider />\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n */\nexport const VerticalMenuDivider = React.forwardRef<\n\tHTMLHRElement,\n\tVerticalMenuDividerProps & React.HTMLAttributes<HTMLHRElement>\n>(({ className, index, count, isGapVariant, ...props }, ref) => (\n\t<hr\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t// HorizontalDividerPadding: horizontal=12dp, vertical=2dp\n\t\t\t\"mx-3 my-0.5\",\n\t\t\t// 1px height, no default border\n\t\t\t\"h-px border-0\",\n\t\t\t// Source: MenuDefaults.HorizontalDividerPadding / outline-variant\n\t\t\t\"bg-m3-outline-variant\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nVerticalMenuDivider.displayName = \"VerticalMenuDivider\";\n\n// ─── VerticalMenuGroup ────────────────────────────────────────────────────────\n\n/**\n * A group within a VerticalMenu.\n *\n * Functionally identical to `MenuGroup` — shape morphing on hover, auto-injected\n * `itemPosition` into MenuItem children, `colorVariant` from context.\n *\n * This component is a named re-export of `MenuGroup` so consumers of Vertical\n * Menu have a semantically clear API without any code duplication.\n */\nexport const VerticalMenuGroup = MenuGroup;\n\n// ─── VerticalMenuContent ──────────────────────────────────────────────────────\n\n/**\n * Renders a vertical list of VerticalMenuGroup children.\n *\n * Handles two separation styles:\n * - `gap` → 2dp (`gap-0.5`) visual gap between groups (default)\n * - `divider` → auto-inserts a `VerticalMenuDivider` between each pair of groups\n *\n * Auto-injects `index` and `count` props into VerticalMenuGroup children so\n * that position-based shape morphing (leading/middle/trailing) works correctly.\n *\n * @example\n * // Gap variant (default)\n * <VerticalMenuContent separatorStyle=\"gap\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n *\n * @example\n * // Divider variant\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n */\nexport const VerticalMenuContent = React.forwardRef<\n\tHTMLDivElement,\n\tVerticalMenuContentProps & React.HTMLAttributes<HTMLDivElement>\n>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tseparatorStyle = \"gap\",\n\t\t\tcolorVariant: propColorVariant,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { colorVariant: contextColorVariant } = useMenuContext();\n\t\tconst colorVariant = propColorVariant ?? contextColorVariant;\n\t\tconst colors =\n\t\t\tcolorVariant === \"vibrant\" ? VIBRANT_COLORS : STANDARD_COLORS;\n\n\t\t// Helper to recursively flatten fragments and collect valid elements.\n\t\t// This is necessary because cloneElement cannot be used on React.Fragment.\n\t\tconst flattenChildren = (\n\t\t\tchildren: React.ReactNode,\n\t\t): React.ReactElement[] => {\n\t\t\treturn React.Children.toArray(children).reduce(\n\t\t\t\t(acc: React.ReactElement[], child) => {\n\t\t\t\t\tif (React.isValidElement(child)) {\n\t\t\t\t\t\tif (child.type === React.Fragment) {\n\t\t\t\t\t\t\treturn acc.concat(\n\t\t\t\t\t\t\t\tflattenChildren(\n\t\t\t\t\t\t\t\t\t(child as React.ReactElement<{ children?: React.ReactNode }>)\n\t\t\t\t\t\t\t\t\t\t.props.children,\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\tacc.push(child as React.ReactElement);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t[],\n\t\t\t);\n\t\t};\n\n\t\t// Collect only valid VerticalMenuGroup-like elements for index/count injection\n\t\tconst validChildren = flattenChildren(children);\n\t\tconst groupCount = validChildren.length;\n\n\t\t// Auto-inject `index` and `count` into each child (enables leading/middle/trailing shape)\n\t\tconst enhancedChildren = validChildren.map((child, i) =>\n\t\t\tReact.cloneElement(child as React.ReactElement<MenuGroupProps>, {\n\t\t\t\tindex: i,\n\t\t\t\tcount: groupCount,\n\t\t\t\tisGapVariant: separatorStyle === \"gap\",\n\t\t\t}),\n\t\t);\n\n\t\t// For divider style: interleave VerticalMenuDivider between each group\n\t\tconst renderedChildren =\n\t\t\tseparatorStyle === \"divider\"\n\t\t\t\t? enhancedChildren.reduce<React.ReactNode[]>((acc, child, i) => {\n\t\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t\tacc.push(\n\t\t\t\t\t\t\t\t<VerticalMenuDivider\n\t\t\t\t\t\t\t\t\tkey={`divider-${(child as React.ReactElement).key || i}`}\n\t\t\t\t\t\t\t\t/>,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tacc.push(child);\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}, [])\n\t\t\t\t: enhancedChildren;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col w-full\",\n\t\t\t\t\t// Gap variant: transparent background + 2dp gap — page bg shows through gaps.\n\t\t\t\t\t// Divider variant: solid container background behind all groups.\n\t\t\t\t\tseparatorStyle === \"gap\"\n\t\t\t\t\t\t? cn(\"bg-transparent\", MENU_GROUP_GAP)\n\t\t\t\t\t\t: colors.containerBg,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{renderedChildren}\n\t\t\t</div>\n\t\t);\n\t},\n);\nVerticalMenuContent.displayName = \"VerticalMenuContent\";\n\n// ─── VerticalMenu (Root) ──────────────────────────────────────────────────────\n\n/**\n * Root of an always-visible vertical menu.\n *\n * Wraps children in `MenuProvider` (always `open={true}`) so MenuItem and\n * MenuGroup components receive the correct `colorVariant` from context.\n *\n * Unlike the popup `Menu` component, there is no Radix DropdownMenu, no portal,\n * and no enter/exit animation — the list is statically rendered at all times.\n *\n * ### Shape morphing\n * For the **gap variant**, the outer container has NO `overflow-hidden` — this is\n * intentional! Each `VerticalMenuGroup` manages its own shape via Framer Motion's\n * `animate.borderRadius`. `overflow-hidden` on the parent would clip these\n * morphing corners. The 2dp transparent gap lets page background show through.\n *\n * For the **divider variant**, the outer container applies `overflow-hidden` +\n * `rounded-2xl` + background — groups sit flush inside without morphing.\n *\n * @example\n * // Vertical Menu with Gap (floating segments)\n * <VerticalMenu colorVariant=\"standard\">\n * <VerticalMenuContent separatorStyle=\"gap\">\n * <VerticalMenuGroup>\n * <MenuItem leadingIcon={<Icon name=\"visibility\" size={20} />}>Item 1</MenuItem>\n * <MenuItem leadingIcon={<Icon name=\"content_copy\" size={20} />} trailingText=\"⌘C\">Item 2</MenuItem>\n * <MenuItem selected leadingIcon={<Icon name=\"edit\" size={20} />}>Item 3</MenuItem>\n * </VerticalMenuGroup>\n * <VerticalMenuGroup>\n * <MenuItem trailingIcon={<Icon name=\"chevron_right\" size={20} />}>Item 4</MenuItem>\n * </VerticalMenuGroup>\n * </VerticalMenuContent>\n * </VerticalMenu>\n *\n * @example\n * // Vertical Menu with Divider\n * <VerticalMenu colorVariant=\"standard\">\n * <VerticalMenuContent separatorStyle=\"divider\">\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * <VerticalMenuGroup>...</VerticalMenuGroup>\n * </VerticalMenuContent>\n * </VerticalMenu>\n */\nexport const VerticalMenu = React.forwardRef<\n\tHTMLDivElement,\n\tVerticalMenuProps & React.HTMLAttributes<HTMLDivElement>\n>(({ children, colorVariant = \"standard\", className, ...props }, ref) => {\n\t// Vertical menus are always visible — `open` is a permanent true.\n\t// onOpenChange is a no-op (no controlled/uncontrolled toggle needed).\n\tconst noop = React.useCallback(() => {}, []);\n\n\tconst colors = colorVariant === \"vibrant\" ? VIBRANT_COLORS : STANDARD_COLORS;\n\n\t// Internal ref for keyboard navigation — merged with forwarded ref.\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst mergedRef = React.useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\t(containerRef as React.MutableRefObject<HTMLDivElement | null>).current =\n\t\t\t\tnode;\n\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\telse if (ref)\n\t\t\t\t(ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n\t\t},\n\t\t[ref],\n\t);\n\n\t// Arrow key navigation: WAI-ARIA composite widget pattern.\n\t// Moves focus among menuitem elements, skipping disabled ones.\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (!containerRef.current) return;\n\t\t\tconst items = Array.from(\n\t\t\t\tcontainerRef.current.querySelectorAll<HTMLElement>(\n\t\t\t\t\t'[role=\"menuitem\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"]),' +\n\t\t\t\t\t\t'[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"]),' +\n\t\t\t\t\t\t'[role=\"menuitemradio\"]:not([aria-disabled=\"true\"]):not([tabindex=\"-1\"])',\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (!items.length) return;\n\t\t\tconst idx = items.indexOf(document.activeElement as HTMLElement);\n\t\t\tlet next: number | null = null;\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = idx < items.length - 1 ? idx + 1 : 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = idx > 0 ? idx - 1 : items.length - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tnext = items.length - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (next !== null) items[next]?.focus();\n\t\t},\n\t\t[],\n\t);\n\n\t// Detect separator style from VerticalMenuContent child to decide container styling.\n\tconst separatorStyle = detectSeparatorStyle(children);\n\tconst isGapVariant = separatorStyle !== \"divider\";\n\n\treturn (\n\t\t<MenuProvider\n\t\t\tvariant=\"expressive\"\n\t\t\tcolorVariant={colorVariant}\n\t\t\tmenuPrimitive=\"static\"\n\t\t\topen={true}\n\t\t\tonOpenChange={noop}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={mergedRef}\n\t\t\t\trole=\"menu\"\n\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Width constraints: 112dp min, 280dp max (MenuTokens)\n\t\t\t\t\tMENU_MIN_WIDTH,\n\t\t\t\t\tMENU_MAX_WIDTH,\n\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\tisGapVariant\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t// GAP VARIANT: NO overflow-hidden — groups must morph freely.\n\t\t\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\t\t\t// NO background — transparent between segments.\n\t\t\t\t\t\t\t\t// NO rounded corners — each group manages its own shape.\n\t\t\t\t\t\t\t\t// Elevation is managed by each individual group.\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t// DIVIDER VARIANT: Container clips the content.\n\t\t\t\t\t\t\t\t\"rounded-2xl\",\n\t\t\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\t\t\tcolors.containerBg,\n\t\t\t\t\t\t\t\t\"elevation-2\",\n\t\t\t\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</MenuProvider>\n\t);\n});\nVerticalMenu.displayName = \"VerticalMenu\";\n\n// ─── Helper ───────────────────────────────────────────────────────────────────\n\n/**\n * Inspects the `separatorStyle` prop from the first VerticalMenuContent child.\n * Used by VerticalMenu root to decide container styling.\n */\nfunction detectSeparatorStyle(\n\tchildren: React.ReactNode,\n): VerticalMenuSeparatorStyle {\n\tconst child = React.Children.toArray(children).find(React.isValidElement);\n\tif (child) {\n\t\tconst style = (\n\t\t\tchild.props as { separatorStyle?: VerticalMenuSeparatorStyle }\n\t\t).separatorStyle;\n\t\tif (style) return style;\n\t}\n\treturn \"gap\";\n}\n","/**\n * @file app-bar-overflow-indicator.tsx\n * MD3 Expressive App Bar Overflow Indicator.\n *\n * Renders a \"More\" (more_vert) icon button that opens a Radix UI\n * DropdownMenu containing overflow App Bar items.\n *\n * Used internally by <AppBarRow> and <AppBarColumn> when items exceed\n * the visible count.\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { Menu, MenuContent, MenuItem, MenuTrigger } from \"../menu\";\nimport { APP_BAR_COLORS, AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarItem, AppBarOverflowIndicatorProps } from \"./app-bar.types\";\n\n/** More vert icon for the overflow trigger button. */\nfunction MoreVertIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tmore_vert\n\t\t</span>\n\t);\n}\n\n/**\n * Renders a single overflow item in the dropdown based on its type.\n */\nfunction OverflowItem({ item }: { item: AppBarItem }) {\n\tif (item.type === \"toggleable\") {\n\t\treturn (\n\t\t\t<MenuItem\n\t\t\t\trole=\"menuitemcheckbox\"\n\t\t\t\tselected={item.checked ?? false}\n\t\t\t\tonClick={() => item.onCheckedChange?.(!item.checked)}\n\t\t\t\tdisabled={item.enabled === false}\n\t\t\t>\n\t\t\t\t{item.label}\n\t\t\t</MenuItem>\n\t\t);\n\t}\n\n\tif (item.type === \"custom\" && item.menuContent) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{item.menuContent({\n\t\t\t\t\tisOpen: true,\n\t\t\t\t\topen: () => {},\n\t\t\t\t\tclose: () => {},\n\t\t\t\t})}\n\t\t\t</>\n\t\t);\n\t}\n\n\t// Default: clickable\n\treturn (\n\t\t<MenuItem onClick={item.onClick} disabled={item.enabled === false}>\n\t\t\t{item.label}\n\t\t</MenuItem>\n\t);\n}\n\n/**\n * MD3 App Bar Overflow Indicator.\n *\n * Renders a \"more_vert\" button that opens a dropdown menu\n * with overflow action items.\n */\nexport function AppBarOverflowIndicator({\n\titems,\n\tclassName,\n}: AppBarOverflowIndicatorProps) {\n\tif (items.length === 0) return null;\n\n\treturn (\n\t\t<Menu>\n\t\t\t<MenuTrigger asChild>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center rounded-full\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\tcolor: APP_BAR_COLORS.actionIcon,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label=\"More actions\"\n\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t>\n\t\t\t\t\t<MoreVertIcon />\n\t\t\t\t</button>\n\t\t\t</MenuTrigger>\n\n\t\t\t<MenuContent align=\"end\" sideOffset={4}>\n\t\t\t\t{items.map((item, index) => (\n\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: static list from props\n\t\t\t\t\t<OverflowItem key={index} item={item} />\n\t\t\t\t))}\n\t\t\t</MenuContent>\n\t\t</Menu>\n\t);\n}\n","/**\n * @file app-bar-column.tsx\n * MD3 Expressive App Bar Column DSL.\n *\n * Displays App Bar action items in a vertical column.\n * Overflow items collapse into a dropdown menu.\n *\n * @see docs/m3/app-bars/AppBarColumn.kt\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarColumnProps } from \"./app-bar.types\";\nimport { AppBarItemButton } from \"./app-bar-item-button\";\nimport { AppBarOverflowIndicator } from \"./app-bar-overflow-indicator\";\n\n/**\n * MD3 Expressive App Bar Column.\n *\n * Renders action items in a vertical column. Commonly used in\n * side navigation or rail-style App Bars.\n *\n * @example\n * ```tsx\n * <AppBarColumn\n * maxItemCount={3}\n * items={[\n * { type: 'clickable', icon: <Icon>edit</Icon>, label: 'Edit', onClick: handleEdit },\n * { type: 'clickable', icon: <Icon>delete</Icon>, label: 'Delete', onClick: handleDelete },\n * ]}\n * />\n * ```\n */\nexport function AppBarColumn({\n\titems,\n\tmaxItemCount,\n\tclassName,\n}: AppBarColumnProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst [visibleCount, setVisibleCount] = React.useState(\n\t\tmaxItemCount ?? items.length,\n\t);\n\n\tReact.useEffect(() => {\n\t\tif (maxItemCount !== undefined) {\n\t\t\tsetVisibleCount(Math.min(maxItemCount, items.length));\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tlet debounceTimer: ReturnType<typeof setTimeout>;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(() => {\n\t\t\t\tconst entry = entries[0];\n\t\t\t\tif (!entry) return;\n\n\t\t\t\tconst available = entry.contentRect.height;\n\t\t\t\tconst itemHeight = AppBarTokens.iconButtonTouchTarget;\n\t\t\t\tconst hasOverflow = items.length > Math.floor(available / itemHeight);\n\t\t\t\tconst reservedHeight = hasOverflow ? itemHeight : 0;\n\t\t\t\tconst count = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.floor((available - reservedHeight) / itemHeight),\n\t\t\t\t);\n\t\t\t\tsetVisibleCount(Math.min(count, items.length));\n\t\t\t}, 100);\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [items.length, maxItemCount]);\n\n\tconst visibleItems = items.slice(0, visibleCount);\n\tconst overflowItems = items.slice(visibleCount);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"flex flex-col items-center\", className)}\n\t\t>\n\t\t\t{visibleItems.map((item, index) => (\n\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: static list from props\n\t\t\t\t<AppBarItemButton key={index} item={item} />\n\t\t\t))}\n\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<AppBarOverflowIndicator items={overflowItems} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * @file app-bar-row.tsx\n * MD3 Expressive App Bar Row DSL.\n *\n * Displays App Bar action items in a horizontal row.\n * Items that exceed `maxItemCount` or available width collapse into a\n * dropdown menu via <AppBarOverflowIndicator>.\n *\n * Translated from OverflowMeasurePolicy / AppBarRow.kt in Jetpack Compose M3.\n *\n * @see docs/m3/app-bars/AppBarRow.kt\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { AppBarRowProps } from \"./app-bar.types\";\nimport { AppBarItemButton } from \"./app-bar-item-button\";\nimport { AppBarOverflowIndicator } from \"./app-bar-overflow-indicator\";\n\n/**\n * MD3 Expressive App Bar Row.\n *\n * Renders action items in a row. Compatible with the `actions` prop of any App Bar.\n *\n * @example\n * ```tsx\n * <SmallAppBar\n * title=\"Messages\"\n * actions={\n * <AppBarRow\n * maxItemCount={2}\n * items={[\n * { type: 'clickable', icon: <Icon>search</Icon>, label: 'Search', onClick: handleSearch },\n * { type: 'clickable', icon: <Icon>bookmark</Icon>, label: 'Bookmarks', onClick: handleBookmark },\n * { type: 'clickable', icon: <Icon>settings</Icon>, label: 'Settings', onClick: handleSettings },\n * ]}\n * />\n * }\n * />\n * ```\n */\nexport function AppBarRow({ items, maxItemCount, className }: AppBarRowProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst [visibleCount, setVisibleCount] = React.useState(\n\t\tmaxItemCount ?? items.length,\n\t);\n\n\tReact.useEffect(() => {\n\t\tif (maxItemCount !== undefined) {\n\t\t\tsetVisibleCount(Math.min(maxItemCount, items.length));\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tlet debounceTimer: ReturnType<typeof setTimeout>;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(() => {\n\t\t\t\tconst entry = entries[0];\n\t\t\t\tif (!entry) return;\n\n\t\t\t\tconst available = entry.contentRect.width;\n\t\t\t\tconst itemWidth = AppBarTokens.iconButtonTouchTarget;\n\t\t\t\tconst hasOverflow = items.length > Math.floor(available / itemWidth);\n\t\t\t\tconst reservedWidth = hasOverflow ? itemWidth : 0;\n\t\t\t\tconst count = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.floor((available - reservedWidth) / itemWidth),\n\t\t\t\t);\n\t\t\t\tsetVisibleCount(Math.min(count, items.length));\n\t\t\t}, 100);\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [items.length, maxItemCount]);\n\n\tconst visibleItems = items.slice(0, visibleCount);\n\tconst overflowItems = items.slice(visibleCount);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"flex items-center\", className)}\n\t\t\tstyle={{ gap: AppBarTokens.iconButtonSpace }}\n\t\t>\n\t\t\t{visibleItems.map((item, index) => (\n\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: items are static from props\n\t\t\t\t<AppBarItemButton key={index} item={item} />\n\t\t\t))}\n\n\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t<AppBarOverflowIndicator items={overflowItems} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * @file use-app-bar-scroll.ts\n * MD3 Expressive App Bar — Scroll behavior hook.\n *\n * Tracks scroll state for App Bar behaviors:\n * - `pinned`: background color change only\n * - `enterAlways`: hide/show based on scroll direction\n * - `exitUntilCollapsed`: drives collapse fraction (0 = expanded, 1 = collapsed)\n */\n\nimport * as React from \"react\";\nimport type {\n\tAppBarScrollBehavior,\n\tUseAppBarScrollReturn,\n} from \"../app-bar.types\";\n\ninterface UseAppBarScrollOptions {\n\t/** Ref to the scrollable container. Defaults to `window`. */\n\tscrollElement?: React.RefObject<HTMLElement | null>;\n\t/** Scroll behavior mode. @default \"pinned\" */\n\tbehavior?: AppBarScrollBehavior;\n\t/** Collapsed height in px — used for `exitUntilCollapsed`. @default 64 */\n\tcollapsedHeight?: number;\n\t/** Expanded height in px — used for `exitUntilCollapsed`. @default 112 */\n\texpandedHeight?: number;\n}\n\n/**\n * Tracks scroll position and derives App Bar state for all three behaviors.\n *\n * @example\n * ```tsx\n * // pinned (color change only)\n * const { isScrolled } = useAppBarScroll({ behavior: 'pinned' });\n *\n * // enterAlways (hide/show)\n * const { isHidden } = useAppBarScroll({ behavior: 'enterAlways' });\n *\n * // exitUntilCollapsed (collapse animation)\n * const { collapsedFraction } = useAppBarScroll({\n * behavior: 'exitUntilCollapsed',\n * collapsedHeight: 64,\n * expandedHeight: 112,\n * });\n * ```\n */\nexport function useAppBarScroll({\n\tscrollElement,\n\tbehavior = \"pinned\",\n\tcollapsedHeight = 64,\n\texpandedHeight = 112,\n}: UseAppBarScrollOptions = {}): UseAppBarScrollReturn {\n\tconst [isScrolled, setIsScrolled] = React.useState(false);\n\tconst [collapsedFraction, setCollapsedFraction] = React.useState(0);\n\tconst [isHidden, setIsHidden] = React.useState(false);\n\n\t// Track previous scroll position for direction detection\n\tconst prevScrollYRef = React.useRef(0);\n\t// Hysteresis to prevent rapid toggling on enterAlways\n\tconst hideThreshold = 64;\n\n\tReact.useEffect(() => {\n\t\tconst scrollDistance = expandedHeight - collapsedHeight;\n\n\t\tconst getScrollY = (): number => {\n\t\t\tconst el = scrollElement?.current;\n\t\t\treturn el ? el.scrollTop : window.scrollY;\n\t\t};\n\n\t\tconst handleScroll = () => {\n\t\t\tconst currentY = getScrollY();\n\t\t\tconst prevY = prevScrollYRef.current;\n\t\t\tconst delta = currentY - prevY;\n\t\t\tprevScrollYRef.current = currentY;\n\n\t\t\t// Pinned: only toggle background color\n\t\t\tsetIsScrolled(currentY > 0);\n\n\t\t\tif (behavior === \"exitUntilCollapsed\") {\n\t\t\t\tconst fraction =\n\t\t\t\t\tscrollDistance > 0\n\t\t\t\t\t\t? Math.min(1, Math.max(0, currentY / scrollDistance))\n\t\t\t\t\t\t: 0;\n\t\t\t\tsetCollapsedFraction(fraction);\n\t\t\t}\n\n\t\t\tif (behavior === \"enterAlways\") {\n\t\t\t\tif (delta > 0 && currentY > hideThreshold) {\n\t\t\t\t\t// Scrolling down — hide\n\t\t\t\t\tsetIsHidden(true);\n\t\t\t\t} else if (delta < 0) {\n\t\t\t\t\t// Scrolling up — show\n\t\t\t\t\tsetIsHidden(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst target = scrollElement?.current ?? window;\n\t\ttarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n\t\t// Sync initial state\n\t\thandleScroll();\n\n\t\treturn () => {\n\t\t\ttarget.removeEventListener(\"scroll\", handleScroll);\n\t\t};\n\t}, [scrollElement, behavior, collapsedHeight, expandedHeight]);\n\n\treturn { isScrolled, collapsedFraction, isHidden };\n}\n","/**\n * @file bottom-app-bar.tsx\n * MD3 Expressive Bottom App Bar.\n *\n * Fixed to bottom of screen. Contains action icons and optional FAB.\n * Height: 80px | Background: surface-container | Elevation: Level2 (always)\n *\n * @see docs/m3/app-bars/BottomAppBarTokens.kt\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport { APP_BAR_BOTTOM_SPRING, AppBarTokens } from \"./app-bar.tokens\";\nimport type { BottomAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\n/**\n * MD3 Expressive Bottom App Bar.\n *\n * @example\n * ```tsx\n * // With FAB\n * <BottomAppBar\n * actions={\n * <>\n * <IconButton aria-label=\"Check\"><Icon>check_box</Icon></IconButton>\n * <IconButton aria-label=\"Brush\"><Icon>brush</Icon></IconButton>\n * </>\n * }\n * floatingActionButton={<FAB aria-label=\"Compose\">...</FAB>}\n * />\n *\n * // Auto-hide on scroll\n * <BottomAppBar scrollBehavior=\"hidden\" actions={...} />\n * ```\n */\nexport function BottomAppBar({\n\tactions,\n\tfloatingActionButton,\n\tscrollBehavior = \"visible\",\n\tscrollElement,\n\tclassName,\n}: BottomAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { isHidden } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior: scrollBehavior === \"hidden\" ? \"enterAlways\" : \"pinned\",\n\t});\n\n\tconst hideTransition = shouldReduceMotion\n\t\t? { duration: 0 }\n\t\t: APP_BAR_BOTTOM_SPRING;\n\n\tconst translateY = scrollBehavior === \"hidden\" && isHidden ? \"100%\" : \"0%\";\n\n\treturn (\n\t\t<m.nav\n\t\t\trole=\"navigation\"\n\t\t\taria-label=\"Bottom app bar\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed bottom-0 inset-x-0 z-50\",\n\t\t\t\t\"flex items-center\",\n\t\t\t\t\"bg-m3-surface-container\",\n\t\t\t\t\"px-2\", // minimal horizontal padding, icon buttons provide spacing\n\t\t\t\t\"elevation-2\", // BottomAppBarTokens.ContainerElevation = Level2 (always)\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.bottom,\n\t\t\t}}\n\t\t\tanimate={{ y: translateY }}\n\t\t\ttransition={hideTransition}\n\t\t>\n\t\t\t{/* Actions — leading end */}\n\t\t\t{actions && <div className=\"flex items-center flex-1\">{actions}</div>}\n\n\t\t\t{/* FAB — trailing end */}\n\t\t\t{floatingActionButton && (\n\t\t\t\t<div className=\"shrink-0 ml-auto mr-2\">{floatingActionButton}</div>\n\t\t\t)}\n\t\t</m.nav>\n\t);\n}\n","/**\n * @file docked-toolbar.tsx\n * MD3 Expressive Docked Toolbar.\n *\n * Secondary navigation component. NOT an App Bar.\n * Usually appears directly below the main App Bar.\n * Height: 64px | Background: surface-container\n * Typical content: chips, segmented buttons, filter actions.\n *\n * @see docs/m3/app-bars/DockedToolbarTokens.kt\n */\n\nimport { cn } from \"../../lib/utils\";\nimport { AppBarTokens } from \"./app-bar.tokens\";\nimport type { DockedToolbarProps } from \"./app-bar.types\";\n\n/**\n * MD3 Expressive Docked Toolbar.\n *\n * @example\n * ```tsx\n * <DockedToolbar aria-label=\"Filter options\">\n * <Chip label=\"All\" selected onClick={() => setFilter('all')} />\n * <Chip label=\"Unread\" onClick={() => setFilter('unread')} />\n * <Chip label=\"Starred\" onClick={() => setFilter('starred')} />\n * </DockedToolbar>\n * ```\n */\nexport function DockedToolbar({\n\tchildren,\n\t\"aria-label\": ariaLabel,\n\tclassName,\n}: DockedToolbarProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"toolbar\"\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center w-full overflow-x-auto bg-m3-surface-container\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.dockedToolbar,\n\t\t\t\t// DockedToolbarTokens: LeadingSpace = 16dp, TrailingSpace = 16dp\n\t\t\t\tpaddingLeft: AppBarTokens.dockedToolbar.leadingSpace,\n\t\t\t\tpaddingRight: AppBarTokens.dockedToolbar.trailingSpace,\n\t\t\t\t// MinSpacing = 4dp (gap between items)\n\t\t\t\tgap: AppBarTokens.dockedToolbar.minSpacing,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","/**\n * @file use-flexible-app-bar.ts\n * Shared animation hook for MediumFlexibleAppBar and LargeFlexibleAppBar.\n *\n * Extracts common scroll-driven animation state to avoid duplication.\n */\n\nimport type { MotionValue } from \"motion/react\";\nimport { useMotionValue, useReducedMotion, useTransform } from \"motion/react\";\nimport type { RefObject } from \"react\";\nimport * as React from \"react\";\nimport { APP_BAR_COLOR_TRANSITION, APP_BAR_COLORS } from \"../app-bar.tokens\";\nimport type { AppBarColors } from \"../app-bar.types\";\nimport { useAppBarScroll } from \"./use-app-bar-scroll\";\n\ninterface UseFlexibleAppBarOptions {\n\tcollapsedHeight: number;\n\texpandedHeight: number;\n\tscrollElement?: RefObject<HTMLElement | null>;\n\tcolors?: AppBarColors;\n\t/** [start, end] progress range where large title fades from 1 → 0 */\n\tlargeTitleFadeRange: [number, number];\n\t/** [start, end] progress range where small title fades from 0 → 1 */\n\tsmallTitleFadeRange: [number, number];\n\t/** [start, end] progress range where subtitle fades from 1 → 0 */\n\tsubtitleFadeRange: [number, number];\n\t/** [start, end] progress range where headerContent fades from 1 → 0 */\n\theaderContentFadeRange: [number, number];\n\t/** [expanded, collapsed] Y offset for large title */\n\tlargeTitleYRange: [number, number];\n}\n\nexport interface FlexibleAppBarAnimationState {\n\theight: MotionValue<number>;\n\tcurrentBg: string;\n\tcssTransition: string | undefined;\n\tlargeTitleOpacity: MotionValue<number>;\n\tlargeTitleY: MotionValue<number>;\n\tsmallTitleOpacity: MotionValue<number>;\n\tsubtitleOpacity: MotionValue<number>;\n\theaderContentOpacity: MotionValue<number>;\n}\n\nexport function useFlexibleAppBar({\n\tcollapsedHeight,\n\texpandedHeight,\n\tscrollElement,\n\tcolors,\n\tlargeTitleFadeRange,\n\tsmallTitleFadeRange,\n\tsubtitleFadeRange,\n\theaderContentFadeRange,\n\tlargeTitleYRange,\n}: UseFlexibleAppBarOptions): FlexibleAppBarAnimationState {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { collapsedFraction } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior: \"exitUntilCollapsed\",\n\t\tcollapsedHeight,\n\t\texpandedHeight,\n\t});\n\n\tconst scrollProgress = useMotionValue(0);\n\n\tReact.useEffect(() => {\n\t\tscrollProgress.set(\n\t\t\tshouldReduceMotion\n\t\t\t\t? collapsedFraction > 0.5\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0\n\t\t\t\t: collapsedFraction,\n\t\t);\n\t}, [collapsedFraction, scrollProgress, shouldReduceMotion]);\n\n\tconst height = useTransform(\n\t\tscrollProgress,\n\t\t[0, 1],\n\t\t[expandedHeight, collapsedHeight],\n\t);\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = collapsedFraction > 0 ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst largeTitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[largeTitleFadeRange[0], largeTitleFadeRange[1]],\n\t\t[1, 0],\n\t);\n\tconst largeTitleY = useTransform(scrollProgress, [0, 1], largeTitleYRange);\n\tconst smallTitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[smallTitleFadeRange[0], smallTitleFadeRange[1]],\n\t\t[0, 1],\n\t);\n\tconst subtitleOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[subtitleFadeRange[0], subtitleFadeRange[1]],\n\t\t[1, 0],\n\t);\n\tconst headerContentOpacity = useTransform(\n\t\tscrollProgress,\n\t\t[headerContentFadeRange[0], headerContentFadeRange[1]],\n\t\t[1, 0],\n\t);\n\n\treturn {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t};\n}\n","/**\n * @file large-flexible-app-bar.tsx\n * MD3 Expressive Large Flexible App Bar.\n *\n * Like MediumFlexibleAppBar but with larger typography.\n * Expanded height: 120px (no subtitle) / 152px (with subtitle)\n * Collapsed height: 64px\n * Title crossfade: DisplaySmall (expanded) ↔ TitleLarge (collapsed)\n *\n * @see docs/m3/app-bars/AppBarLargeFlexibleTokens.kt\n */\n\nimport { m } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { FlexibleAppBarProps } from \"./app-bar.types\";\nimport { useFlexibleAppBar } from \"./hooks/use-flexible-app-bar\";\n\n/**\n * MD3 Expressive Large Flexible App Bar.\n *\n * @example\n * ```tsx\n * <LargeFlexibleAppBar\n * title=\"Discover\"\n * subtitle=\"Trending today\"\n * navigationIcon={<IconButton aria-label=\"Open menu\"><Icon>menu</Icon></IconButton>}\n * headerContent={<img src=\"/banner.jpg\" alt=\"\" className=\"rounded-xl h-20 w-full object-cover\" />}\n * />\n * ```\n */\nexport function LargeFlexibleAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollElement,\n\theaderContent,\n\tcollapsedHeight = AppBarTokens.heights.flexibleCollapsed,\n\texpandedHeight,\n\tclassName,\n}: FlexibleAppBarProps) {\n\tconst resolvedExpandedHeight =\n\t\texpandedHeight ??\n\t\t(subtitle\n\t\t\t? AppBarTokens.heights.largeFlexWithSubtitleExpanded\n\t\t\t: AppBarTokens.heights.largeFlexExpanded);\n\n\tconst {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t} = useFlexibleAppBar({\n\t\tcollapsedHeight,\n\t\texpandedHeight: resolvedExpandedHeight,\n\t\tscrollElement,\n\t\tcolors,\n\t\tlargeTitleFadeRange: [0, 0.35],\n\t\tsmallTitleFadeRange: [0.55, 0.95],\n\t\tsubtitleFadeRange: [0, 0.25],\n\t\theaderContentFadeRange: [0, 0.2],\n\t\tlargeTitleYRange: [0, 12],\n\t});\n\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ height, backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center px-1 shrink-0\"\n\t\t\t\tstyle={{ height: collapsedHeight }}\n\t\t\t>\n\t\t\t\t{navigationIcon && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{navigationIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\"flex-1 min-w-0\", !navigationIcon && \"pl-4\")}\n\t\t\t\t\tstyle={{ opacity: smallTitleOpacity }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tappBarTypography.titleLarge,\n\t\t\t\t\t\t\t\"truncate block\",\n\t\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</span>\n\t\t\t\t</m.div>\n\n\t\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col flex-1 px-4 pb-4 justify-end\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<m.span\n\t\t\t\t\tclassName={cn(appBarTypography.displaySmall, \"truncate w-full\")}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: largeTitleOpacity,\n\t\t\t\t\t\ty: largeTitleY,\n\t\t\t\t\t\tcolor: colors?.titleColor ?? APP_BAR_COLORS.title,\n\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</m.span>\n\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tclassName={cn(appBarTypography.titleMedium, \"truncate w-full\")}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: subtitleOpacity,\n\t\t\t\t\t\t\tcolor: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle,\n\t\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\n\t\t\t\t{headerContent && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"mt-3 w-full\"\n\t\t\t\t\t\tstyle={{ opacity: headerContentOpacity }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{headerContent}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</m.header>\n\t);\n}\n","/**\n * @file medium-flexible-app-bar.tsx\n * MD3 Expressive Medium Flexible App Bar.\n *\n * Two-row layout in expanded state, collapses to single row on scroll.\n * Expanded height: 112px (no subtitle) / 136px (with subtitle)\n * Collapsed height: 64px\n * Title crossfade: HeadlineMedium (expanded) ↔ TitleLarge (collapsed)\n *\n * Supports `exitUntilCollapsed` scroll behavior only.\n *\n * @see docs/m3/app-bars/AppBarMediumFlexibleTokens.kt\n */\n\nimport { m } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { FlexibleAppBarProps } from \"./app-bar.types\";\nimport { useFlexibleAppBar } from \"./hooks/use-flexible-app-bar\";\n\n/**\n * MD3 Expressive Medium Flexible App Bar.\n *\n * @example\n * ```tsx\n * <MediumFlexibleAppBar\n * title=\"Settings\"\n * subtitle=\"Manage your preferences\"\n * navigationIcon={<IconButton aria-label=\"Go back\"><Icon>arrow_back</Icon></IconButton>}\n * actions={<IconButton aria-label=\"More options\"><Icon>more_vert</Icon></IconButton>}\n * />\n * ```\n */\nexport function MediumFlexibleAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollElement,\n\theaderContent,\n\tcollapsedHeight = AppBarTokens.heights.flexibleCollapsed,\n\texpandedHeight,\n\tclassName,\n}: FlexibleAppBarProps) {\n\tconst resolvedExpandedHeight =\n\t\texpandedHeight ??\n\t\t(subtitle\n\t\t\t? AppBarTokens.heights.mediumFlexWithSubtitleExpanded\n\t\t\t: AppBarTokens.heights.mediumFlexExpanded);\n\n\tconst {\n\t\theight,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t\tlargeTitleOpacity,\n\t\tlargeTitleY,\n\t\tsmallTitleOpacity,\n\t\tsubtitleOpacity,\n\t\theaderContentOpacity,\n\t} = useFlexibleAppBar({\n\t\tcollapsedHeight,\n\t\texpandedHeight: resolvedExpandedHeight,\n\t\tscrollElement,\n\t\tcolors,\n\t\tlargeTitleFadeRange: [0, 0.4],\n\t\tsmallTitleFadeRange: [0.5, 0.9],\n\t\tsubtitleFadeRange: [0, 0.3],\n\t\theaderContentFadeRange: [0, 0.25],\n\t\tlargeTitleYRange: [0, 8],\n\t});\n\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ height, backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center px-1 shrink-0\"\n\t\t\t\tstyle={{ height: collapsedHeight }}\n\t\t\t>\n\t\t\t\t{navigationIcon && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{navigationIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 min-w-0\",\n\t\t\t\t\t\tisCentered ? \"text-center\" : \"text-start\",\n\t\t\t\t\t\t!navigationIcon && \"pl-4\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ opacity: smallTitleOpacity }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(appBarTypography.titleLarge, \"truncate block\")}\n\t\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</span>\n\t\t\t\t</m.div>\n\n\t\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col flex-1 px-4 pb-3 justify-end\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<m.span\n\t\t\t\t\tclassName={cn(appBarTypography.headlineMedium, \"truncate w-full\")}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: largeTitleOpacity,\n\t\t\t\t\t\ty: largeTitleY,\n\t\t\t\t\t\tcolor: colors?.titleColor ?? APP_BAR_COLORS.title,\n\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</m.span>\n\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tclassName={cn(appBarTypography.labelLarge, \"truncate w-full\")}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: subtitleOpacity,\n\t\t\t\t\t\t\tcolor: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle,\n\t\t\t\t\t\t\t...(isCentered && { textAlign: \"center\" }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\n\t\t\t\t{headerContent && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"mt-2 w-full\"\n\t\t\t\t\t\tstyle={{ opacity: headerContentOpacity }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{headerContent}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</m.header>\n\t);\n}\n","/**\n * @file search-app-bar.tsx\n * MD3 Expressive Search App Bar.\n *\n * New variant in MD3 Expressive (May 2025).\n * Replaces the title area with a pill-shaped search bar.\n * Uses Framer Motion layoutId to enable shared element transition with <SearchView>.\n *\n * @see docs/m3/app-bars/AppBar.kt — SearchAppBar\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLOR_TRANSITION,\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n} from \"./app-bar.tokens\";\nimport type { SearchAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\n/** Built-in search icon (Material Symbols) used as default. */\nfunction SearchIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"material-symbols-rounded text-[20px] leading-none select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tsearch\n\t\t</span>\n\t);\n}\n\n/**\n * MD3 Expressive Search App Bar.\n *\n * When the search bar is clicked, callers should open a `<SearchView>` overlay.\n * Uses Framer Motion `layoutId` (via `searchBarId`) for a smooth shared-element\n * transition between this bar and the search view.\n *\n * @example\n * ```tsx\n * const [searchOpen, setSearchOpen] = useState(false);\n *\n * <SearchAppBar\n * searchBarId=\"main-search\"\n * searchPlaceholder=\"Search messages...\"\n * onSearchFocus={() => setSearchOpen(true)}\n * trailingSearchActions={\n * <IconButton aria-label=\"Voice search\"><Icon>mic</Icon></IconButton>\n * }\n * externalActions={<Avatar src={user.avatar} />}\n * />\n *\n * <AnimatePresence>\n * {searchOpen && (\n * <SearchView\n * searchBarId=\"main-search\"\n * onClose={() => setSearchOpen(false)}\n * />\n * )}\n * </AnimatePresence>\n * ```\n */\nexport function SearchAppBar({\n\tsearchPlaceholder = \"Search\",\n\tsearchValue,\n\tonSearchFocus,\n\tleadingSearchIcon,\n\ttrailingSearchActions,\n\texternalActions,\n\tnavigationIcon,\n\tcolors,\n\tscrollBehavior = \"pinned\",\n\tscrollElement,\n\tsearchBarId = \"search-bar\",\n\tclassName,\n}: SearchAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst [isSearchOpen, setIsSearchOpen] = React.useState(false);\n\n\tconst { isScrolled } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior:\n\t\t\tscrollBehavior === \"exitUntilCollapsed\" ? \"pinned\" : scrollBehavior,\n\t});\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = isScrolled ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst handleSearchClick = () => {\n\t\tsetIsSearchOpen(true);\n\t\tonSearchFocus?.();\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\thandleSearchClick();\n\t\t}\n\t};\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed top-0 inset-x-0 z-50 flex items-center gap-2 px-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: AppBarTokens.heights.small,\n\t\t\t\tbackgroundColor: currentBg,\n\t\t\t\ttransition: cssTransition,\n\t\t\t}}\n\t\t>\n\t\t\t{/* Optional navigation icon — leading edge */}\n\t\t\t{navigationIcon && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{navigationIcon}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<m.div\n\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchBarId}\n\t\t\t\trole=\"search\"\n\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\taria-expanded={isSearchOpen}\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"relative flex flex-1 items-center gap-2 rounded-full cursor-text h-10 px-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\tonClick={handleSearchClick}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t>\n\t\t\t\t<div className=\"absolute inset-0 rounded-full bg-m3-surface-container-high -z-10\" />\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.searchBarContent }}\n\t\t\t\t>\n\t\t\t\t\t{leadingSearchIcon ?? <SearchIcon />}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"flex-1 text-[16px] leading-6 truncate select-none\"\n\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.searchBarContent }}\n\t\t\t\t>\n\t\t\t\t\t{searchValue ?? searchPlaceholder}\n\t\t\t\t</span>\n\n\t\t\t\t{trailingSearchActions && (\n\t\t\t\t\t<div className=\"flex items-center shrink-0\">\n\t\t\t\t\t\t{trailingSearchActions}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</m.div>\n\n\t\t\t{externalActions && (\n\t\t\t\t<div className=\"flex items-center shrink-0\">{externalActions}</div>\n\t\t\t)}\n\t\t</m.header>\n\t);\n}\n","/**\n * @file search-view.tsx\n * MD3 Expressive Search View.\n *\n * Full-screen overlay activated when a SearchAppBar's search bar is clicked.\n * Shares a Framer Motion `layoutId` with the SearchAppBar search bar for a\n * smooth shared element transition.\n *\n * Usage pattern:\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * // In render:\n * <SearchAppBar searchBarId=\"main\" onSearchFocus={() => setOpen(true)} />\n * <AnimatePresence>\n * {open && <SearchView searchBarId=\"main\" onClose={() => setOpen(false)} />}\n * </AnimatePresence>\n * ```\n *\n * Design notes:\n * - The SearchView is intentionally separate from SearchAppBar to allow consumers\n * to customize the results/suggestions content without coupling.\n * - The `searchBarId` prop must match between SearchAppBar and SearchView to\n * enable the shared element transition.\n * - Focus is moved to the search input when the view opens.\n * - Escape key closes the view and returns focus to the search bar.\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLORS,\n\tAppBarTokens,\n\tSEARCH_VIEW_SPRING,\n} from \"./app-bar.tokens\";\nimport type { SearchViewProps } from \"./app-bar.types\";\n\n/** Built-in back arrow icon. */\nfunction ArrowBackIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tarrow_back\n\t\t</span>\n\t);\n}\n\n/** Built-in clear icon. */\nfunction CloseIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded text-[24px] leading-none select-none\"\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tclose\n\t\t</span>\n\t);\n}\n\n/**\n * MD3 Expressive Search View.\n *\n * Renders a full-screen search overlay with a shared element transition\n * from the triggering `<SearchAppBar>` search bar.\n *\n * Mount/unmount this component via `<AnimatePresence>` in the consumer.\n */\nexport function SearchView({\n\tsearchBarId = \"search-bar\",\n\tvalue = \"\",\n\tonChange,\n\tonClose,\n\tplaceholder = \"Search\",\n\tchildren,\n\tleadingIcon,\n\ttrailingAction,\n\tclassName,\n}: SearchViewProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\t// Move focus to the search input when the view opens\n\tReact.useEffect(() => {\n\t\tconst timer = window.setTimeout(() => {\n\t\t\tinputRef.current?.focus();\n\t\t}, 50);\n\t\treturn () => window.clearTimeout(timer);\n\t}, []);\n\n\t// Close on Escape key\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\tonClose();\n\t\t}\n\t};\n\n\tconst viewTransition = shouldReduceMotion\n\t\t? { duration: 0 }\n\t\t: SEARCH_VIEW_SPRING;\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\taria-label=\"Search\"\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-60 flex flex-col bg-m3-surface\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\tanimate={{ opacity: 1 }}\n\t\t\texit={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\ttransition={viewTransition}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t>\n\t\t\t{/* Search Bar — matches layoutId of SearchAppBar search bar */}\n\t\t\t<m.div\n\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchBarId}\n\t\t\t\tclassName=\"flex items-center gap-2 px-4 shrink-0 bg-m3-surface\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: AppBarTokens.heights.small,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Leading: back button or custom icon */}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"shrink-0 flex items-center justify-center rounded-full\",\n\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\tcolor: APP_BAR_COLORS.navigationIcon,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label=\"Close search\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t>\n\t\t\t\t\t{leadingIcon ?? <ArrowBackIcon />}\n\t\t\t\t</button>\n\n\t\t\t\t{/* Search input */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"relative flex flex-1 items-center rounded-full px-4 gap-2\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 40,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* Background Layer */}\n\t\t\t\t\t<div className=\"absolute inset-0 rounded-full bg-m3-surface-container-high -z-10\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => onChange?.(e.target.value)}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex-1 bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\"text-[16px] leading-6\",\n\t\t\t\t\t\t\t\"placeholder:text-m3-on-surface-variant\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: APP_BAR_COLORS.title }}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Clear button — show when there's a value */}\n\t\t\t\t\t{value && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"shrink-0 flex items-center justify-center rounded-full\",\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)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: 40,\n\t\t\t\t\t\t\t\theight: 40,\n\t\t\t\t\t\t\t\tcolor: APP_BAR_COLORS.searchBarContent,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"Clear search\"\n\t\t\t\t\t\t\tonClick={() => onChange?.(\"\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailingAction ?? <CloseIcon />}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</m.div>\n\n\t\t\t{/* Results / suggestions area */}\n\t\t\t{children && (\n\t\t\t\t<m.div\n\t\t\t\t\tclassName=\"flex-1 overflow-y-auto\"\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\ttransition={{ delay: 0.1, duration: 0.15 }}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</m.div>\n\t);\n}\n\n/**\n * Convenience wrapper that handles the AnimatePresence + open state.\n *\n * @example\n * ```tsx\n * <SearchBar\n * isOpen={searchOpen}\n * onClose={() => setSearchOpen(false)}\n * searchBarId=\"main-search\"\n * >\n * <SearchResultsList results={results} />\n * </SearchBar>\n * ```\n */\nexport function SearchViewContainer({\n\tisOpen,\n\t...props\n}: SearchViewProps & { isOpen: boolean }) {\n\treturn (\n\t\t<AnimatePresence>{isOpen && <SearchView {...props} />}</AnimatePresence>\n\t);\n}\n","/**\n * @file small-app-bar.tsx\n * MD3 Expressive Small App Bar.\n *\n * Single-row layout: [navigationIcon][title + subtitle][actions]\n * Height: 64px | Title: TitleLarge (22sp) | Subtitle: LabelMedium (12sp)\n *\n * Scroll behaviors:\n * - pinned: changes background color surface → surface-container\n * - enterAlways: slides up when scrolling down, slides down when scrolling up\n *\n * @see docs/m3/app-bars/AppBarSmallTokens.kt\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n\tAPP_BAR_COLOR_TRANSITION,\n\tAPP_BAR_COLORS,\n\tAPP_BAR_ENTER_ALWAYS_SPRING,\n\tAppBarTokens,\n\tappBarTypography,\n} from \"./app-bar.tokens\";\nimport type { SmallAppBarProps } from \"./app-bar.types\";\nimport { useAppBarScroll } from \"./hooks/use-app-bar-scroll\";\n\ninterface SmallAppBarInnerProps\n\textends Pick<\n\t\tSmallAppBarProps,\n\t\t| \"title\"\n\t\t| \"subtitle\"\n\t\t| \"titleAlignment\"\n\t\t| \"navigationIcon\"\n\t\t| \"actions\"\n\t\t| \"colors\"\n\t\t| \"className\"\n\t> {\n\tcurrentBg: string;\n\tcssTransition: string | undefined;\n}\n\n/** Inner content shared between pinned and enterAlways variants. */\nfunction SmallAppBarInner({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tclassName,\n\tcurrentBg,\n\tcssTransition,\n}: SmallAppBarInnerProps) {\n\tconst isCentered = titleAlignment === \"center\";\n\n\treturn (\n\t\t<m.header\n\t\t\trole=\"banner\"\n\t\t\tclassName={cn(\"flex items-center px-1 h-full w-full\", className)}\n\t\t\tstyle={{ backgroundColor: currentBg, transition: cssTransition }}\n\t\t>\n\t\t\t{navigationIcon && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"shrink-0 flex items-center justify-center\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t\theight: AppBarTokens.iconButtonTouchTarget,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{navigationIcon}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 flex flex-col justify-center min-w-0\",\n\t\t\t\t\tisCentered ? \"items-center\" : \"items-start\",\n\t\t\t\t\t!navigationIcon && \"pl-4\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tappBarTypography.titleLarge,\n\t\t\t\t\t\t\"truncate w-full\",\n\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ color: colors?.titleColor ?? APP_BAR_COLORS.title }}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t{subtitle && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tappBarTypography.labelMedium,\n\t\t\t\t\t\t\t\"truncate w-full\",\n\t\t\t\t\t\t\tisCentered && \"text-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ color: colors?.subtitleColor ?? APP_BAR_COLORS.subtitle }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{actions && <div className=\"flex items-center shrink-0\">{actions}</div>}\n\t\t</m.header>\n\t);\n}\n\n/**\n * MD3 Expressive Small App Bar.\n *\n * @example\n * ```tsx\n * // Left-aligned (default)\n * <SmallAppBar\n * title=\"Inbox\"\n * navigationIcon={<IconButton aria-label=\"Go back\"><Icon>arrow_back</Icon></IconButton>}\n * actions={<IconButton aria-label=\"Search\"><Icon>search</Icon></IconButton>}\n * scrollBehavior=\"pinned\"\n * />\n *\n * // Center-aligned with subtitle\n * <SmallAppBar\n * title=\"Profile\"\n * subtitle=\"@username\"\n * titleAlignment=\"center\"\n * scrollBehavior=\"enterAlways\"\n * />\n * ```\n */\nexport function SmallAppBar({\n\ttitle,\n\tsubtitle,\n\ttitleAlignment = \"start\",\n\tnavigationIcon,\n\tactions,\n\tcolors,\n\tscrollBehavior = \"pinned\",\n\tscrollElement,\n\tclassName,\n}: SmallAppBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\n\tconst { isScrolled, isHidden } = useAppBarScroll({\n\t\tscrollElement,\n\t\tbehavior:\n\t\t\tscrollBehavior === \"exitUntilCollapsed\" ? \"pinned\" : scrollBehavior,\n\t});\n\n\tconst containerBg = colors?.containerColor ?? APP_BAR_COLORS.container;\n\tconst scrolledBg =\n\t\tcolors?.scrolledContainerColor ?? APP_BAR_COLORS.scrolledContainer;\n\tconst currentBg = isScrolled ? scrolledBg : containerBg;\n\n\tconst cssTransition = shouldReduceMotion\n\t\t? undefined\n\t\t: `background-color ${APP_BAR_COLOR_TRANSITION.duration}s cubic-bezier(${APP_BAR_COLOR_TRANSITION.ease.join(\",\")})`;\n\n\tconst innerProps: SmallAppBarInnerProps = {\n\t\ttitle,\n\t\tsubtitle,\n\t\ttitleAlignment,\n\t\tnavigationIcon,\n\t\tactions,\n\t\tcolors,\n\t\tcurrentBg,\n\t\tcssTransition,\n\t};\n\n\tconst barHeight = AppBarTokens.heights.small;\n\n\tif (scrollBehavior !== \"enterAlways\") {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\"fixed top-0 inset-x-0 z-50\", className)}\n\t\t\t\tstyle={{ height: barHeight }}\n\t\t\t>\n\t\t\t\t<SmallAppBarInner {...innerProps} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AnimatePresence initial={false}>\n\t\t\t{!isHidden && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey=\"small-app-bar\"\n\t\t\t\t\tinitial={{ y: \"-100%\" }}\n\t\t\t\t\tanimate={{ y: 0 }}\n\t\t\t\t\texit={{ y: \"-100%\" }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : APP_BAR_ENTER_ALWAYS_SPRING\n\t\t\t\t\t}\n\t\t\t\t\tclassName={cn(\"fixed top-0 inset-x-0 z-50\", className)}\n\t\t\t\t\tstyle={{ height: barHeight }}\n\t\t\t\t>\n\t\t\t\t\t<SmallAppBarInner {...innerProps} />\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.max(\n\t\t\t\tMath.hypot(rect.width, rect.height) * 2.5,\n\t\t\t\t320,\n\t\t\t);\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","/**\n * @file shared/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","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\ttype Transition,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport { SPRING_TRANSITION_EXPRESSIVE } from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Layout styling for navigation bar items.\n * - vertical: Icon above label (default for mobile)\n * - horizontal: Icon beside label (forced)\n */\nexport type NavigationBarItemLayout = \"vertical\" | \"horizontal\";\n\n/**\n * Visual variant of the Navigation Bar.\n * - flexible: Default MD3 behavior (h-16), becomes horizontal on desktop.\n * - baseline: Taller MD3 behavior (h-20), always vertical.\n * - xr: Floating orbiter variant for spatial interfaces (detached from bottom).\n */\nexport type NavigationBarVariant = \"flexible\" | \"baseline\" | \"xr\";\n\nexport interface NavigationBarItemProps {\n\tselected: boolean;\n\ticon: React.ReactNode;\n\tlabel: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tbadge?: React.ReactNode;\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\tasChild?: boolean;\n\tchildren?: React.ReactNode;\n}\n\nexport interface NavigationBarProps {\n\t/** Visual variant of the Navigation Bar */\n\tvariant?: NavigationBarVariant;\n\t/** Forces a specific item layout (horizontal/vertical) */\n\titemLayout?: NavigationBarItemLayout;\n\t/** Whether the bar should hide when scrolling down */\n\thideOnScroll?: boolean;\n\t/** Whether the bar should have an elevation shadow */\n\televated?: boolean;\n\t/** Whether the bar is fixed to the viewport (default) or absolute */\n\tfixed?: boolean;\n\t/** Container ref to track scrolling for hideOnScroll */\n\tscrollContainerRef?: React.RefObject<HTMLElement | null>;\n\t/** Transition for the active indicator pill */\n\tactiveIndicatorTransition?: Transition;\n\t/** Navigation items */\n\tchildren: React.ReactNode;\n\t/** Optional additional classes for individual navigation items */\n\titemClassName?: string;\n\t/** Optional additional classes */\n\tclassName?: string;\n\t/** Optional inline styles */\n\tstyle?: React.CSSProperties;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationBarContext = React.createContext<{\n\tvariant: NavigationBarVariant;\n\titemLayout?: NavigationBarItemLayout;\n\tactiveIndicatorTransition?: Transition;\n\titemClassName?: string;\n}>({ variant: \"flexible\" });\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction cloneIconWithFill(\n\ticon: React.ReactNode,\n\tselected: boolean,\n): React.ReactNode {\n\tif (!React.isValidElement(icon)) return icon;\n\tif ((icon.type as unknown) === Icon) {\n\t\treturn React.cloneElement(\n\t\t\ticon as React.ReactElement<{ fill?: 0 | 1; animateFill?: boolean }>,\n\t\t\t{ fill: selected ? 1 : 0, animateFill: true },\n\t\t);\n\t}\n\treturn icon;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBarItem Sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction ActivePill() {\n\tconst { activeIndicatorTransition } = React.useContext(NavigationBarContext);\n\n\treturn (\n\t\t<m.div\n\t\t\tclassName=\"absolute inset-0 bg-m3-secondary-container pointer-events-none\"\n\t\t\tstyle={{\n\t\t\t\tborderRadius: 9999,\n\t\t\t\tzIndex: 0,\n\t\t\t}}\n\t\t\tinitial={{ opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\texit={{ opacity: 0, scale: 0.5 }}\n\t\t\ttransition={activeIndicatorTransition || SPRING_TRANSITION_EXPRESSIVE}\n\t\t/>\n\t);\n}\n\nfunction HoverStateLayer() {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] group-focus-visible:opacity-[0.10] active:opacity-[0.10] transition-opacity duration-200 pointer-events-none z-0\" />\n\t);\n}\n\ninterface RippleLayerProps {\n\tripples: ReturnType<typeof useRippleState>[\"ripples\"];\n\tonRippleDone: ReturnType<typeof useRippleState>[\"removeRipple\"];\n}\n\nfunction RippleLayer({ ripples, onRippleDone }: RippleLayerProps) {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0\">\n\t\t\t<Ripple ripples={ripples} onRippleDone={onRippleDone} />\n\t\t</div>\n\t);\n}\n\ninterface IconContainerProps {\n\tselected: boolean;\n\tbadge?: React.ReactNode;\n\tchildren: React.ReactNode;\n}\n\nfunction IconContainer({ selected, badge, children }: IconContainerProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center size-6 transition-colors duration-200 shrink-0\",\n\t\t\t\tselected\n\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{badge && (\n\t\t\t\t<span className=\"absolute -top-1 -right-1 flex min-w-3 h-3 items-center justify-center rounded-full bg-m3-error px-1 text-[10px] font-medium leading-none tracking-normal text-m3-on-error ring-[1.5px] ring-m3-surface\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBarItem\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationBarItemComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tNavigationBarItemProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\ticon,\n\t\t\tlabel,\n\t\t\tonClick,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tvariant,\n\t\t\titemLayout,\n\t\t\titemClassName: contextItemClassName,\n\t\t} = React.useContext(NavigationBarContext);\n\n\t\tconst isForcedHorizontal = itemLayout === \"horizontal\";\n\t\tconst isResponsiveHorizontal =\n\t\t\t(variant === \"flexible\" || variant === \"xr\") && itemLayout === undefined;\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (selected) {\n\t\t\t\t\tif (typeof window !== \"undefined\" && window.scrollY > 0) {\n\t\t\t\t\t\twindow.scrollTo({ top: 0, behavior: \"smooth\" });\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.();\n\t\t\t},\n\t\t\t[disabled, selected, onClick],\n\t\t);\n\n\t\tconst filledIcon = cloneIconWithFill(icon, selected);\n\n\t\tconst itemClassName = cn(\n\t\t\t\"group relative flex cursor-pointer transition-colors duration-200 outline-none select-none h-full items-center justify-center min-w-0\",\n\t\t\tvariant === \"xr\"\n\t\t\t\t? isResponsiveHorizontal\n\t\t\t\t\t? \"flex-1 min-[600px]:flex-initial min-[600px]:w-auto\"\n\t\t\t\t\t: isForcedHorizontal\n\t\t\t\t\t\t? \"flex-initial w-auto\"\n\t\t\t\t\t\t: \"flex-1\"\n\t\t\t\t: isForcedHorizontal\n\t\t\t\t\t? \"flex-initial w-auto\"\n\t\t\t\t\t: \"flex-1\",\n\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\tcontextItemClassName,\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild && children) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\tconst innerContent = (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex items-center justify-center flex-col gap-y-1 w-full px-1 py-1.5\",\n\t\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\t\"min-[600px]:flex-row min-[600px]:gap-y-0 min-[600px]:gap-x-1.5 min-[600px]:h-10 min-[600px]:px-4 min-[600px]:py-0 min-[600px]:rounded-full min-[600px]:w-auto\",\n\t\t\t\t\t\t\tisForcedHorizontal &&\n\t\t\t\t\t\t\t\t\"flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Horizontal active indicator — covers icon + label */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"absolute inset-0 z-0 hidden\",\n\t\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:block\",\n\t\t\t\t\t\t\t\tisForcedHorizontal && \"block!\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Icon pill — background visible only in vertical layout */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\t\"h-8 w-16 mx-auto rounded-full\",\n\t\t\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\t\t\"min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto\",\n\t\t\t\t\t\t\t\tisForcedHorizontal && \"size-6 w-auto h-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"absolute inset-0 z-0\",\n\t\t\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:hidden\",\n\t\t\t\t\t\t\t\t\tisForcedHorizontal && \"hidden\",\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<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"relative z-10 flex size-6 items-center justify-center text-current\">\n\t\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey=\"nav-label\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"z-10 transition-all duration-200 truncate px-1\",\n\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-surface\"\n\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t\"font-medium text-[12px] leading-4 tracking-[0.5px]\",\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{child.props.children ?? label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</div>\n\t\t\t\t\t<TouchTarget />\n\t\t\t\t</>\n\t\t\t);\n\n\t\t\treturn (\n\t\t\t\t<Slot\n\t\t\t\t\tref={ref as React.Ref<HTMLElement>}\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t\t}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t>\n\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t</Slot>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<m.button\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"menuitem\"\n\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\taria-label={\n\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\tclassName={itemClassName}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex items-center justify-center flex-col gap-y-1 w-full px-1 py-1.5\",\n\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\"min-[600px]:flex-row min-[600px]:gap-y-0 min-[600px]:gap-x-1.5 min-[600px]:h-10 min-[600px]:px-4 min-[600px]:py-0 min-[600px]:rounded-full min-[600px]:w-auto\",\n\t\t\t\t\t\tisForcedHorizontal &&\n\t\t\t\t\t\t\t\"flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Horizontal active indicator — covers icon + label */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0 z-0 hidden\",\n\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:block\",\n\t\t\t\t\t\t\tisForcedHorizontal && \"block!\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Icon pill — background visible only in vertical layout */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\"h-8 w-16 mx-auto rounded-full\",\n\t\t\t\t\t\t\tisResponsiveHorizontal &&\n\t\t\t\t\t\t\t\t\"min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto\",\n\t\t\t\t\t\t\tisForcedHorizontal && \"size-6 w-auto h-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"absolute inset-0 z-0\",\n\t\t\t\t\t\t\t\tisResponsiveHorizontal && \"min-[600px]:hidden\",\n\t\t\t\t\t\t\t\tisForcedHorizontal && \"hidden\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && <ActivePill />}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t<HoverStateLayer />\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"relative z-10 flex size-6 items-center justify-center text-current\">\n\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey=\"nav-label\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"z-10 transition-all duration-200 truncate px-1\",\n\t\t\t\t\t\t\t\tselected ? \"text-m3-on-surface\" : \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\"font-medium text-[12px] leading-4 tracking-[0.5px]\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</div>\n\t\t\t\t<TouchTarget />\n\t\t\t</m.button>\n\t\t);\n\t},\n);\n\nNavigationBarItemComponent.displayName = \"NavigationBarItem\";\nexport const NavigationBarItem = React.memo(NavigationBarItemComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationBar Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst navContainerVariants = cva(\n\t\"flex items-center justify-center select-none transition-transform duration-300 z-50\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tflexible: \"bottom-0 left-0 right-0 w-full h-16 pb-safe\",\n\t\t\t\tbaseline: \"bottom-0 left-0 right-0 w-full h-20 pb-safe\",\n\t\t\t\txr: \"bottom-6 left-1/2 -translate-x-1/2 w-auto max-w-[calc(100%-2rem)] min-[600px]:max-w-fit h-20 min-[600px]:h-16 rounded-[48px] px-2\",\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\tfixed: \"fixed\",\n\t\t\t\tabsolute: \"absolute\",\n\t\t\t},\n\t\t\televated: {\n\t\t\t\ttrue: \"shadow-[0_-1px_3px_rgba(0,0,0,0.1)]\",\n\t\t\t\tfalse: \"shadow-none\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"flexible\",\n\t\t\tposition: \"fixed\",\n\t\t\televated: false,\n\t\t},\n\t},\n);\n\nexport const NavigationBarComponent = React.forwardRef<\n\tHTMLElement,\n\tNavigationBarProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"flexible\",\n\t\t\titemLayout,\n\t\t\thideOnScroll = false,\n\t\t\televated = false,\n\t\t\tfixed = true,\n\t\t\tscrollContainerRef,\n\t\t\tactiveIndicatorTransition,\n\t\t\tchildren,\n\t\t\titemClassName,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [isVisible, setIsVisible] = React.useState(true);\n\t\tconst lastScrollY = React.useRef(\n\t\t\ttypeof window !== \"undefined\" ? window.scrollY : 0,\n\t\t);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (typeof window === \"undefined\" || !hideOnScroll) {\n\t\t\t\tsetIsVisible(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Do not hide if screen reader or reduced motion is active\n\t\t\tconst prefersReducedMotion = window.matchMedia(\n\t\t\t\t\"(prefers-reduced-motion: reduce)\",\n\t\t\t).matches;\n\t\t\tif (prefersReducedMotion) {\n\t\t\t\tsetIsVisible(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet ticking = false;\n\n\t\t\tconst handleScroll = () => {\n\t\t\t\tif (ticking) return;\n\t\t\t\tticking = true;\n\t\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\t\tconst currentScrollY = scrollContainerRef?.current\n\t\t\t\t\t\t? scrollContainerRef.current.scrollTop\n\t\t\t\t\t\t: window.scrollY;\n\n\t\t\t\t\tif (currentScrollY <= 0 || currentScrollY < lastScrollY.current) {\n\t\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\t} else if (currentScrollY > lastScrollY.current) {\n\t\t\t\t\t\tsetIsVisible(false);\n\t\t\t\t\t}\n\n\t\t\t\t\tlastScrollY.current = currentScrollY;\n\t\t\t\t\tticking = false;\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst target = scrollContainerRef?.current || window;\n\n\t\t\ttarget.addEventListener(\"scroll\", handleScroll, { passive: true });\n\t\t\treturn () => target.removeEventListener(\"scroll\", handleScroll);\n\t\t}, [hideOnScroll, scrollContainerRef]);\n\n\t\tconst navBaseClasses = cn(\n\t\t\tnavContainerVariants({\n\t\t\t\tvariant,\n\t\t\t\televated,\n\t\t\t\tposition: fixed ? \"fixed\" : \"absolute\",\n\t\t\t}),\n\t\t\tvariant === \"xr\"\n\t\t\t\t? \"bg-m3-surface border border-white/5 shadow-xl\"\n\t\t\t\t: \"bg-m3-surface-container\",\n\t\t\tclassName,\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<NavigationBarContext.Provider\n\t\t\t\t\tvalue={{\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\titemLayout,\n\t\t\t\t\t\tactiveIndicatorTransition,\n\t\t\t\t\t\titemClassName,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<m.nav\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\trole=\"navigation\"\n\t\t\t\t\t\taria-label=\"Main navigation\"\n\t\t\t\t\t\tclassName={navBaseClasses}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t\tinitial={false}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\ty: isVisible\n\t\t\t\t\t\t\t\t? \"0%\"\n\t\t\t\t\t\t\t\t: variant === \"xr\"\n\t\t\t\t\t\t\t\t\t? \"calc(100% + 40px)\"\n\t\t\t\t\t\t\t\t\t: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ type: \"tween\", duration: 0.3, ease: \"easeInOut\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"menubar\"\n\t\t\t\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex w-full h-full mx-auto\",\n\t\t\t\t\t\t\t\tvariant === \"xr\"\n\t\t\t\t\t\t\t\t\t? \"gap-0 min-[600px]:gap-1.5 items-center justify-center px-1\"\n\t\t\t\t\t\t\t\t\t: \"max-w-7xl gap-1.5\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.nav>\n\t\t\t\t</NavigationBarContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationBarComponent.displayName = \"NavigationBar\";\nexport const NavigationBar = React.memo(NavigationBarComponent);\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\ttype Transition,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { Ripple, useRippleState } from \"./ripple\";\nimport {\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_EXPRESSIVE,\n} from \"./shared/constants\";\nimport { TouchTarget } from \"./shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types & Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type NavigationRailVariant = \"collapsed\" | \"expanded\" | \"modal\" | \"xr\";\nexport type NavigationRailLabelVisibility = \"labeled\" | \"auto\" | \"unlabeled\";\n\nexport interface NavigationRailItemProps {\n\tselected: boolean;\n\ticon: React.ReactNode;\n\tlabel?: React.ReactNode;\n\tonClick?: () => void;\n\tdisabled?: boolean;\n\tbadge?: React.ReactNode;\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\tasChild?: boolean;\n\tchildren?: React.ReactNode;\n}\n\nexport interface NavigationRailProps {\n\tvariant?: NavigationRailVariant;\n\tlabelVisibility?: NavigationRailLabelVisibility;\n\theader?: React.ReactNode;\n\tfab?: React.ReactNode;\n\tfabPlacement?: \"contained\" | \"spatialized\";\n\tfooter?: React.ReactNode;\n\tnarrow?: boolean;\n\topen?: boolean;\n\tonClose?: () => void;\n\tactiveIndicatorTransition?: Transition;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nconst NavigationRailContext = React.createContext<{\n\tvariant: NavigationRailVariant;\n\tlabelVisibility: NavigationRailLabelVisibility;\n\tactiveIndicatorTransition?: Transition;\n}>({ variant: \"collapsed\", labelVisibility: \"labeled\" });\n\nconst MD3_MODAL_TRANSITION = {\n\ttype: \"tween\",\n\tease: [0.05, 0.7, 0.1, 1],\n\tduration: 0.3,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CVA Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst railContainerVariants = cva(\n\t\"flex flex-col overflow-y-auto overflow-x-hidden select-none transition-colors duration-300\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tcollapsed:\n\t\t\t\t\t\"items-center h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none\",\n\t\t\t\texpanded:\n\t\t\t\t\t\"items-start h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none\",\n\t\t\t\tmodal:\n\t\t\t\t\t\"bg-m3-surface shadow-lg rounded-r-[var(--m3-shape-corner-large)] h-full pt-11 pb-4\",\n\t\t\t\txr: \"h-fit py-5 rounded-[48px] shadow-xl bg-m3-surface border border-white/5\",\n\t\t\t},\n\t\t\tnarrow: {\n\t\t\t\ttrue: \"w-20\",\n\t\t\t\tfalse: \"w-24\",\n\t\t\t},\n\t\t},\n\t\tcompoundVariants: [\n\t\t\t{ variant: \"expanded\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t\t{ variant: \"modal\", className: \"min-w-[13.75rem] max-w-[22.5rem]\" },\n\t\t],\n\t\tdefaultVariants: {\n\t\t\tvariant: \"collapsed\",\n\t\t\tnarrow: false,\n\t\t},\n\t},\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction cloneIconWithFill(\n\ticon: React.ReactNode,\n\tselected: boolean,\n): React.ReactNode {\n\tif (!React.isValidElement(icon)) return icon;\n\tif ((icon.type as unknown) === Icon) {\n\t\treturn React.cloneElement(\n\t\t\ticon as React.ReactElement<{ fill?: 0 | 1; animateFill?: boolean }>,\n\t\t\t{ fill: selected ? 1 : 0, animateFill: true },\n\t\t);\n\t}\n\treturn icon;\n}\n\nfunction getMenuItems(container: HTMLElement): HTMLElement[] {\n\treturn Array.from(\n\t\tcontainer.querySelectorAll<HTMLElement>(\n\t\t\t'[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n\t\t),\n\t);\n}\n\nfunction setFocusedItem(items: HTMLElement[], index: number) {\n\tfor (const item of items) item.tabIndex = -1;\n\tconst target = items[index];\n\tif (target) {\n\t\ttarget.tabIndex = 0;\n\t\ttarget.focus();\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem Sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ActivePillProps {\n\tlayoutId: string;\n\tdisableInitial?: boolean;\n}\n\nfunction ActivePill({ layoutId, disableInitial = false }: ActivePillProps) {\n\tconst { activeIndicatorTransition } = React.useContext(NavigationRailContext);\n\n\treturn (\n\t\t<m.div\n\t\t\tlayoutId={layoutId}\n\t\t\tclassName=\"absolute inset-0 bg-m3-secondary-container pointer-events-none\"\n\t\t\tstyle={{ borderRadius: 9999, zIndex: 0, originX: 0.5, originY: 0.5 }}\n\t\t\tinitial={disableInitial ? false : { opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\texit={{ opacity: 0, scale: 0.5, transition: { duration: 0.15 } }}\n\t\t\ttransition={activeIndicatorTransition || SPRING_TRANSITION_EXPRESSIVE}\n\t\t/>\n\t);\n}\n\nfunction HoverStateLayer() {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] transition-opacity duration-200 pointer-events-none z-0\" />\n\t);\n}\n\ninterface RippleLayerProps {\n\tripples: ReturnType<typeof useRippleState>[\"ripples\"];\n\tonRippleDone: ReturnType<typeof useRippleState>[\"removeRipple\"];\n}\n\nfunction RippleLayer({ ripples, onRippleDone }: RippleLayerProps) {\n\treturn (\n\t\t<div className=\"absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0\">\n\t\t\t<Ripple ripples={ripples} onRippleDone={onRippleDone} />\n\t\t</div>\n\t);\n}\n\ninterface IconContainerProps {\n\tselected: boolean;\n\tbadge?: React.ReactNode;\n\tchildren: React.ReactNode;\n}\n\nfunction IconContainer({ selected, badge, children }: IconContainerProps) {\n\treturn (\n\t\t<div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex items-center justify-center size-6 transition-colors duration-200\",\n\t\t\t\tselected\n\t\t\t\t\t? \"text-m3-on-secondary-container\"\n\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{badge && (\n\t\t\t\t<span className=\"absolute -top-1 -right-1 flex min-w-3 h-3 items-center justify-center rounded-full bg-m3-error px-1 text-[10px] font-medium leading-none tracking-normal text-m3-on-error ring-[1.5px] ring-m3-surface\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRailItem\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NavigationRailItemComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tNavigationRailItemProps\n>(\n\t(\n\t\t{\n\t\t\tselected,\n\t\t\ticon,\n\t\t\tlabel,\n\t\t\tonClick,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { variant, labelVisibility } = React.useContext(\n\t\t\tNavigationRailContext,\n\t\t);\n\t\tconst isExpanded = variant === \"expanded\" || variant === \"modal\";\n\t\tconst isModal = variant === \"modal\";\n\t\tconst enableLayout = !isModal;\n\n\t\tconst activePillId = `rail-pill-${React.useId()}`;\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled,\n\t\t});\n\n\t\tconst showLabel =\n\t\t\tisExpanded ||\n\t\t\tlabelVisibility === \"labeled\" ||\n\t\t\t(labelVisibility === \"auto\" && selected);\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.();\n\t\t\t},\n\t\t\t[disabled, onClick],\n\t\t);\n\n\t\tconst filledIcon = cloneIconWithFill(icon, selected);\n\n\t\tconst labelInitial = isModal\n\t\t\t? false\n\t\t\t: { opacity: 0, x: isExpanded ? -12 : 0, y: isExpanded ? 0 : -8 };\n\n\t\tconst itemClassName = cn(\n\t\t\t\"group relative flex cursor-pointer transition-colors duration-200 outline-none select-none\",\n\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2 rounded-full\",\n\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\tisExpanded\n\t\t\t\t? \"w-full flex-row items-center px-3 h-14\"\n\t\t\t\t: \"w-full flex-col justify-center h-14\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild && children) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\tconst innerContent = (\n\t\t\t\t<>\n\t\t\t\t\t{/* Pill container - adapts layout for expanded vs collapsed */}\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex z-10\",\n\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t? \"flex-row items-center w-fit h-14 px-4 gap-x-3 rounded-full\"\n\t\t\t\t\t\t\t\t: \"flex-col items-center justify-center w-full gap-y-1 rounded-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t\t<ActivePill\n\t\t\t\t\t\t\t\t\t\tlayoutId={activePillId}\n\t\t\t\t\t\t\t\t\t\tdisableInitial={isModal}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Icon pill - collapsed mode */}\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\tisExpanded ? \"size-6\" : \"h-8 w-14 mx-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{selected && <ActivePill layoutId={activePillId} />}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\tclassName=\"relative z-10 flex size-6 items-center justify-center text-current\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</m.div>\n\n\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t\t{showLabel && (label || child.props.children) && (\n\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\tkey=\"rail-label\"\n\t\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\t\tinitial={labelInitial}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, transition: { duration: 0.1 } }}\n\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"z-10 transition-colors duration-200 whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-surface\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t\t\t\t? \"text-sm font-medium tracking-wide text-left\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-xs font-medium tracking-wide\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{child.props.children ?? label}\n\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</m.div>\n\n\t\t\t\t\t<TouchTarget />\n\t\t\t\t</>\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 as React.Ref<HTMLElement>}\n\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\ttabIndex={-1}\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\tlayout={enableLayout}\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\taria-current={selected ? \"page\" : undefined}\n\t\t\t\t\taria-disabled={disabled ? true : undefined}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabelProp || (typeof label === \"string\" ? label : undefined)\n\t\t\t\t\t}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t>\n\t\t\t\t\t{/* Pill container - adapts layout for expanded vs collapsed */}\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative flex z-10\",\n\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t? \"flex-row items-center w-fit h-14 px-4 gap-x-3 rounded-full\"\n\t\t\t\t\t\t\t\t: \"flex-col items-center justify-center w-full gap-y-1 rounded-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t\t<ActivePill\n\t\t\t\t\t\t\t\t\t\tlayoutId={activePillId}\n\t\t\t\t\t\t\t\t\t\tdisableInitial={isModal}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t{isExpanded && (\n\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Icon pill - collapsed mode */}\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayout={enableLayout}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative flex items-center justify-center shrink-0 z-10\",\n\t\t\t\t\t\t\t\tisExpanded ? \"size-6\" : \"h-8 w-14 mx-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{selected && <ActivePill layoutId={activePillId} />}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isExpanded && <HoverStateLayer />}\n\t\t\t\t\t\t\t{!isExpanded && (\n\t\t\t\t\t\t\t\t<RippleLayer ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\tclassName=\"relative z-10 flex size-6 items-center justify-center text-current\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconContainer selected={selected} badge={badge}>\n\t\t\t\t\t\t\t\t\t{filledIcon}\n\t\t\t\t\t\t\t\t</IconContainer>\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t</m.div>\n\n\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t\t\t\t\t{showLabel && label && (\n\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\tkey=\"rail-label\"\n\t\t\t\t\t\t\t\t\tlayout={enableLayout ? \"position\" : false}\n\t\t\t\t\t\t\t\t\tinitial={labelInitial}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, transition: { duration: 0.1 } }}\n\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"z-10 transition-colors duration-200 whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t\t\t\t\t? \"text-m3-on-surface\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\t\t\tisExpanded\n\t\t\t\t\t\t\t\t\t\t\t? \"text-sm font-medium tracking-wide text-left\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-xs font-medium tracking-wide\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</m.div>\n\n\t\t\t\t\t<TouchTarget />\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailItemComponent.displayName = \"NavigationRailItem\";\nexport const NavigationRailItem = React.memo(NavigationRailItemComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NavigationRail Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction useRoving(navRef: React.RefObject<HTMLElement | null>) {\n\tReact.useEffect(() => {\n\t\tif (!navRef.current) return;\n\t\tconst items = getMenuItems(navRef.current);\n\t\tconst selected = items.find(\n\t\t\t(el) => el.getAttribute(\"aria-current\") === \"page\",\n\t\t);\n\n\t\tfor (const item of items) item.tabIndex = -1;\n\t\tconst firstFocusable = selected ?? items[0];\n\t\tif (firstFocusable) firstFocusable.tabIndex = 0;\n\t}, [navRef]);\n\n\treturn React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLElement>) => {\n\t\t\tif (!navRef.current) return;\n\t\t\tconst items = getMenuItems(navRef.current);\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n\t\t\tconst keyMap: Record<string, () => number> = {\n\t\t\t\tArrowDown: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowRight: () =>\n\t\t\t\t\tcurrentIndex < items.length - 1 ? currentIndex + 1 : 0,\n\t\t\t\tArrowUp: () => (currentIndex > 0 ? currentIndex - 1 : items.length - 1),\n\t\t\t\tArrowLeft: () =>\n\t\t\t\t\tcurrentIndex > 0 ? currentIndex - 1 : items.length - 1,\n\t\t\t\tHome: () => 0,\n\t\t\t\tEnd: () => items.length - 1,\n\t\t\t};\n\n\t\t\tconst getNextIndex = keyMap[e.key];\n\n\t\t\tif (getNextIndex) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetFocusedItem(items, getNextIndex());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(e.key === \" \" || e.key === \"Enter\") &&\n\t\t\t\titems.includes(document.activeElement as HTMLElement)\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\t(document.activeElement as HTMLElement).click();\n\t\t\t}\n\t\t},\n\t\t[navRef],\n\t);\n}\n\nconst NavigationRailComponent = React.forwardRef<\n\tHTMLElement,\n\tNavigationRailProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"collapsed\",\n\t\t\tlabelVisibility = \"labeled\",\n\t\t\theader,\n\t\t\tfab,\n\t\t\tfabPlacement = \"contained\",\n\t\t\tfooter,\n\t\t\tnarrow = false,\n\t\t\topen = false,\n\t\t\tonClose,\n\t\t\tactiveIndicatorTransition,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isModal = variant === \"modal\";\n\t\tconst isXr = variant === \"xr\";\n\t\tconst isSpatial = isXr && fabPlacement === \"spatialized\";\n\t\tconst applyAnimation = !isXr || !isSpatial;\n\n\t\tconst navRef = React.useRef<HTMLElement>(null);\n\t\tconst handleKeyDown = useRoving(navRef);\n\n\t\tconst setRefs = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\tnavRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\tconst navBaseClasses = cn(railContainerVariants({ variant, narrow }));\n\t\tconst modalPositioning = isModal ? \"fixed left-0 top-0 z-[100]\" : \"\";\n\n\t\tconst navHeaderSpacing = (() => {\n\t\t\tif (!isXr) return \"mb-6 min-h-10\";\n\t\t\tif (fabPlacement === \"contained\") return fab ? \"mb-10\" : \"mb-5\";\n\t\t\treturn \"mb-5\";\n\t\t})();\n\n\t\tconst navElement = (\n\t\t\t<m.nav\n\t\t\t\tkey=\"md3-nav-rail\"\n\t\t\t\tlayout={!isModal}\n\t\t\t\tref={isSpatial ? undefined : setRefs}\n\t\t\t\trole=\"navigation\"\n\t\t\t\taria-label=\"Main navigation\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tnavBaseClasses,\n\t\t\t\t\t!isSpatial && modalPositioning,\n\t\t\t\t\t!isSpatial && isModal && applyAnimation && \"will-change-transform\",\n\t\t\t\t\t!isSpatial && className,\n\t\t\t\t)}\n\t\t\t\tstyle={isSpatial ? undefined : style}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tinitial={isModal && applyAnimation ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal && applyAnimation ? { x: 0 } : false}\n\t\t\t\texit={isModal && applyAnimation ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{(header || (fab && !isSpatial)) && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full flex-col items-center justify-start shrink-0 empty:hidden\",\n\t\t\t\t\t\t\tnavHeaderSpacing,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{header}\n\t\t\t\t\t\t{header && fab && !isSpatial && (\n\t\t\t\t\t\t\t<div className={isXr ? \"h-1\" : \"h-4\"} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!isSpatial && fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\trole=\"menubar\"\n\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\tclassName=\"flex flex-col flex-1 w-full gap-y-5\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\n\t\t\t\t{footer && (\n\t\t\t\t\t<div className=\"flex w-full flex-col items-center justify-end mt-auto shrink-0 pt-4 empty:hidden\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</m.nav>\n\t\t);\n\n\t\tconst spatialFabSize = narrow\n\t\t\t? \"size-20 rounded-[40px]\"\n\t\t\t: \"size-24 rounded-[48px]\";\n\n\t\tconst spatialWrapper = (\n\t\t\t<m.div\n\t\t\t\tkey=\"md3-nav-wrapper\"\n\t\t\t\tref={setRefs}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col items-center gap-y-5 pointer-events-none\",\n\t\t\t\t\tmodalPositioning,\n\t\t\t\t\t\"m-6\",\n\t\t\t\t\tisModal && \"will-change-transform\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={style}\n\t\t\t\tinitial={isModal ? { x: \"-100%\" } : false}\n\t\t\t\tanimate={isModal ? { x: 0 } : false}\n\t\t\t\texit={isModal ? { x: \"-100%\" } : undefined}\n\t\t\t\ttransition={isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION}\n\t\t\t>\n\t\t\t\t{fab && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center pointer-events-auto\",\n\t\t\t\t\t\t\tspatialFabSize,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fab}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{React.cloneElement(\n\t\t\t\t\tnavElement as React.ReactElement<{ className?: string }>,\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: cn(navBaseClasses, \"pointer-events-auto\"),\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t</m.div>\n\t\t);\n\n\t\tconst finalNavElement = isSpatial ? spatialWrapper : navElement;\n\n\t\tconst contextValue = {\n\t\t\tvariant,\n\t\t\tlabelVisibility,\n\t\t\tactiveIndicatorTransition,\n\t\t};\n\n\t\tif (isModal) {\n\t\t\tif (typeof document === \"undefined\") return null;\n\n\t\t\treturn createPortal(\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t{open && (\n\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\tkey=\"md3-nav-backdrop\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"linear\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"fixed inset-0 bg-black/40 z-40 will-change-[opacity]\"\n\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{open && finalNavElement}\n\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t\t</LazyMotion>,\n\t\t\t\tdocument.body,\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<NavigationRailContext.Provider value={contextValue}>\n\t\t\t\t\t{finalNavElement}\n\t\t\t\t</NavigationRailContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nNavigationRailComponent.displayName = \"NavigationRail\";\nexport const NavigationRail = React.memo(NavigationRailComponent);\n","/**\n * @file use-search-keyboard.ts\n * Keyboard navigation hook for the MD3 Search component.\n *\n * Handles:\n * - ArrowDown / ArrowUp → navigate through suggestions (role=\"option\")\n * - Enter → submit search or select active suggestion\n * - Escape → close the SearchView\n */\n\nimport * as React from \"react\";\nimport type { UseSearchKeyboardReturn } from \"../search.types\";\n\ninterface UseSearchKeyboardOptions {\n\t/** Whether the SearchView is currently open. */\n\tactive: boolean;\n\t/** Callback to close the SearchView. */\n\tonActiveChange: (active: boolean) => void;\n\t/** Callback for search submission. */\n\tonSearch: (query: string) => void;\n\t/** Current search query. */\n\tquery: string;\n\t/** Total number of suggestion items in the listbox. */\n\titemCount: number;\n\t/** Called when user selects a specific suggestion by index. */\n\tonSelectSuggestion?: (index: number) => void;\n}\n\n/**\n * Manages keyboard navigation for the Search component.\n *\n * Complies with WAI-ARIA Combobox pattern:\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n */\nexport function useSearchKeyboard({\n\tactive,\n\tonActiveChange,\n\tonSearch,\n\tquery,\n\titemCount,\n\tonSelectSuggestion,\n}: UseSearchKeyboardOptions): UseSearchKeyboardReturn {\n\tconst [activeIndex, setActiveIndex] = React.useState(-1);\n\n\t// Reset active index when SearchView closes or query changes.\n\t// Done during render phase to prevent double-renders on every keystroke,\n\t// which would otherwise cause severe layout thrashing.\n\tconst resetKeyRef = React.useRef(`${active}:${query}`);\n\tconst currentKey = `${active}:${query}`;\n\tif (resetKeyRef.current !== currentKey) {\n\t\tresetKeyRef.current = currentKey;\n\t\tsetActiveIndex(-1);\n\t}\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (!active) return;\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => (i < itemCount - 1 ? i + 1 : i));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => (i > -1 ? i - 1 : -1));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Enter\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (activeIndex >= 0 && onSelectSuggestion) {\n\t\t\t\t\t\tonSelectSuggestion(activeIndex);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonSearch(query);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Escape\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonActiveChange(false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tactive,\n\t\t\tactiveIndex,\n\t\t\titemCount,\n\t\t\tonActiveChange,\n\t\t\tonSearch,\n\t\t\tonSelectSuggestion,\n\t\t\tquery,\n\t\t],\n\t);\n\n\tconst resetActiveIndex = React.useCallback(() => {\n\t\tsetActiveIndex(-1);\n\t}, []);\n\n\treturn { activeIndex, handleKeyDown, resetActiveIndex };\n}\n","/**\n * @file search.tokens.ts\n * MD3 Expressive Search — Design tokens ported from:\n * - SearchBarTokens.kt (v0_210)\n * - SearchViewTokens.kt (v0_210)\n *\n * All dimensional values are in px (1dp = 1px on web).\n * Colors reference CSS custom properties — do NOT hardcode hex.\n * @see docs/m3/search/SearchBarTokens.kt\n * @see docs/m3/search/SearchViewTokens.kt\n */\nimport {\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"../shared/motion-tokens\";\n// ─── Dimensional Tokens ───────────────────────────────────────────────────────\n\n/**\n * Height and shape tokens for Search variants.\n * Maps directly from MD3 Kotlin token files.\n */\nexport const SearchTokens = {\n\t// ── Heights ─────────────────────────────────────────────────────────────\n\theights: {\n\t\t/** SearchBarTokens.ContainerHeight = 56dp */\n\t\tbar: 56,\n\t\t/** SearchViewTokens.DockedHeaderContainerHeight = 56dp */\n\t\tdockedHeader: 56,\n\t\t/** SearchViewTokens.FullScreenHeaderContainerHeight = 72dp */\n\t\tfullScreenHeader: 72,\n\t},\n\n\t// ── Avatar ────────────────────────────────────────────────────────────\n\t/** SearchBarTokens.AvatarSize = 30dp */\n\tavatarSize: 30,\n\n\t// ── Icon ───────────────────────────────────────────────────────────────\n\t/** Standard icon size for leading/trailing icons. */\n\ticonSize: 20,\n\t/** Touch target for interactive icons per MD3 a11y spec. */\n\ticonTouchTarget: 48,\n\n\t// ── Gap ────────────────────────────────────────────────────────────────\n\t/** Gap between SearchBar and results list when hasGap=true. */\n\tdropdownGap: 2,\n} as const;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\n/**\n * CSS custom property references for Search colors.\n * Maps to --md-sys-color-* tokens in the MD3 theme system.\n *\n * SearchBarTokens.kt:\n * - ContainerColor → SurfaceContainerHigh\n * - LeadingIconColor → OnSurface\n * - TrailingIconColor → OnSurfaceVariant\n * - InputTextColor → OnSurface\n * - SupportingTextColor → OnSurfaceVariant (placeholder)\n *\n * SearchViewTokens.kt:\n * - ContainerColor → SurfaceContainerHigh\n * - DividerColor → Outline\n */\nexport const SEARCH_COLORS = {\n\t/** SearchBarTokens.ContainerColor → surface-container-high */\n\tcontainer: \"var(--md-sys-color-surface-container-high)\",\n\t/** SearchBarTokens.LeadingIconColor → on-surface */\n\tleadingIcon: \"var(--md-sys-color-on-surface)\",\n\t/** SearchBarTokens.TrailingIconColor → on-surface-variant */\n\ttrailingIcon: \"var(--md-sys-color-on-surface-variant)\",\n\t/** SearchBarTokens.InputTextColor → on-surface */\n\tinputText: \"var(--md-sys-color-on-surface)\",\n\t/** SearchBarTokens.SupportingTextColor → on-surface-variant (placeholder) */\n\tsupportingText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** SearchViewTokens.DividerColor → outline */\n\tdivider: \"var(--md-sys-color-outline)\",\n\t/** Focus indicator → secondary */\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n} as const;\n\n// ─── Typography Tokens ────────────────────────────────────────────────────────\n\n/**\n * SearchBarTokens.InputTextFont = BodyLarge (16sp / 24sp line-height).\n * SearchBarTokens.SupportingTextFont = BodyLarge.\n */\nexport const SEARCH_TYPOGRAPHY = {\n\t/** BodyLarge — used for input text and placeholder. */\n\tbodyLarge: \"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n} as const;\n\nexport const SEARCH_BAR_EXPAND_SPRING = FAST_SPATIAL_SPRING;\n\nexport const SEARCH_DOCKED_REVEAL_SPRING = DEFAULT_SPATIAL_SPRING;\n\nexport const SEARCH_FULLSCREEN_SPRING = SLOW_SPATIAL_SPRING;\n\nexport const SEARCH_BAR_EXIT_SPRING = FAST_SPATIAL_SPRING;\n","/**\n * @file animated-placeholder.tsx\n * MD3 Expressive Search — Animated placeholder overlay.\n *\n * Replaces the native `::placeholder` with a GPU-accelerated `translateX`\n * animation so the placeholder text can smoothly slide from its alignment\n * position (center / right) to left when the search input is focused.\n *\n * Implementation notes:\n * - Only `transform: translateX` is animated → no layout triggers, no paint.\n * - Container width is measured once via `useLayoutEffect` (before paint) to\n * avoid a first-render flash, then kept fresh via `ResizeObserver`.\n * - xOffset is stored in `useState` so Framer Motion picks up changes and\n * re-animates smoothly on container resize.\n * - The span is never unmounted — only opacity-toggled — to preserve the\n * measurement ref between renders.\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SEARCH_COLORS, SEARCH_TYPOGRAPHY } from \"./search.tokens\";\n\n/** Spring tuned to match MD3 Standard Decelerate curve. */\nconst PLACEHOLDER_SPRING = {\n\ttype: \"spring\" as const,\n\tstiffness: 350,\n\tdamping: 30,\n\tmass: 0.8,\n};\n\ninterface AnimatedPlaceholderProps {\n\t/** Placeholder text to display. */\n\ttext: string;\n\t/** Alignment of the placeholder when idle (not focused). @default \"left\" */\n\ttextAlign: \"left\" | \"center\" | \"right\";\n\t/**\n\t * Whether the placeholder should be visible.\n\t * Pass `!query` — hide when the user has typed something.\n\t */\n\tvisible: boolean;\n\t/**\n\t * Whether the search is in an active/focused state.\n\t * When `true`, the placeholder snaps to `left` regardless of `textAlign`.\n\t */\n\tfocused: boolean;\n\t/**\n\t * The `<input>` element that this component wraps.\n\t * It should have `w-full` instead of `flex-1` since this wrapper\n\t * takes over the `flex-1` role in the parent flex layout.\n\t */\n\tchildren: React.ReactNode;\n\t/** Extra className forwarded to the wrapper div. */\n\tclassName?: string;\n}\n\n/**\n * Wraps a search `<input>` with an animated placeholder overlay.\n *\n * The wrapper div occupies `flex-1` so it fits seamlessly in the\n * horizontal flex layout used by search bar headers. The children\n * (the `<input>`) should use `w-full` to fill the wrapper.\n *\n * Accessibility: `aria-label` on the `<input>` carries the placeholder\n * text for screen readers; this span is `aria-hidden=\"true\"`.\n */\nexport function AnimatedPlaceholder({\n\ttext,\n\ttextAlign,\n\tvisible,\n\tfocused,\n\tchildren,\n\tclassName,\n}: AnimatedPlaceholderProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\tconst spanRef = React.useRef<HTMLSpanElement | null>(null);\n\n\t// Offset in pixels from left when idle. 0 means no animation (left-aligned).\n\tconst [xOffset, setXOffset] = React.useState(0);\n\n\tconst recalculate = React.useCallback(() => {\n\t\tconst container = containerRef.current;\n\t\tconst span = spanRef.current;\n\t\tif (!container || !span || textAlign === \"left\") {\n\t\t\tsetXOffset(0);\n\t\t\treturn;\n\t\t}\n\t\tconst containerWidth = container.offsetWidth;\n\t\tconst textWidth = span.offsetWidth;\n\t\tif (textAlign === \"center\") {\n\t\t\tsetXOffset(Math.max(0, (containerWidth - textWidth) / 2));\n\t\t} else {\n\t\t\t// right\n\t\t\tsetXOffset(Math.max(0, containerWidth - textWidth));\n\t\t}\n\t}, [textAlign]);\n\n\t// Measure synchronously before first paint to prevent a position flash.\n\tReact.useLayoutEffect(() => {\n\t\trecalculate();\n\t}, [recalculate]);\n\n\t// Keep measurement fresh when the container is resized.\n\tReact.useEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\t\tconst observer = new ResizeObserver(recalculate);\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, [recalculate]);\n\n\t// When focused or no longer visible (user typed), snap to left (x=0).\n\tconst targetX = focused || !visible ? 0 : xOffset;\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"relative flex-1 min-w-0\", className)}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{/* Animated placeholder — decorative only, aria-hidden */}\n\t\t\t<m.span\n\t\t\t\tref={(el) => {\n\t\t\t\t\tspanRef.current = el;\n\t\t\t\t}}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none absolute inset-y-0 left-0\",\n\t\t\t\t\t\"flex items-center whitespace-nowrap select-none\",\n\t\t\t\t\tSEARCH_TYPOGRAPHY.bodyLarge,\n\t\t\t\t)}\n\t\t\t\tstyle={{ color: SEARCH_COLORS.supportingText }}\n\t\t\t\tanimate={{\n\t\t\t\t\tx: targetX,\n\t\t\t\t\topacity: visible ? 1 : 0,\n\t\t\t\t}}\n\t\t\t\ttransition={shouldReduceMotion ? { duration: 0 } : PLACEHOLDER_SPRING}\n\t\t\t>\n\t\t\t\t{text}\n\t\t\t</m.span>\n\t\t</div>\n\t);\n}\n","/**\n * @file search-bar.tsx\n * MD3 Expressive SearchBar — Collapsed state.\n *\n * Renders a pill-shaped search bar (CornerFull, h-56px).\n * When focused/clicked → calls onActiveChange(true) to open SearchView.\n *\n * Option B (MD3 morphing): SearchBar is wrapped in its own AnimatePresence\n * with mode=\"popLayout\". When SearchView opens, SearchBar plays an exit\n * animation (opacity → 0, scale → 0.95) before unmounting, releasing the\n * shared layoutId so SearchView can claim it and morph from the same origin.\n *\n * Role: combobox (WAI-ARIA Search Combobox pattern).\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport {\n\tSEARCH_BAR_EXIT_SPRING,\n\tSEARCH_BAR_EXPAND_SPRING,\n\tSEARCH_COLORS,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\n\n/** Default search icon (Material Symbols). */\nfunction DefaultSearchIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\tstyle={{ fontSize: SearchTokens.iconSize }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tsearch\n\t\t</span>\n\t);\n}\n\ntype SearchBarProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"className\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\t/** KeyDown handler from useSearchKeyboard. */\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\t/** Currently highlighted suggestion index (-1 = none). */\n\t\tactiveIndex: number;\n\t};\n\n/**\n * SearchBar — collapsed state of the MD3 Search component.\n *\n * Uses Framer Motion `layout` + shared `layoutId` to morph into\n * SearchView when active. Wrapped in AnimatePresence with mode=\"popLayout\"\n * so it exits (fades/scales out) before SearchView claims the layoutId.\n */\nexport function SearchBar({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tclassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchBarProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tconst prevActiveRef = React.useRef(active);\n\n\tconst isRestoringFocusRef = React.useRef(false);\n\n\t// When SearchView opens, focus moves to SearchView's input.\n\t// When SearchView closes (true → false), restore focus here.\n\tReact.useEffect(() => {\n\t\tlet rafId: number;\n\t\tif (prevActiveRef.current === true && active === false) {\n\t\t\tisRestoringFocusRef.current = true;\n\t\t\tinputRef.current?.focus();\n\t\t\t// Reset after a tick to allow the focus event to fire\n\t\t\trafId = requestAnimationFrame(() => {\n\t\t\t\tisRestoringFocusRef.current = false;\n\t\t\t});\n\t\t}\n\t\tprevActiveRef.current = active;\n\t\treturn () => {\n\t\t\tif (rafId) cancelAnimationFrame(rafId);\n\t\t};\n\t}, [active]);\n\n\tconst handleFocus = () => {\n\t\tif (!active && !isRestoringFocusRef.current) {\n\t\t\tonActiveChange(true);\n\t\t}\n\t};\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\t// aria-activedescendant points to the highlighted suggestion\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\treturn (\n\t\t/*\n\t\t * AnimatePresence mode=\"popLayout\":\n\t\t * When SearchView opens (active=true), SearchBar plays its exit animation\n\t\t * first, then unmounts — releasing the shared layoutId for SearchView to\n\t\t * claim and morph from the pill shape.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{!active && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey={searchId}\n\t\t\t\t\tlayout={!shouldReduceMotion}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\ttransition={shouldReduceMotion ? undefined : SEARCH_BAR_EXPAND_SPRING}\n\t\t\t\t\tclassName={cn(\"relative\", className)}\n\t\t\t\t\tstyle={{ height: SearchTokens.heights.bar }}\n\t\t\t\t\tinitial={shouldReduceMotion ? false : { opacity: 0, scale: 0.95 }}\n\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\texit={\n\t\t\t\t\t\tshouldReduceMotion\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { opacity: 0, scale: 0.95, transition: SEARCH_BAR_EXIT_SPRING }\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Background layer — rounded-full per SearchBarTokens.ContainerShape */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0 rounded-full\"\n\t\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* <search> is the semantic element for role=\"search\" */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"relative flex h-full items-center gap-2 rounded-full px-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{leadingIcon ?? <DefaultSearchIcon />}\n\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t{/* AnimatedPlaceholder wraps the input to provide a smooth\n\t\t\t\t\t\t\t translateX animation from textAlign → left on focus. */}\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* role=\"combobox\" per WAI-ARIA combobox pattern */}\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={searchId}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={active}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t{trailingIcon && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{trailingIcon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import * as React from \"react\";\n\n/**\n * MD3 Expressive Search Context\n * Shared state for the Search orchestrator and its children.\n */\ninterface SearchContextValue {\n\t/** Unique ID for the results listbox, used for aria-controls. */\n\tlistboxId: string;\n\t/** Currently highlighted suggestion index. -1 = none. */\n\tactiveIndex: number;\n}\n\nconst SearchContext = React.createContext<SearchContextValue | null>(null);\n\n/**\n * Provider for Search component state.\n * Internal use only within the library.\n */\nexport function SearchProvider({\n\tchildren,\n\tvalue,\n}: {\n\tchildren: React.ReactNode;\n\tvalue: SearchContextValue;\n}) {\n\treturn (\n\t\t<SearchContext.Provider value={value}>{children}</SearchContext.Provider>\n\t);\n}\n\n/**\n * Hook to access Search state from children (e.g., search items).\n */\nexport function useSearch() {\n\tconst context = React.useContext(SearchContext);\n\tif (!context) {\n\t\t// If used outside Search, return defaults instead of throwing to avoid crashing simple use cases\n\t\treturn { listboxId: \"\", activeIndex: -1 };\n\t}\n\treturn context;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook to detect clicks outside of a specified element.\n *\n * @param handler - Callback function to execute when a click outside occurs.\n * @param enabled - Whether the listener is active.\n * @returns A RefObject to be attached to the target element.\n */\nexport function useClickOutside<T extends HTMLElement>(\n\thandler: () => void,\n\tenabled = true,\n) {\n\tconst ref = useRef<T>(null);\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst listener = (event: MouseEvent | TouchEvent) => {\n\t\t\tconst el = ref.current;\n\t\t\tif (!el || el.contains(event.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandler();\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", listener);\n\t\tdocument.addEventListener(\"touchstart\", listener);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", listener);\n\t\t\tdocument.removeEventListener(\"touchstart\", listener);\n\t\t};\n\t}, [handler, enabled]);\n\n\treturn ref;\n}\n","import * as React from \"react\";\n\n/**\n * Focuses `inputRef` when `active` becomes true, using a double-rAF\n * to wait for Framer Motion's layout animation to finish painting.\n */\nexport function useSearchViewFocus(\n\tinputRef: React.RefObject<HTMLInputElement | null>,\n\tactive: boolean,\n): void {\n\tReact.useEffect(() => {\n\t\tif (!active) return;\n\t\tlet raf2: number;\n\t\tconst raf1 = requestAnimationFrame(() => {\n\t\t\traf2 = requestAnimationFrame(() => {\n\t\t\t\tinputRef.current?.focus();\n\t\t\t});\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(raf1);\n\t\t\tif (raf2) cancelAnimationFrame(raf2);\n\t\t};\n\t}, [active, inputRef]);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// 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 icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SIZE_HEIGHT_STYLES: Record<string, string> = {\n\txs: \"h-8\",\n\tsm: \"h-10\",\n\tmd: \"h-14\",\n\tlg: \"h-24\",\n\txl: \"h-[8.5rem]\",\n};\n\n/**\n * Per-size container width variants (Tailwind utility classes).\n * MD3 Expressive width variants: default (1:1), narrow, wide.\n * @internal\n */\nconst WIDTH_SIZE_STYLES: Record<string, Record<string, string>> = {\n\txs: {\n\t\tdefault: \"w-8\",\n\t\tnarrow: \"w-8\",\n\t\twide: \"w-12\",\n\t},\n\tsm: {\n\t\tdefault: \"w-10\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[3.25rem]\",\n\t},\n\tmd: {\n\t\tdefault: \"w-14\",\n\t\tnarrow: \"w-12\",\n\t\twide: \"w-[4.5rem]\",\n\t},\n\tlg: {\n\t\tdefault: \"w-24\",\n\t\tnarrow: \"w-16\",\n\t\twide: \"w-32\",\n\t},\n\txl: {\n\t\tdefault: \"w-[8.5rem]\",\n\t\tnarrow: \"w-[6.5rem]\",\n\t\twide: \"w-[11.5rem]\",\n\t},\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container width variant following MD3 Expressive specification.\n\t * - `default`: 1:1 aspect ratio square/round container.\n\t * - `narrow`: compressed width.\n\t * - `wide`: extended width.\n\t * @default \"default\"\n\t */\n\twidthVariant?: \"default\" | \"narrow\" | \"wide\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * An optional icon to display when the icon button is in a selected toggle state (`variant=\"toggle\"` and `selected={true}`).\n\t * If omitted, falls back to `children`.\n\t */\n\tselectedIcon?: React.ReactNode;\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n\t/**\n\t * Change the component to the underlying child element and merge props/behavior.\n\t * Useful when wrapping in Next.js `<Link>` or custom anchor tags.\n\t * @default false\n\t */\n\tasChild?: boolean;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\twidthVariant = \"default\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tselectedIcon,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tasChild = false,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\tconst heightClass = SIZE_HEIGHT_STYLES[size] ?? SIZE_HEIGHT_STYLES.sm;\n\t\tconst widthClass =\n\t\t\t(WIDTH_SIZE_STYLES[size] ?? WIDTH_SIZE_STYLES.sm)[widthVariant] ??\n\t\t\tWIDTH_SIZE_STYLES.sm.default;\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\tkey={isSelected && selectedIcon ? \"selected-content\" : \"content\"}\n\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]\",\n\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSelected && selectedIcon\n\t\t\t\t\t\t\t\t? selectedIcon\n\t\t\t\t\t\t\t\t: asChild\n\t\t\t\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t\t\t\t\tReact.Children.only(children) as React.ReactElement<{\n\t\t\t\t\t\t\t\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t).props.children\n\t\t\t\t\t\t\t\t\t: children}\n\t\t\t\t\t\t</m.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst containerClassName = cn(\n\t\t\tbaseIconButtonClasses,\n\t\t\tresolvedColorClass,\n\t\t\toutlineWidthClass,\n\t\t\tdisabledBgClass,\n\t\t\t\"overflow-hidden\",\n\t\t\theightClass,\n\t\t\twidthClass,\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(style as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t\t{...(restProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={containerClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","import type * as React from \"react\";\nimport { IconButton } from \"../buttons/icon-button\";\nimport { SEARCH_COLORS } from \"./search.tokens\";\n\ninterface TrailingActionProps {\n\tquery: string;\n\ttrailingIcon?: React.ReactNode;\n\tonClear: () => void;\n}\n\n/** Clear button when query is non-empty, otherwise the trailing icon slot. */\nexport function TrailingAction({\n\tquery,\n\ttrailingIcon,\n\tonClear,\n}: TrailingActionProps) {\n\tif (query) {\n\t\treturn (\n\t\t\t<IconButton\n\t\t\t\tsize=\"sm\"\n\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\taria-label=\"Clear search\"\n\t\t\t\tonClick={onClear}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\t\t\tstyle={{ fontSize: 20 }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\tclose\n\t\t\t\t</span>\n\t\t\t</IconButton>\n\t\t);\n\t}\n\n\tif (trailingIcon) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\tstyle={{ color: SEARCH_COLORS.trailingIcon }}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{trailingIcon}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn null;\n}\n","/**\n * @file search-view-docked.tsx\n * MD3 Expressive SearchView — Docked variant.\n *\n * Displays as a popup dropdown below the SearchBar.\n * Recommended for medium and large screens (tablets, desktops).\n *\n * Shape: CornerExtraLarge (rounded-[28px]) per SearchViewTokens.DockedContainerShape.\n * Header height: 56dp per SearchViewTokens.DockedHeaderContainerHeight.\n *\n * Animation (Option B — MD3 morphing):\n * - Shares `layoutId` with SearchBar. After SearchBar exits via its own\n * AnimatePresence (mode=\"popLayout\"), this view claims the layoutId and\n * Framer Motion morphs the pill shape → rounded-[28px] container.\n * - Uses mode=\"popLayout\" so SearchBar can re-enter after this exits.\n * - Focus: double-rAF pattern syncs focus with layout animation frame.\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { useClickOutside } from \"../../hooks/useClickOutside\";\nimport { cn } from \"../../lib/utils\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport { useSearchViewFocus } from \"./hooks/use-search-view-focus\";\nimport {\n\tSEARCH_COLORS,\n\tSEARCH_DOCKED_REVEAL_SPRING,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\nimport { TrailingAction } from \"./trailing-action\";\n\ntype SearchViewDockedProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"styleType\"\n\t| \"hasGap\"\n\t| \"children\"\n\t| \"viewClassName\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\tactiveIndex: number;\n\t};\n\nexport function SearchViewDocked({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tstyleType = \"contained\",\n\thasGap = false,\n\tchildren,\n\tviewClassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchViewDockedProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tuseSearchViewFocus(inputRef, active);\n\n\tconst dropdownRef = useClickOutside<HTMLDivElement>(() => {\n\t\tonActiveChange(false);\n\t}, active);\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\treturn (\n\t\t/*\n\t\t * mode=\"popLayout\": when SearchView exits, it plays exit animation first,\n\t\t * then unmounts — freeing the layoutId for SearchBar to re-enter and morph back.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{active && (\n\t\t\t\t<m.div\n\t\t\t\t\tref={dropdownRef}\n\t\t\t\t\tkey={`${searchId}-view`}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// DockedContainerShape = CornerExtraLarge = 28dp radius\n\t\t\t\t\t\t\"rounded-[28px] overflow-hidden\",\n\t\t\t\t\t\tviewClassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={shouldReduceMotion ? {} : { opacity: 0, y: -8 }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : SEARCH_DOCKED_REVEAL_SPRING\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Header row — h-56px per DockedHeaderContainerHeight */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-4\"\n\t\t\t\t\t\tstyle={{ height: SearchTokens.heights.dockedHeader }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{leadingIcon}\n\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={`${searchId}-view`}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={true}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t<TrailingAction\n\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\ttrailingIcon={trailingIcon}\n\t\t\t\t\t\t\t\tonClear={() => onQueryChange(\"\")}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\n\t\t\t\t\t{/* hasGap: 2dp gap between header and results. */}\n\t\t\t\t\t{hasGap && children && <div className=\"h-0.5\" aria-hidden=\"true\" />}\n\n\t\t\t\t\t{/* Divider for \"divided\" styleType */}\n\t\t\t\t\t{styleType === \"divided\" && children && (\n\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\tclassName=\"border-0 border-t\"\n\t\t\t\t\t\t\tstyle={{ borderColor: SEARCH_COLORS.divider }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Results / Suggestions listbox */}\n\t\t\t\t\t{children && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={listboxId}\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\taria-label={`${ariaLabel} results`}\n\t\t\t\t\t\t\tclassName=\"min-h-30\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","/**\n * @file search-view-fullscreen.tsx\n * MD3 Expressive SearchView — FullScreen variant.\n *\n * Renders a full-screen overlay via React Portal.\n * Using Portal avoids z-index stacking context issues and ensures\n * the overlay always covers the entire viewport correctly.\n *\n * Animation (Option B — MD3 morphing):\n * - Shares `layoutId` with SearchBar. After SearchBar exits via its own\n * AnimatePresence (mode=\"popLayout\"), this view claims the layoutId and\n * Framer Motion morphs the pill shape → full-screen rect (CornerFull → CornerNone).\n * - mode=\"popLayout\" on this AnimatePresence enables SearchBar to re-enter\n * after this view exits.\n * - Focus: double-rAF pattern syncs focus with layout animation frame.\n *\n * Header height: 72dp per SearchViewTokens.FullScreenHeaderContainerHeight.\n * ESC key closes the view (handled by useSearchKeyboard).\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { IconButton } from \"../buttons/icon-button\";\nimport { AnimatedPlaceholder } from \"./animated-placeholder\";\nimport { useSearchViewFocus } from \"./hooks/use-search-view-focus\";\nimport {\n\tSEARCH_COLORS,\n\tSEARCH_FULLSCREEN_SPRING,\n\tSearchTokens,\n} from \"./search.tokens\";\nimport type { SearchInternalProps, SearchProps } from \"./search.types\";\nimport { TrailingAction } from \"./trailing-action\";\n\n/** Back arrow icon for FullScreen header. */\nfunction ArrowBackIcon() {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"material-symbols-rounded select-none leading-none\"\n\t\t\tstyle={{ fontSize: 24 }}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\tarrow_back\n\t\t</span>\n\t);\n}\n\ntype SearchViewFullScreenProps = Pick<\n\tSearchProps,\n\t| \"query\"\n\t| \"onQueryChange\"\n\t| \"onSearch\"\n\t| \"active\"\n\t| \"onActiveChange\"\n\t| \"leadingIcon\"\n\t| \"trailingIcon\"\n\t| \"placeholder\"\n\t| \"textAlign\"\n\t| \"styleType\"\n\t| \"children\"\n\t| \"viewClassName\"\n\t| \"aria-label\"\n> &\n\tSearchInternalProps & {\n\t\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t\tactiveIndex: number;\n\t};\n\n/**\n * SearchView FullScreen — full-screen overlay via React Portal.\n *\n * The `layoutId` shared with SearchBar enables Framer Motion to animate\n * the shape morphing from the pill (rounded-full) to a full-screen rect.\n *\n * Contained style: no divider, background preserved.\n * Divided style: HorizontalDivider between header and results.\n */\nexport function SearchViewFullScreen({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tstyleType = \"contained\",\n\tchildren,\n\tviewClassName,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tsearchId,\n\tlistboxId,\n\tonKeyDown,\n\tactiveIndex,\n}: SearchViewFullScreenProps) {\n\tconst shouldReduceMotion = useReducedMotion();\n\tconst inputRef = React.useRef<HTMLInputElement>(null);\n\n\tuseSearchViewFocus(inputRef, active);\n\n\t// Avoid SSR mismatch — only portal on client.\n\tconst [mounted, setMounted] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tsetMounted(true);\n\t}, []);\n\n\tconst handleFormSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tonSearch(query);\n\t};\n\n\tconst handleEscape = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.stopPropagation();\n\t\t\tonActiveChange(false);\n\t\t}\n\t};\n\n\tconst activeDescendant =\n\t\tactiveIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n\tif (!mounted) return null;\n\n\tconst content = (\n\t\t/*\n\t\t * mode=\"popLayout\": when FullScreen exits, it plays exit animation first,\n\t\t * then unmounts — freeing the layoutId for SearchBar to re-enter and morph back\n\t\t * to the pill shape.\n\t\t */\n\t\t<AnimatePresence mode=\"popLayout\">\n\t\t\t{active && (\n\t\t\t\t<m.div\n\t\t\t\t\tkey={`${searchId}-fs`}\n\t\t\t\t\tlayoutId={shouldReduceMotion ? undefined : searchId}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed inset-0 z-50 flex flex-col overflow-hidden\",\n\t\t\t\t\t\t// CornerNone — shape is resolved by Framer Motion layout animation\n\t\t\t\t\t\t\"rounded-none\",\n\t\t\t\t\t\tviewClassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ backgroundColor: SEARCH_COLORS.container }}\n\t\t\t\t\tinitial={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={shouldReduceMotion ? {} : { opacity: 0 }}\n\t\t\t\t\ttransition={\n\t\t\t\t\t\tshouldReduceMotion ? { duration: 0 } : SEARCH_FULLSCREEN_SPRING\n\t\t\t\t\t}\n\t\t\t\t\tonKeyDown={handleEscape}\n\t\t\t\t>\n\t\t\t\t\t{/* Header — h-72px per FullScreenHeaderContainerHeight */}\n\t\t\t\t\t<search\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-2 px-4\"\n\t\t\t\t\t\tstyle={{ height: SearchTokens.heights.fullScreenHeader }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<form className=\"contents\" onSubmit={handleFormSubmit}>\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.leadingIcon }}\n\t\t\t\t\t\t\t\taria-label=\"Close search\"\n\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tonActiveChange(false);\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{leadingIcon ?? <ArrowBackIcon />}\n\t\t\t\t\t\t\t</IconButton>\n\n\t\t\t\t\t\t\t<AnimatedPlaceholder\n\t\t\t\t\t\t\t\ttext={placeholder}\n\t\t\t\t\t\t\t\ttextAlign={textAlign}\n\t\t\t\t\t\t\t\tvisible={!query}\n\t\t\t\t\t\t\t\tfocused={active}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tid={`${searchId}-fs`}\n\t\t\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\taria-expanded={true}\n\t\t\t\t\t\t\t\t\taria-controls={listboxId}\n\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\taria-activedescendant={activeDescendant}\n\t\t\t\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"w-full bg-transparent border-none outline-none\",\n\t\t\t\t\t\t\t\t\t\t\"text-[16px] leading-6 font-normal tracking-[0.5px]\",\n\t\t\t\t\t\t\t\t\t\t\"placeholder:text-transparent\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ color: SEARCH_COLORS.inputText }}\n\t\t\t\t\t\t\t\t\tonChange={(e) => onQueryChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</AnimatedPlaceholder>\n\n\t\t\t\t\t\t\t<TrailingAction\n\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\ttrailingIcon={trailingIcon}\n\t\t\t\t\t\t\t\tonClear={() => onQueryChange(\"\")}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</search>\n\n\t\t\t\t\t{/* Divider for \"divided\" styleType */}\n\t\t\t\t\t{styleType === \"divided\" && (\n\t\t\t\t\t\t<hr\n\t\t\t\t\t\t\tclassName=\"border-0 border-t shrink-0\"\n\t\t\t\t\t\t\tstyle={{ borderColor: SEARCH_COLORS.divider }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Results / Suggestions listbox — scrollable area */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={listboxId}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\taria-label={`${ariaLabel} results`}\n\t\t\t\t\t\tclassName=\"flex-1 overflow-y-auto outline-none\"\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\tif (e.target === e.currentTarget) onActiveChange(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\te.target === e.currentTarget &&\n\t\t\t\t\t\t\t\t(e.key === \"Enter\" || e.key === \" \")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tonActiveChange(false);\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\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</m.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n\n\treturn createPortal(content, document.body);\n}\n","/**\n * @file search.tsx\n * MD3 Expressive Search — Orchestrator component.\n *\n * Composes SearchBar (collapsed) + SearchView (expanded) into a single\n * developer-facing API. Routes to the correct SearchView variant based on props.\n *\n * Developer usage:\n * ```tsx\n * const [query, setQuery] = useState(\"\");\n * const [active, setActive] = useState(false);\n *\n * <Search\n * query={query}\n * onQueryChange={setQuery}\n * onSearch={(q) => doSearch(q)}\n * active={active}\n * onActiveChange={setActive}\n * variant=\"docked\"\n * styleType=\"contained\"\n * >\n * {results.map((r) => (\n * <div key={r.id} id={`${YOUR_LISTBOX_ID}-option-0`} role=\"option\">\n * {r.label}\n * </div>\n * ))}\n * </Search>\n * ```\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { useSearchKeyboard } from \"./hooks/use-search-keyboard\";\nimport type { SearchProps } from \"./search.types\";\nimport { SearchBar } from \"./search-bar\";\nimport { SearchProvider, useSearch } from \"./search-context\";\nimport { SearchViewDocked } from \"./search-view-docked\";\nimport { SearchViewFullScreen } from \"./search-view-fullscreen\";\n\n/**\n * MD3 Expressive Search — Orchestrator component.\n *\n * Renders a SearchBar (collapsed pill) and the appropriate SearchView\n * (docked popup or fullscreen overlay) based on `variant`.\n *\n * The component is fully controlled:\n * - `active` / `onActiveChange` manage open/close state.\n * - `query` / `onQueryChange` manage input value.\n *\n * Shared `searchId` (React.useId) links SearchBar and SearchView via\n * Framer Motion `layoutId` for seamless animated transitions.\n */\nfunction SearchComponent({\n\tquery,\n\tonQueryChange,\n\tonSearch,\n\tactive,\n\tonActiveChange,\n\tvariant = \"docked\",\n\tstyleType = \"contained\",\n\thasGap = false,\n\tleadingIcon,\n\ttrailingIcon,\n\tplaceholder = \"Search\",\n\ttextAlign = \"left\",\n\tchildren,\n\tid,\n\t\"aria-label\": ariaLabel = \"Search\",\n\tclassName,\n\tviewClassName,\n}: SearchProps) {\n\tconst generatedId = React.useId();\n\tconst searchId = id ?? generatedId;\n\tconst listboxId = `${searchId}-listbox`;\n\n\tconst itemCount = React.Children.count(children);\n\n\tconst { activeIndex, handleKeyDown } = useSearchKeyboard({\n\t\tactive,\n\t\tonActiveChange,\n\t\tonSearch,\n\t\tquery,\n\t\titemCount,\n\t});\n\n\tconst sharedProps = {\n\t\tquery,\n\t\tonQueryChange,\n\t\tonSearch,\n\t\tactive,\n\t\tonActiveChange,\n\t\tleadingIcon,\n\t\ttrailingIcon,\n\t\tplaceholder,\n\t\ttextAlign,\n\t\t\"aria-label\": ariaLabel,\n\t\tsearchId,\n\t\tlistboxId,\n\t\tonKeyDown: handleKeyDown,\n\t\tactiveIndex,\n\t} as const;\n\n\treturn (\n\t\t<SearchProvider value={{ activeIndex, listboxId }}>\n\t\t\t<m.div className={className} style={{ minHeight: 56 }}>\n\t\t\t\t<SearchBar {...sharedProps} />\n\t\t\t\t{variant === \"fullscreen\" ? (\n\t\t\t\t\t<SearchViewFullScreen\n\t\t\t\t\t\t{...sharedProps}\n\t\t\t\t\t\tstyleType={styleType}\n\t\t\t\t\t\tviewClassName={viewClassName}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</SearchViewFullScreen>\n\t\t\t\t) : (\n\t\t\t\t\t<SearchViewDocked\n\t\t\t\t\t\t{...sharedProps}\n\t\t\t\t\t\tstyleType={styleType}\n\t\t\t\t\t\thasGap={hasGap}\n\t\t\t\t\t\tviewClassName={viewClassName}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</SearchViewDocked>\n\t\t\t\t)}\n\t\t\t</m.div>\n\t\t</SearchProvider>\n\t);\n}\n\n/** MD3 Expressive Search component with `Search.useSearch` context accessor. */\nexport const Search = Object.assign(SearchComponent, { useSearch });\n","/**\n * @file badge.tsx\n *\n * MD3 Expressive Badge component.\n *\n * - `Badge` → A small status indicator. Can be a dot (no content) or labeled (with content).\n * - `BadgedBox` → Positions a Badge at the top-trailing corner of an anchor element.\n *\n * @remarks\n * Token references (Kotlin source):\n * BadgeTokens — Size=6dp (→ 6px), LargeSize=16dp (→ 16px), Shape=CornerFull, Color=Error,\n * LargeLabelTextFont=LabelSmall, LargeLabelTextColor=OnError\n *\n * BadgedBox offsets:\n * - Small (dot): BadgeOffset = 6dp → translate(50%, -50%)\n * - Large (text): HOffset=12dp, VOffset=14dp → translate(35%, -35%)\n *\n * Architecture:\n * - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes\n * - Animation: Framer Motion (`LazyMotion` + `domMax`) spring mount/unmount\n * - A11y: `role=\"status\"` with `aria-label`, decorative dots use `aria-hidden=\"true\"`\n *\n * @see https://m3.material.io/components/badge/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { FAST_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Exclude onDrag-family event handlers that conflict between React's HTMLAttributes\n// and Framer Motion's MotionProps (different DragEvent signatures).\ntype SafeHTMLSpanAttrs = Omit<\n\tReact.HTMLAttributes<HTMLSpanElement>,\n\t| \"onDrag\"\n\t| \"onDragStart\"\n\t| \"onDragEnd\"\n\t| \"onDragEnter\"\n\t| \"onDragLeave\"\n\t| \"onDragOver\"\n\t| \"onDrop\"\n>;\n\nexport interface BadgeProps extends SafeHTMLSpanAttrs {\n\t/**\n\t * The content to display inside the badge.\n\t * - Omitted / undefined → renders as a small 6×6px dot (decorative).\n\t * - string | number → renders as a large badge (min 16px height) with label.\n\t *\n\t * Numbers exceeding `max` are displayed as `{max}+`.\n\t * Strings longer than 4 characters are truncated to 4.\n\t */\n\tchildren?: React.ReactNode;\n\n\t/**\n\t * Maximum numeric value to display before appending \"+\".\n\t * Only applies when `children` is a number.\n\t * @example max={99} + children={150} → \"99+\"\n\t */\n\tmax?: number;\n\n\t/**\n\t * Override the background (container) color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `error` token — `bg-m3-error`.\n\t */\n\tcontainerColor?: string;\n\n\t/**\n\t * Override the text/content color.\n\t * Accepts any valid CSS color value.\n\t * Defaults to MD3 `on-error` token — `text-m3-on-error`.\n\t */\n\tcontentColor?: string;\n}\n\nexport interface BadgedBoxProps {\n\t/**\n\t * The badge element to overlay on the anchor.\n\t * Typically a `<Badge />`.\n\t */\n\tbadge: React.ReactNode;\n\n\t/**\n\t * The anchor content that the badge is attached to.\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Additional className applied to the outer wrapper `span`.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Explicitly override size detection for badge positioning.\n\t * - `'small'` → BadgeOffset = 6dp → translate(50%, -50%)\n\t * - `'large'` → HOffset=12dp/VOffset=14dp → translate(35%, -35%)\n\t * When omitted, BadgedBox auto-detects by inspecting `badge` children prop.\n\t */\n\tbadgeSize?: \"small\" | \"large\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction formatBadgeLabel(children: React.ReactNode, max?: number): string {\n\tif (typeof children === \"number\") {\n\t\treturn max !== undefined && children > max ? `${max}+` : String(children);\n\t}\n\tif (typeof children === \"string\") {\n\t\tif (max !== undefined) {\n\t\t\tconst asNum = Number(children);\n\t\t\tif (!Number.isNaN(asNum) && asNum > max) return `${max}+`;\n\t\t}\n\t\treturn children.length > 4 ? children.slice(0, 4) : children;\n\t}\n\treturn \"\";\n}\n\nfunction detectBadgeHasContent(badge: React.ReactNode): boolean {\n\treturn (\n\t\tReact.isValidElement<{ children?: React.ReactNode }>(badge) &&\n\t\tbadge.props.children != null\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Badge\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst BadgeImpl = React.forwardRef<HTMLSpanElement, BadgeProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tmax,\n\t\t\tcontainerColor,\n\t\t\tcontentColor,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst hasContent = children != null;\n\t\tconst label = hasContent ? formatBadgeLabel(children, max) : \"\";\n\t\tconst reducedMotion = useReducedMotion();\n\t\tconst isDecorative = !hasContent && !ariaLabel;\n\n\t\tconst springTransition = reducedMotion\n\t\t\t? { duration: 0 }\n\t\t\t: FAST_SPATIAL_SPRING;\n\n\t\tconst colorStyle: React.CSSProperties = {\n\t\t\t...(containerColor && { backgroundColor: containerColor }),\n\t\t\t...(contentColor && { color: contentColor }),\n\t\t\t...style,\n\t\t};\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.span\n\t\t\t\t\tref={ref}\n\t\t\t\t\trole={isDecorative ? undefined : \"status\"}\n\t\t\t\t\taria-hidden={isDecorative ? \"true\" : undefined}\n\t\t\t\t\taria-label={hasContent ? (ariaLabel ?? label) : ariaLabel}\n\t\t\t\t\tinitial={{ scale: 0, opacity: 0 }}\n\t\t\t\t\tanimate={{ scale: 1, opacity: 1 }}\n\t\t\t\t\texit={{ scale: 0, opacity: 0 }}\n\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-full ring-[1.5px] ring-m3-surface\",\n\t\t\t\t\t\t!containerColor && \"bg-m3-error\",\n\t\t\t\t\t\thasContent\n\t\t\t\t\t\t\t? cn(\n\t\t\t\t\t\t\t\t\t\"inline-flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\t\"min-w-4 h-4 px-1 text-[11px] font-medium leading-none\",\n\t\t\t\t\t\t\t\t\t!contentColor && \"text-m3-on-error\",\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: \"inline-block w-1.5 h-1.5\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={colorStyle}\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: spread safe subset of HTML attrs\n\t\t\t\t\t{...(props as any)}\n\t\t\t\t>\n\t\t\t\t\t{hasContent && label}\n\t\t\t\t</m.span>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nBadgeImpl.displayName = \"Badge\";\n\n/**\n * MD3 Expressive Badge — dynamic status indicator.\n *\n * @example\n * ```tsx\n * // Small dot badge (no content) — decorative\n * <Badge />\n *\n * // Large badge with number (truncated at max)\n * <Badge max={99}>150</Badge>\n * // → displays \"99+\"\n *\n * // Large badge with text label\n * <Badge>NEW</Badge>\n *\n * // Custom colors\n * <Badge containerColor=\"#6750A4\" contentColor=\"#FFFFFF\">3</Badge>\n * ```\n *\n * @see https://m3.material.io/components/badge/overview\n */\nexport const Badge = React.memo(BadgeImpl);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BadgedBox\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 BadgedBox — positions a Badge at the top-trailing corner of an anchor.\n *\n * Implements MD3 offset specs from Badge.kt:\n * - Small badge (dot): `BadgeOffset = 6dp` → translate(50%, -50%)\n * - Large badge (text): `BadgeWithContentHorizontalOffset = 12dp` / `VerticalOffset = 14dp`\n * → translate(35%, -35%)\n *\n * Auto-detects badge size by inspecting the badge element's children prop,\n * or accepts an explicit `badgeSize` override.\n *\n * @example\n * ```tsx\n * // Small dot on mail icon\n * <BadgedBox badge={<Badge />}>\n * <Icon name=\"mail\" />\n * </BadgedBox>\n *\n * // Count badge on notification icon\n * <BadgedBox badge={<Badge max={99}>{count}</Badge>}>\n * <Icon name=\"notifications\" />\n * </BadgedBox>\n * ```\n */\nexport function BadgedBox({\n\tbadge,\n\tchildren,\n\tclassName,\n\tbadgeSize,\n}: BadgedBoxProps) {\n\tconst isLarge = badgeSize\n\t\t? badgeSize === \"large\"\n\t\t: detectBadgeHasContent(badge);\n\n\tconst badgePositionClass = isLarge\n\t\t? \"translate-x-[35%] -translate-y-[35%]\"\n\t\t: \"translate-x-[50%] -translate-y-[50%]\";\n\n\treturn (\n\t\t<span className={cn(\"relative inline-flex\", className)}>\n\t\t\t{children}\n\t\t\t<span\n\t\t\t\tclassName={cn(\"absolute right-0 top-0\", badgePositionClass)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<AnimatePresence mode=\"wait\">{badge}</AnimatePresence>\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n","/**\n * @file tabs.tsx\n * MD3 Expressive Tabs — Root context provider and state manager.\n * Implements compound component pattern (similar to Radix UI).\n * Spec: https://m3.material.io/components/tabs/overview\n */\n\nimport { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { TabsContextValue, TabsProps } from \"./tabs.types\";\n\n// ─── Context ───────────────────────────────────────────────────────────────────\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\n/**\n * Hook to consume the Tabs context.\n * Throws if used outside a `<Tabs>` root.\n * @internal\n */\nexport function useTabsContext(): TabsContextValue {\n\tconst ctx = React.useContext(TabsContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"[MD3 Tabs] Component must be used within a <Tabs> root. \" +\n\t\t\t\t\"Ensure <TabsList>, <Tab>, and <TabsContent> are descendants of <Tabs>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n// ─── Tabs Root ─────────────────────────────────────────────────────────────────\n\nconst TabsComponent = React.forwardRef<HTMLDivElement, TabsProps>(\n\t(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue = \"\",\n\t\t\tonValueChange,\n\t\t\tautoActivate = false,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\t// ── State: selected value (controlled + uncontrolled) ──────────────────\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue);\n\t\tconst isControlled = controlledValue !== undefined;\n\t\tconst value = isControlled ? controlledValue : internalValue;\n\n\t\tconst handleValueChange = React.useCallback(\n\t\t\t(newValue: string) => {\n\t\t\t\tif (!isControlled) setInternalValue(newValue);\n\t\t\t\tonValueChange?.(newValue);\n\t\t\t},\n\t\t\t[isControlled, onValueChange],\n\t\t);\n\n\t\t// ── State: keyboard focus (roving tabindex) ────────────────────────────\n\t\t// focusedValue is separate from `value` so focus can move without selecting.\n\t\tconst [focusedValue, setFocusedValue] = React.useState(value);\n\n\t\t// Sync focusedValue when controlled value changes externally\n\t\tReact.useEffect(() => {\n\t\t\tsetFocusedValue(value);\n\t\t}, [value]);\n\n\t\t// ── Registered tabs registry ───────────────────────────────────────────\n\t\t// Tabs register/unregister themselves to enable ArrowKey navigation.\n\t\tconst [tabValues, setTabValues] = React.useState<string[]>([]);\n\n\t\tconst registerTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => {\n\t\t\t\tif (prev.includes(tabValue)) return prev;\n\t\t\t\treturn [...prev, tabValue];\n\t\t\t});\n\t\t}, []);\n\n\t\tconst unregisterTab = React.useCallback((tabValue: string) => {\n\t\t\tsetTabValues((prev) => prev.filter((v) => v !== tabValue));\n\t\t}, []);\n\n\t\t// ── Auto-select first enabled tab when no defaultValue is provided ─────\n\t\t// Mirrors Google's behavior: if no tab is active, select the first one.\n\t\tconst hasAutoSelected = React.useRef(false);\n\n\t\t// ── Disabled tab tracking ──────────────────────────────────────────────\n\t\tconst [disabledValues, setDisabledValues] = React.useState<Set<string>>(\n\t\t\tnew Set(),\n\t\t);\n\n\t\tconst markTabDisabled = React.useCallback(\n\t\t\t(tabValue: string, disabled: boolean) => {\n\t\t\t\tsetDisabledValues((prev) => {\n\t\t\t\t\tconst next = new Set(prev);\n\t\t\t\t\tif (disabled) {\n\t\t\t\t\t\tnext.add(tabValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext.delete(tabValue);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\t// Auto-select first enabled tab if no value is set\n\t\tReact.useEffect(() => {\n\t\t\tif (isControlled || hasAutoSelected.current || tabValues.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value && tabValues.includes(value)) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst firstEnabled = tabValues.find((v) => !disabledValues.has(v));\n\t\t\tif (firstEnabled) {\n\t\t\t\thasAutoSelected.current = true;\n\t\t\t\tsetInternalValue(firstEnabled);\n\t\t\t\tsetFocusedValue(firstEnabled);\n\t\t\t}\n\t\t}, [tabValues, disabledValues, isControlled, value]);\n\n\t\t// ── Unique layout group ID for Framer Motion ───────────────────────────\n\t\tconst id = React.useId();\n\t\tconst layoutGroupId = `tabs-${id}`;\n\n\t\t// ── Context value ──────────────────────────────────────────────────────\n\t\tconst contextValue = React.useMemo<TabsContextValue>(\n\t\t\t() => ({\n\t\t\t\tvalue,\n\t\t\t\tonValueChange: handleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\tsetFocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t}),\n\t\t\t[\n\t\t\t\tvalue,\n\t\t\t\thandleValueChange,\n\t\t\t\tfocusedValue,\n\t\t\t\ttabValues,\n\t\t\t\tregisterTab,\n\t\t\t\tunregisterTab,\n\t\t\t\tlayoutGroupId,\n\t\t\t\tdisabledValues,\n\t\t\t\tmarkTabDisabled,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<TabsContext.Provider value={contextValue}>\n\t\t\t\t\t<div ref={ref} className={cn(\"w-full\", className)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</TabsContext.Provider>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nTabsComponent.displayName = \"Tabs\";\n\n/**\n * MD3 Expressive Tabs root component.\n *\n * Manages tab selection state and provides context to all\n * compound sub-components. Supports both controlled and\n * uncontrolled usage.\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Tabs defaultValue=\"flights\">\n * <TabsList variant=\"primary\">\n * <Tab value=\"flights\">Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * </TabsList>\n * <TabsContent value=\"flights\">Flight content</TabsContent>\n * <TabsContent value=\"trips\">Trip content</TabsContent>\n * </Tabs>\n *\n * // Controlled\n * const [tab, setTab] = useState(\"flights\");\n * <Tabs value={tab} onValueChange={setTab}>...</Tabs>\n *\n * // Auto-activate mode (focus = select)\n * <Tabs defaultValue=\"flights\" autoActivate>...</Tabs>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n */\nexport const Tabs = React.memo(TabsComponent);\n\n// ─── TabsListContext ───────────────────────────────────────────────────────────\n\n/**\n * Secondary context carrying variant + scrollable from <TabsList>.\n * Separate from TabsContext so Tabs root doesn't need these props —\n * they belong to the list, not the root.\n * @internal\n */\nexport interface TabsListContextValue {\n\tvariant: \"primary\" | \"secondary\";\n\tscrollable: boolean;\n}\n\nexport const TabsListContext = React.createContext<TabsListContextValue | null>(\n\tnull,\n);\n\n/**\n * Hook to consume TabsList-level context (variant, scrollable).\n * @internal\n */\nexport function useTabsListContext(): TabsListContextValue {\n\tconst ctx = React.useContext(TabsListContext);\n\t// Fallback to sensible defaults instead of throwing, since\n\t// Tab might be rendered without explicit context in tests.\n\treturn ctx ?? { variant: \"primary\", scrollable: false };\n}\n","/**\n * @file tabs.tokens.ts\n * MD3 Expressive Tabs — Design tokens ported from:\n * - PrimaryNavigationTabTokens.kt (v0_162)\n * - SecondaryNavigationTabTokens.kt (v0_162)\n *\n * All dimensional values are in px (dp equivalent for web).\n * @see docs/m3/tabs/PrimaryNavigationTabTokens.kt\n * @see docs/m3/tabs/SecondaryNavigationTabTokens.kt\n */\n\n/**\n * Dimensional design tokens for the MD3 Tabs component.\n *\n * Maps directly from the `.kt` token files to CSS/JS values.\n * Use as the single source of truth for sizing.\n */\nexport const TabsTokens = {\n\t// ── Container ─────────────────────────────────────────────────────────────\n\t/** ContainerHeight = 48dp (text-only tab) */\n\tcontainerHeight: 48,\n\t/** IconAndLabelTextContainerHeight = 64dp (tab with icon + label stacked) */\n\tcontainerHeightWithIcon: 64,\n\n\t// ── Indicator ─────────────────────────────────────────────────────────────\n\t/** ActiveIndicatorHeight (Primary) = 3dp */\n\tprimaryIndicatorHeight: 3,\n\t/** ActiveIndicatorHeight (Secondary) = 2dp */\n\tsecondaryIndicatorHeight: 2,\n\t/**\n\t * ActiveIndicatorShape = 3dp top-left and top-right (per MD3 token, not a full pill).\n\t * Google reference: `var(--_active-indicator-shape)` resolves to `3px 3px 0 0` effectively.\n\t */\n\tindicatorBorderRadius: \"3px 3px 0 0\",\n\n\t// ── Icon ──────────────────────────────────────────────────────────────────\n\t/** IconSize = 24dp */\n\ticonSize: 24,\n\n\t// ── Scrollable layout ─────────────────────────────────────────────────────\n\t/**\n\t * Edge start/end padding for scrollable mode = 52px.\n\t * Per MD3 spec: tabs have padding on both leading and trailing edges.\n\t */\n\tscrollableEdgePadding: 52,\n\t/** Minimum tab width in scrollable mode = 90px. */\n\tscrollableMinTabWidth: 90,\n\n\t// ── Divider (Secondary only) ───────────────────────────────────────────────\n\t/** DividerHeight = 1dp */\n\tdividerHeight: 1,\n\n\t// ── Focus ring ────────────────────────────────────────────────────────────\n\t/**\n\t * Focus ring border-radius = 8px.\n\t * Google reference: `focus-ring.theme({ shape: 8px })` in _tab.scss.\n\t */\n\tfocusRingBorderRadius: 8,\n} as const;\n\n// ── MD3 Color token references (CSS custom properties) ────────────────────────\n\n/**\n * CSS custom property references for Tabs colors.\n * Maps to `--md-sys-color-*` tokens in the MD3 theme system.\n *\n * DO NOT hardcode hex values — use these references for automatic\n * light/dark theme adaptation.\n */\nexport const TabsColors = {\n\t// ── Primary variant ───────────────────────────────────────────────────────\n\t/** Primary: ActiveLabelTextColor / ActiveIconColor = Primary */\n\tprimaryActiveText: \"var(--md-sys-color-primary)\",\n\t/** Primary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tprimaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Primary: ActiveIndicatorColor = Primary */\n\tprimaryIndicator: \"var(--md-sys-color-primary)\",\n\n\t// ── Secondary variant ─────────────────────────────────────────────────────\n\t/** Secondary: ActiveLabelTextColor / ActiveIconColor = OnSurface */\n\tsecondaryActiveText: \"var(--md-sys-color-on-surface)\",\n\t/** Secondary: InactiveLabelTextColor / InactiveIconColor = OnSurfaceVariant */\n\tsecondaryInactiveText: \"var(--md-sys-color-on-surface-variant)\",\n\t/** Secondary: Indicator color = Primary (same as primary variant) */\n\tsecondaryIndicator: \"var(--md-sys-color-primary)\",\n\t/** Secondary: DividerColor = SurfaceVariant */\n\tdivider: \"var(--md-sys-color-surface-variant)\",\n\n\t// ── Shared ────────────────────────────────────────────────────────────────\n\t/** ContainerColor = Surface */\n\tcontainer: \"var(--md-sys-color-surface)\",\n\t/** Focus ring indicator = Secondary */\n\tfocusIndicator: \"var(--md-sys-color-secondary)\",\n\n\t// ── State overlays ────────────────────────────────────────────────────────\n\t/** Hover state layer (primary active) */\n\tprimaryActiveHover: \"var(--md-sys-color-primary)\",\n\t/** Hover state layer (inactive, both variants) */\n\tinactiveHover: \"var(--md-sys-color-on-surface)\",\n} as const;\n\n// ── Animation constants ────────────────────────────────────────────────────────\n\n/** Spring transition for the sliding indicator (FastSpatial equivalent). */\nexport const TABS_INDICATOR_SPRING = {\n\ttype: \"spring\",\n\tstiffness: 500,\n\tdamping: 40,\n} as const;\n\n/** Color transition for label/icon color animate (active ↔ inactive). */\nexport const TABS_COLOR_TRANSITION = {\n\tduration: 0.2,\n\tease: \"easeInOut\",\n} as const;\n\n/** Content fade transition when switching tabs. */\nexport const TABS_CONTENT_TRANSITION = {\n\tduration: 0.15,\n\tease: \"easeInOut\",\n} as const;\n","/**\n * @file tab.tsx\n * MD3 Expressive Tab — Individual tab button with Framer Motion indicator.\n *\n * Design decisions:\n * 1. PRIMARY indicator nested inside content wrapper → width = content width (not full button).\n * 2. SECONDARY indicator outside content wrapper → `inset-x-0` = full button width.\n * 3. ROVING TABINDEX (WAI-ARIA): only focused tab has tabIndex=0; ArrowKey moves focus, Enter/Space selects.\n * 4. DISABLED tabs are skipped in ArrowKey navigation.\n * 5. RTL: ArrowLeft/Right directions are swapped when `direction: rtl` is detected.\n * 6. INLINE ICON: icon beside label, height stays 48dp (stacked = 64dp).\n * 7. AUTO-ACTIVATE: when parent `<Tabs autoActivate>`, ArrowKey also selects.\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\n\nimport { m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { BadgedBox } from \"../badge\";\nimport { useTabsContext, useTabsListContext } from \"./tabs\";\nimport {\n\tTABS_COLOR_TRANSITION,\n\tTABS_INDICATOR_SPRING,\n\tTabsColors,\n\tTabsTokens,\n} from \"./tabs.tokens\";\nimport type { TabProps } from \"./tabs.types\";\n\n// ─── Constants ──────────────────────────────────────────────────────────────────\n\n/** Minimum indicator width per MD3 spec (24dp). */\nconst INDICATOR_MIN_WIDTH = 24;\n\n// ─── Tab ───────────────────────────────────────────────────────────────────────\n\nconst TabComponent = React.forwardRef<HTMLButtonElement, TabProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\ticon,\n\t\t\tinlineIcon = false,\n\t\t\tdisabled = false,\n\t\t\tbadge,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tvalue: selectedValue,\n\t\t\tonValueChange,\n\t\t\tfocusedValue,\n\t\t\tsetFocusedValue,\n\t\t\ttabValues,\n\t\t\tregisterTab,\n\t\t\tunregisterTab,\n\t\t\tlayoutGroupId,\n\t\t\tdisabledValues,\n\t\t\tmarkTabDisabled,\n\t\t\tautoActivate,\n\t\t} = useTabsContext();\n\n\t\tconst { variant, scrollable } = useTabsListContext();\n\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\tconst isActive = selectedValue === value;\n\t\tconst isFocused = focusedValue === value;\n\t\tconst hasIcon = icon != null;\n\t\tconst isStackedIcon = hasIcon && !inlineIcon;\n\n\t\t// ── Refs ───────────────────────────────────────────────────────────────\n\t\tconst buttonRef = React.useRef<HTMLButtonElement | null>(null);\n\t\tconst isFirstMount = React.useRef(true);\n\n\t\t// Merge forwarded ref with internal ref\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLButtonElement | null) => {\n\t\t\t\tbuttonRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\t// ── Register/unregister with parent context on mount/unmount ──────────\n\t\tReact.useEffect(() => {\n\t\t\tregisterTab(value);\n\t\t\treturn () => unregisterTab(value);\n\t\t}, [value, registerTab, unregisterTab]);\n\n\t\t// ── Sync disabled state with parent context ────────────────────────────\n\t\tReact.useEffect(() => {\n\t\t\tmarkTabDisabled(value, disabled);\n\t\t\treturn () => markTabDisabled(value, false);\n\t\t}, [value, disabled, markTabDisabled]);\n\n\t\t// ── Keyboard navigation ────────────────────────────────────────────────\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tconst isRtl = buttonRef.current\n\t\t\t\t\t? getComputedStyle(buttonRef.current).direction === \"rtl\"\n\t\t\t\t\t: false;\n\n\t\t\t\tconst enabledValues = tabValues.filter((v) => !disabledValues.has(v));\n\t\t\t\tconst currentIndex = enabledValues.indexOf(value);\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\tcase \"ArrowLeft\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst goForward = isRtl\n\t\t\t\t\t\t\t? e.key === \"ArrowLeft\"\n\t\t\t\t\t\t\t: e.key === \"ArrowRight\";\n\t\t\t\t\t\tconst nextIndex = goForward\n\t\t\t\t\t\t\t? (currentIndex + 1) % enabledValues.length\n\t\t\t\t\t\t\t: (currentIndex - 1 + enabledValues.length) %\n\t\t\t\t\t\t\t\tenabledValues.length;\n\t\t\t\t\t\tconst nextValue = enabledValues[nextIndex];\n\t\t\t\t\t\tif (nextValue) {\n\t\t\t\t\t\t\tsetFocusedValue(nextValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(nextValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Home\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst firstValue = enabledValues[0];\n\t\t\t\t\t\tif (firstValue) {\n\t\t\t\t\t\t\tsetFocusedValue(firstValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(firstValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"End\": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst lastValue = enabledValues[enabledValues.length - 1];\n\t\t\t\t\t\tif (lastValue) {\n\t\t\t\t\t\t\tsetFocusedValue(lastValue);\n\t\t\t\t\t\t\tif (autoActivate) onValueChange(lastValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"Enter\":\n\t\t\t\t\tcase \" \": {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif (!disabled) onValueChange(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\ttabValues,\n\t\t\t\tdisabledValues,\n\t\t\t\tvalue,\n\t\t\t\tdisabled,\n\t\t\t\tsetFocusedValue,\n\t\t\t\tonValueChange,\n\t\t\t\tautoActivate,\n\t\t\t],\n\t\t);\n\n\t\t// Focus DOM node when focusedValue changes via keyboard (skip initial mount)\n\t\tReact.useEffect(() => {\n\t\t\tif (isFirstMount.current) {\n\t\t\t\tisFirstMount.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isFocused && buttonRef.current) {\n\t\t\t\tbuttonRef.current.focus({ preventScroll: true });\n\t\t\t}\n\t\t}, [isFocused]);\n\n\t\t// ── Auto-scroll active tab into view (scrollable mode) ─────────────────\n\t\t// Horizontally scrolls the nearest overflow-x container to reveal the\n\t\t// active tab. Uses scrollTo (not scrollIntoView) to avoid vertical page jumps.\n\t\tReact.useEffect(() => {\n\t\t\tif (!isActive || !scrollable || !buttonRef.current) return;\n\n\t\t\tconst btn = buttonRef.current;\n\t\t\tlet container: HTMLElement | null = btn.parentElement;\n\t\t\twhile (container) {\n\t\t\t\tconst { overflowX } = getComputedStyle(container);\n\t\t\t\tif (overflowX === \"auto\" || overflowX === \"scroll\") break;\n\t\t\t\tcontainer = container.parentElement;\n\t\t\t}\n\t\t\tif (!container) return;\n\n\t\t\tconst btnRect = btn.getBoundingClientRect();\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tconst overflowLeft = containerRect.left - btnRect.left;\n\t\t\tconst overflowRight = btnRect.right - containerRect.right;\n\n\t\t\tif (overflowLeft > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft - overflowLeft,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t} else if (overflowRight > 0) {\n\t\t\t\tcontainer.scrollTo({\n\t\t\t\t\tleft: container.scrollLeft + overflowRight,\n\t\t\t\t\tbehavior: \"smooth\",\n\t\t\t\t});\n\t\t\t}\n\t\t}, [isActive, scrollable]);\n\n\t\t// ── Derived tokens ─────────────────────────────────────────────────────\n\t\tconst containerHeight = isStackedIcon\n\t\t\t? TabsTokens.containerHeightWithIcon\n\t\t\t: TabsTokens.containerHeight;\n\n\t\tconst activeColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryActiveText\n\t\t\t\t: TabsColors.secondaryActiveText;\n\n\t\tconst inactiveColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryInactiveText\n\t\t\t\t: TabsColors.secondaryInactiveText;\n\n\t\tconst indicatorColor =\n\t\t\tvariant === \"primary\"\n\t\t\t\t? TabsColors.primaryIndicator\n\t\t\t\t: TabsColors.secondaryIndicator;\n\n\t\tconst indicatorLayoutId = `${layoutGroupId}-indicator`;\n\n\t\tconst colorTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_COLOR_TRANSITION;\n\t\tconst springTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_INDICATOR_SPRING;\n\n\t\t// ── IDs for ARIA wiring ────────────────────────────────────────────────\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\t// ── Content wrapper layout ─────────────────────────────────────────────\n\t\t// inlineIcon → flex-row; stacked icon → flex-col gap-0.5; text only → flex-col\n\t\tconst contentFlexClass = inlineIcon\n\t\t\t? \"flex-row gap-2\"\n\t\t\t: isStackedIcon\n\t\t\t\t? \"flex-col gap-0.5\"\n\t\t\t\t: \"flex-col gap-0\";\n\n\t\t// Badge placement\n\t\tconst shouldWrapIconWithBadge = isStackedIcon && badge != null;\n\t\tconst shouldAppendInlineBadge = !isStackedIcon && badge != null;\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={mergedRef}\n\t\t\t\tid={tabId}\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"tab\"\n\t\t\t\taria-selected={isActive}\n\t\t\t\taria-controls={panelId}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\ttabIndex={isFocused ? 0 : -1}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\tonValueChange(value);\n\t\t\t\t\t\tsetFocusedValue(value);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonFocus={() => setFocusedValue(value)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center\",\n\t\t\t\t\t\"cursor-pointer select-none\",\n\t\t\t\t\tscrollable ? \"shrink-0\" : \"flex-1\",\n\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\"focus-visible:rounded-lg\",\n\t\t\t\t\t\"rounded-none\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-[0.38]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\theight: containerHeight,\n\t\t\t\t\tzIndex: isActive ? 1 : 0,\n\t\t\t\t\t...(scrollable && { minWidth: TabsTokens.scrollableMinTabWidth }),\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/*\n\t\t\t\t * Content wrapper — PRIMARY INDICATOR TECHNIQUE:\n\t\t\t\t * Indicator lives inside this wrapper → width matches content (not button).\n\t\t\t\t * inlineIcon: flex-row places icon beside label, height stays 48dp.\n\t\t\t\t */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex h-full items-center justify-center\",\n\t\t\t\t\t\tcontentFlexClass,\n\t\t\t\t\t)}\n\t\t\t\t\tanimate={{ color: isActive ? activeColor : inactiveColor }}\n\t\t\t\t\ttransition={colorTransition}\n\t\t\t\t>\n\t\t\t\t\t{/* Icon (optional) — 24dp per MD3 token */}\n\t\t\t\t\t{hasIcon && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\taria-hidden={!shouldWrapIconWithBadge ? \"true\" : undefined}\n\t\t\t\t\t\t\tclassName={cn(\"flex shrink-0 items-center justify-center\")}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: TabsTokens.iconSize,\n\t\t\t\t\t\t\t\theight: TabsTokens.iconSize,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{shouldWrapIconWithBadge ? (\n\t\t\t\t\t\t\t\t<BadgedBox badge={badge}>\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">{icon}</span>\n\t\t\t\t\t\t\t\t</BadgedBox>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span className=\"size-full\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Label text — TitleSmall per MD3 typography token */}\n\t\t\t\t\t<span className=\"text-title-sm font-medium whitespace-nowrap\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Inline Badge */}\n\t\t\t\t\t{shouldAppendInlineBadge && (\n\t\t\t\t\t\t<span className=\"ml-1 flex items-center justify-center\">\n\t\t\t\t\t\t\t{badge}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/*\n\t\t\t\t\t * PRIMARY INDICATOR\n\t\t\t\t\t * Inside content wrapper → width matches content.\n\t\t\t\t\t * `layoutId` enables shared layout animation across tabs.\n\t\t\t\t\t */}\n\t\t\t\t\t{variant === \"primary\" && isActive && (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-1/2 -translate-x-1/2\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: TabsTokens.primaryIndicatorHeight,\n\t\t\t\t\t\t\t\tminWidth: INDICATOR_MIN_WIDTH,\n\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</m.div>\n\n\t\t\t\t{/*\n\t\t\t\t * SECONDARY INDICATOR\n\t\t\t\t * Outside content wrapper → `inset-x-0` = full button width.\n\t\t\t\t */}\n\t\t\t\t{variant === \"secondary\" && isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tlayoutId={indicatorLayoutId}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"absolute bottom-0 inset-x-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: TabsTokens.secondaryIndicatorHeight,\n\t\t\t\t\t\t\tborderRadius: TabsTokens.indicatorBorderRadius,\n\t\t\t\t\t\t\tbackgroundColor: indicatorColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={springTransition}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\n\nTabComponent.displayName = \"Tab\";\n\n/**\n * MD3 Expressive Tab component — individual tab button.\n *\n * Must be a direct child of `<TabsList>`. Implements WAI-ARIA Tabs pattern\n * with roving tabindex keyboard navigation.\n *\n * - **Primary variant**: indicator width = content (text + icon) width.\n * - **Secondary variant**: indicator width = full button hit area.\n * - **Disabled**: Skipped entirely in ArrowKey navigation (cannot be focused).\n * - **inlineIcon**: Icon beside (not above) label; height stays 48dp.\n * - Framer Motion `layoutId` animates indicator with spring physics.\n * - ArrowLeft/Right respect RTL direction automatically.\n *\n * @example\n * ```tsx\n * <Tab value=\"flights\" icon={<Icon name=\"flight\" />}>Flights</Tab>\n * <Tab value=\"trips\">Trips</Tab>\n * <Tab value=\"explore\" disabled>Explore</Tab>\n * <Tab value=\"hotels\" icon={<Icon name=\"hotel\" />} inlineIcon>Hotels</Tab>\n * ```\n *\n * @see https://m3.material.io/components/tabs/overview\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const Tab = React.memo(TabComponent);\n","/**\n * @file tabs-content.tsx\n * MD3 Expressive TabsContent — Animated panel component.\n *\n * Implements WAI-ARIA tabpanel role with:\n * - AnimatePresence for fade transition on tab switch\n * - Proper aria-labelledby pointing to the associated <Tab>\n * - tabIndex=0 so keyboard users can Tab from the tablist into the panel\n * - Hidden panels are removed from the DOM (not just visually hidden)\n * to prevent screen readers from reading inactive content\n */\n\nimport { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useTabsContext } from \"./tabs\";\nimport { TABS_CONTENT_TRANSITION } from \"./tabs.tokens\";\nimport type { TabsContentProps } from \"./tabs.types\";\n\n// ─── TabsContent ───────────────────────────────────────────────────────────────\n\nconst TabsContentComponent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n\t({ value, className, children }, ref) => {\n\t\tconst { value: selectedValue, layoutGroupId } = useTabsContext();\n\t\tconst isActive = selectedValue === value;\n\t\tconst prefersReduced = useReducedMotion() ?? false;\n\n\t\t// ARIA wiring: panel is labelled by its corresponding <Tab> button\n\t\tconst tabId = `${layoutGroupId}-tab-${value}`;\n\t\tconst panelId = `${layoutGroupId}-panel-${value}`;\n\n\t\tconst contentTransition = prefersReduced\n\t\t\t? { duration: 0 }\n\t\t\t: TABS_CONTENT_TRANSITION;\n\n\t\treturn (\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t{isActive && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tid={panelId}\n\t\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\t\taria-labelledby={tabId}\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"focus:outline-none w-full\",\n\t\t\t\t\t\t\t\"focus-visible:outline-2 focus-visible:outline-offset-2\",\n\t\t\t\t\t\t\t\"focus-visible:outline-(--md-sys-color-secondary)\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={contentTransition}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\t},\n);\n\nTabsContentComponent.displayName = \"TabsContent\";\n\n/**\n * MD3 Expressive TabsContent panel component.\n *\n * Each panel corresponds to a `<Tab>` with the same `value`.\n * Only the active panel is rendered in the DOM — inactive panels\n * are fully unmounted (not `display: none`) to prevent screen readers\n * from reading hidden content.\n *\n * Fade animation is applied on both enter and exit via Framer Motion\n * `AnimatePresence`. We use `mode=\"popLayout\"` to prevent height layout shifting\n * during tab transitions. Animation is automatically disabled when the user\n * has enabled `prefers-reduced-motion`.\n *\n * @example\n * ```tsx\n * <TabsContent value=\"flights\">\n * <p>Available flights...</p>\n * </TabsContent>\n * ```\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/\n */\nexport const TabsContent = React.memo(TabsContentComponent);\n","/**\n * @file tabs-list.tsx\n * MD3 Expressive TabsList — Container component for tab buttons.\n *\n * Responsibilities:\n * - Applies variant (primary/secondary) layout and styling\n * - Manages horizontal scroll for scrollable mode (52px edge padding per MD3)\n * - Renders the bottom divider for secondary variant\n * - Scopes Framer Motion LayoutGroup so indicators animate correctly\n * when multiple <Tabs> instances are on the same page\n * - Restores focus to activeTab when keyboard focus leaves the tablist\n * (matches Google's `focusout` handler on <md-tabs>)\n */\n\nimport { LayoutGroup } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { TabsListContext, useTabsContext } from \"./tabs\";\nimport { TabsTokens } from \"./tabs.tokens\";\nimport type { TabsListProps } from \"./tabs.types\";\n\n// ─── TabsList ──────────────────────────────────────────────────────────────────\n\nconst TabsListComponent = React.forwardRef<HTMLDivElement, TabsListProps>(\n\t(\n\t\t{\n\t\t\tvariant,\n\t\t\tscrollable = false,\n\t\t\tbackgroundColor,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { layoutGroupId, value, setFocusedValue } = useTabsContext();\n\n\t\t// Unique layout group ID scoped to this TabsList instance.\n\t\tconst listLayoutId = `${layoutGroupId}-list`;\n\n\t\t// ── TabsListContext: provide variant + scrollable to children ──────────\n\t\tconst listContextValue = React.useMemo(\n\t\t\t() => ({ variant, scrollable }),\n\t\t\t[variant, scrollable],\n\t\t);\n\n\t\t// ── Background color ───────────────────────────────────────────────────\n\t\tconst bgColor = backgroundColor ?? \"var(--md-sys-color-surface)\";\n\n\t\t// ── Focusout handler — restore roving focus to active tab ──────────────\n\t\t// When keyboard focus leaves the tablist entirely (e.g. user presses Tab\n\t\t// to move to the panel), reset `focusedValue` back to the selected tab.\n\t\t// This ensures the next time the user Tabs back into the tablist, focus\n\t\t// lands on the active tab — not the last arrow-key-focused tab.\n\t\t// Mirrors Google's `handleFocusout` in tabs.ts:\n\t\t// \"restore focus to selected item when blurring the tab bar\"\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLDivElement>) => {\n\t\t\t\t// `relatedTarget` is the element receiving focus.\n\t\t\t\t// If it's still inside the tablist, this is an internal focus move\n\t\t\t\t// (e.g. clicking another tab) — don't restore.\n\t\t\t\tconst listEl = e.currentTarget;\n\t\t\t\tif (listEl.contains(e.relatedTarget as Node | null)) return;\n\n\t\t\t\t// Focus left the tablist — restore focusedValue to the active tab.\n\t\t\t\tsetFocusedValue(value);\n\t\t\t},\n\t\t\t[value, setFocusedValue],\n\t\t);\n\n\t\treturn (\n\t\t\t<TabsListContext.Provider value={listContextValue}>\n\t\t\t\t{/* LayoutGroup scopes shared layout animation so indicators from different Tabs instances don't bleed into each other. */}\n\t\t\t\t<LayoutGroup id={listLayoutId}>\n\t\t\t\t\t{/* Outer wrapper: positioning context for the secondary divider */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\t\t\tstyle={{ backgroundColor: bgColor }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-row items-stretch\",\n\t\t\t\t\t\t\t\tscrollable &&\n\t\t\t\t\t\t\t\t\t\"overflow-x-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\tscrollable\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: TabsTokens.scrollableEdgePadding,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Secondary variant: bottom divider — absolute so it doesn't affect tab layout flow */}\n\t\t\t\t\t\t{variant === \"secondary\" && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"absolute bottom-0 left-0 right-0\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\theight: TabsTokens.dividerHeight,\n\t\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-surface-variant)\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</LayoutGroup>\n\t\t\t</TabsListContext.Provider>\n\t\t);\n\t},\n);\n\nTabsListComponent.displayName = \"TabsList\";\n\n/**\n * MD3 Expressive TabsList container component.\n *\n * Renders a horizontal row of `<Tab>` components with MD3-compliant\n * layout (fixed or scrollable) and variant styling (primary or secondary).\n *\n * - **Primary**: Tabs divide available width equally, indicator width = content width.\n * - **Secondary**: Tabs divide equally + full-width indicator + bottom divider line.\n * - **Scrollable**: Tabs have min-width (90px), scroll horizontally with 52px edge padding.\n * - **Focusout**: When focus leaves the tablist, roving focus resets to the active tab.\n *\n * @example\n * ```tsx\n * <TabsList variant=\"primary\" scrollable={false}>\n * <Tab value=\"tab1\">Tab 1</Tab>\n * <Tab value=\"tab2\">Tab 2</Tab>\n * </TabsList>\n *\n * <TabsList variant=\"secondary\" scrollable={true} aria-label=\"Content sections\">\n * <Tab value=\"a\">Alpha</Tab>\n * <Tab value=\"b\">Beta</Tab>\n * </TabsList>\n * ```\n */\nexport const TabsList = React.memo(TabsListComponent);\n","/**\n * Color configuration types and standard values for the FloatingToolbar component.\n * Maps MD3 design tokens to CSS custom properties used in Tailwind CSS.\n */\n\n/**\n * Color configuration types and standard values for the FloatingToolbar component.\n * Maps MD3 design tokens to CSS custom properties used in Tailwind CSS.\n */\n\nexport type ToolbarVariant =\n\t| \"standard\"\n\t| \"vibrant\"\n\t| \"surface-high\"\n\t| \"surface-highest\"\n\t| \"tertiary\"\n\t| \"xr\";\n\nexport interface FloatingToolbarColors {\n\t/** The background color of the toolbar container */\n\ttoolbarContainerColor?: string;\n\t/** The color of the content (icons, text) inside the toolbar */\n\ttoolbarContentColor?: string;\n\t/** The background color of the FAB container */\n\tfabContainerColor?: string;\n\t/** The color of the content inside the FAB */\n\tfabContentColor?: string;\n}\n\n/**\n * Standard color configuration for the floating toolbar.\n * Uses surface container for the toolbar and secondary container for the FAB.\n */\nexport const standardFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-surface-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n};\n\n/**\n * Vibrant color configuration for the floating toolbar.\n * Uses primary container for the toolbar and tertiary container for the FAB.\n */\nexport const vibrantFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-primary-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-primary-container)\",\n\tfabContainerColor: \"var(--md-sys-color-tertiary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-tertiary-container)\",\n};\n\n/**\n * Surface Container High color configuration for the toolbar (XR / Elevated).\n */\nexport const surfaceContainerHighFloatingToolbarColors: FloatingToolbarColors =\n\t{\n\t\ttoolbarContainerColor: \"var(--md-sys-color-surface-container-high)\",\n\t\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\t\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\t\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n\t};\n\n/**\n * Surface Container Highest color configuration for the toolbar (XR / Elevated).\n */\nexport const surfaceContainerHighestFloatingToolbarColors: FloatingToolbarColors =\n\t{\n\t\ttoolbarContainerColor: \"var(--md-sys-color-surface-container-highest)\",\n\t\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\t\tfabContainerColor: \"var(--md-sys-color-secondary-container)\",\n\t\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n\t};\n\n/**\n * Tertiary Container color configuration for the toolbar.\n */\nexport const tertiaryContainerFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor: \"var(--md-sys-color-tertiary-container)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-tertiary-container)\",\n\tfabContainerColor: \"var(--md-sys-color-primary-container)\",\n\tfabContentColor: \"var(--md-sys-color-on-primary-container)\",\n};\n\n/**\n * XR Glassmorphic color configuration for the toolbar.\n * Uses semi-transparent surface container high with backdrop blur.\n */\nexport const xrFloatingToolbarColors: FloatingToolbarColors = {\n\ttoolbarContainerColor:\n\t\t\"color-mix(in srgb, var(--md-sys-color-surface-container-high) 80%, transparent)\",\n\ttoolbarContentColor: \"var(--md-sys-color-on-surface)\",\n\tfabContainerColor:\n\t\t\"color-mix(in srgb, var(--md-sys-color-secondary-container) 85%, transparent)\",\n\tfabContentColor: \"var(--md-sys-color-on-secondary-container)\",\n};\n\n/**\n * Helper function to resolve FloatingToolbarColors based on variant prop or custom override.\n */\nexport function getToolbarColors(\n\tvariant: ToolbarVariant = \"standard\",\n\tcustomColors?: FloatingToolbarColors,\n): FloatingToolbarColors {\n\tif (customColors) return customColors;\n\n\tswitch (variant) {\n\t\tcase \"vibrant\":\n\t\t\treturn vibrantFloatingToolbarColors;\n\t\tcase \"surface-high\":\n\t\t\treturn surfaceContainerHighFloatingToolbarColors;\n\t\tcase \"surface-highest\":\n\t\t\treturn surfaceContainerHighestFloatingToolbarColors;\n\t\tcase \"tertiary\":\n\t\t\treturn tertiaryContainerFloatingToolbarColors;\n\t\tcase \"xr\":\n\t\t\treturn xrFloatingToolbarColors;\n\t\tdefault:\n\t\t\treturn standardFloatingToolbarColors;\n\t}\n}\n","import * as React from \"react\";\n\nexport interface ToolbarContextValue {\n\torientation: \"horizontal\" | \"vertical\";\n\titemClassName?: string;\n}\n\nexport const ToolbarContext = React.createContext<ToolbarContextValue | null>(\n\tnull,\n);\n\nexport function useToolbarContext() {\n\treturn React.useContext(ToolbarContext);\n}\n","import { m, useMotionValueEvent, useScroll } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarColors,\n\tgetToolbarColors,\n\ttype ToolbarVariant,\n} from \"./toolbar-colors\";\nimport { ToolbarContext } from \"./toolbar-context\";\n\nexport interface BottomDockedToolbarProps {\n\t/** Color variant: standard, vibrant, surface-high, surface-highest, tertiary, or xr */\n\tvariant?: ToolbarVariant;\n\t/** Custom colors override */\n\tcolors?: FloatingToolbarColors;\n\t/** Whether to hide on scroll */\n\thideOnScroll?: boolean;\n\t/** Scroll container ref for scroll behavior (if empty, uses window scroll) */\n\tscrollContainerRef?: React.RefObject<HTMLElement | null>;\n\t/** Start content (left-aligned) */\n\tstartContent?: React.ReactNode;\n\t/** End content (right-aligned) */\n\tendContent?: React.ReactNode;\n\t/** Center content */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Horizontal padding (px) applied to the toolbar container.\n\t * MD3 spec requires a minimum of 16dp on leading and trailing edges.\n\t * @default 16\n\t */\n\tpaddingX?: number;\n\t/**\n\t * Layout distribution of toolbar content.\n\t * - `\"between\"` – leading/center/trailing spread across full width (default, compact screens).\n\t * - `\"center\"` – all content centered; ideal for medium+ screen widths.\n\t * - `\"end-weighted\"` – key action is centered while others are pushed to the edges.\n\t * @default \"between\"\n\t */\n\tjustify?: \"between\" | \"center\" | \"end-weighted\";\n\t/**\n\t * Container shape.\n\t * - `\"none\"` – straight corners (MD3 default for mobile docked toolbars).\n\t * - `\"large\"` – large rounded corners (recommended for web / large screens).\n\t * - `\"full\"` – fully pill-shaped.\n\t *\n\t * MD3 guideline: *\"On web and large screens, the docked toolbar can be rounded.\"*\n\t * @default \"none\"\n\t */\n\tshape?: \"none\" | \"large\" | \"full\";\n\tclassName?: string;\n\t\"aria-label\"?: string;\n}\n\n/**\n * A full-width docked toolbar typically fixed at the bottom of the screen.\n * Replaces the deprecated Bottom App Bar in MD3 Expressive.\n *\n * @example\n * ```tsx\n * <BottomDockedToolbar hideOnScroll startContent={<IconButton aria-label=\"Menu\"><Icon name=\"menu\" /></IconButton>}>\n * <div className=\"flex gap-2\">\n * <IconButton aria-label=\"Search\"><Icon name=\"search\" /></IconButton>\n * <IconButton aria-label=\"Edit\"><Icon name=\"edit\" /></IconButton>\n * </div>\n * </BottomDockedToolbar>\n * ```\n */\nexport const BottomDockedToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tBottomDockedToolbarProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\thideOnScroll = false,\n\t\t\tscrollContainerRef,\n\t\t\tstartContent,\n\t\t\tendContent,\n\t\t\tchildren,\n\t\t\tpaddingX = 16,\n\t\t\tjustify = \"between\",\n\t\t\tshape = \"none\",\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\n\t\tconst { scrollY } = useScroll(\n\t\t\tscrollContainerRef ? { container: scrollContainerRef } : undefined,\n\t\t);\n\n\t\tconst [isHidden, setIsHidden] = React.useState(false);\n\t\tconst lastScrollY = React.useRef(0);\n\n\t\tuseMotionValueEvent(scrollY, \"change\", (latest) => {\n\t\t\tif (!hideOnScroll) return;\n\n\t\t\tconst diff = latest - lastScrollY.current;\n\n\t\t\tif (latest <= 0) {\n\t\t\t\tsetIsHidden(false);\n\t\t\t\tlastScrollY.current = 0;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (Math.abs(diff) > 10) {\n\t\t\t\tsetIsHidden(diff > 0);\n\t\t\t\tlastScrollY.current = latest;\n\t\t\t}\n\t\t});\n\n\t\tconst cssVars = {\n\t\t\t\"--toolbar-bg\": colors.toolbarContainerColor,\n\t\t\t\"--toolbar-color\": colors.toolbarContentColor,\n\t\t} as React.CSSProperties;\n\n\t\tconst SHAPE_CLASSES = {\n\t\t\tnone: \"\",\n\t\t\tlarge: \"rounded-2xl\",\n\t\t\tfull: \"rounded-full\",\n\t\t};\n\n\t\tconst justifyClass =\n\t\t\tjustify === \"center\" ? \"justify-center gap-4\" : \"justify-between\";\n\n\t\tconst isXr = variant === \"xr\";\n\n\t\treturn (\n\t\t\t<ToolbarContext.Provider value={{ orientation: \"horizontal\" }}>\n\t\t\t\t<m.div\n\t\t\t\t\tref={ref}\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\taria-label={ariaLabel || \"Bottom Docked Toolbar\"}\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\ty: isHidden ? \"100%\" : \"0%\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...cssVars,\n\t\t\t\t\t\tbackgroundColor: \"var(--toolbar-bg)\",\n\t\t\t\t\t\tcolor: \"var(--toolbar-color)\",\n\t\t\t\t\t\t// Apply safe area inset for mobile bottom indicators\n\t\t\t\t\t\tpaddingBottom: \"env(safe-area-inset-bottom, 0px)\",\n\t\t\t\t\t\tpaddingLeft: paddingX,\n\t\t\t\t\t\tpaddingRight: paddingX,\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed bottom-0 left-0 right-0 w-full z-40 text-(--toolbar-color) [&_.text-m3-on-surface-variant]:text-current\",\n\t\t\t\t\t\t\"flex items-center h-16\",\n\t\t\t\t\t\tjustifyClass,\n\t\t\t\t\t\tSHAPE_CLASSES[shape],\n\t\t\t\t\t\tisXr\n\t\t\t\t\t\t\t? \"backdrop-blur-md border-t border-white/10 shadow-lg\"\n\t\t\t\t\t\t\t: \"shadow-[0_-1px_3px_rgba(0,0,0,0.1)]\",\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center justify-start flex-1 shrink-0\">\n\t\t\t\t\t\t{startContent}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t\tjustify === \"center\" ? \"gap-1\" : \"flex-1 shrink-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex items-center justify-end flex-1 shrink-0\">\n\t\t\t\t\t\t{endContent}\n\t\t\t\t\t</div>\n\t\t\t\t</m.div>\n\t\t\t</ToolbarContext.Provider>\n\t\t);\n\t},\n);\nBottomDockedToolbar.displayName = \"BottomDockedToolbar\";\n","import type { Transition } from \"motion/react\";\n\n/**\n * Design tokens for the MD3 Expressive Toolbars components.\n * Extracted from `FloatingToolbarTokens.kt` and `FabBaselineTokens.kt`.\n */\n\n/**\n * Spring motion specification for Toolbar buttons (ToolbarIconButton, ToolbarToggleButton).\n * Synchronized with ButtonDistribute spring characteristics.\n * Per spec: framer-motion spring config (stiffness: 300, damping: 30, mass: 0.8).\n */\nexport const TOOLBAR_SPRING_TRANSITION: Transition = {\n\ttype: \"spring\",\n\tstiffness: 300,\n\tdamping: 30,\n\tmass: 0.8,\n};\n\nexport const FloatingToolbarTokens = {\n\tContainerBetweenSpace: 4,\n\tContainerExternalPadding: 16,\n\tContainerHeight: 64,\n\tContainerLeadingSpace: 8,\n\tContainerShape: \"full\",\n\tContainerTrailingSpace: 8,\n\tVerticalContainerExternalPadding: 24,\n} as const;\n\nexport const FabBaselineTokens = {\n\tContainerHeight: 56,\n\tContainerWidth: 56,\n\tMediumContainerHeight: 80,\n\tMediumContainerWidth: 80,\n\tIconSize: 24,\n\tMediumIconSize: 28,\n} as const;\n\nexport const ToolbarToFabGap = 8;\n\n/**\n * Design tokens for the ToolbarDivider component.\n * The divider is a decorative separator used to group toolbar actions.\n */\nexport const ToolbarDividerTokens = {\n\t/** Divider line thickness in px */\n\tThickness: 1,\n\t/** Divider size as a fraction of the toolbar container dimension */\n\tHeightRatio: 0.5,\n} as const;\n\n/**\n * Design tokens for the ToolbarIconButton component.\n * Sizes follow MD3 Expressive touch-target minimums (48dp height always).\n * - narrow: de-emphasised secondary actions\n * - default: standard icon button\n * - wide: primary action emphasis inside the toolbar\n */\nexport const ToolbarIconButtonTokens = {\n\tNarrowWidth: 40,\n\tDefaultWidth: 48,\n\tWideWidth: 64,\n\t/** Minimum touch-target height per MD3 accessibility guidelines */\n\tHeight: 48,\n\t/** Icon size in dp — larger than standard 24dp to fill the 48dp button properly */\n\tIconSize: 28,\n} as const;\n\n/**\n * Design tokens for the ToolbarToggleButton component.\n * Follows MD3 Expressive 'Button toggleable' building block specifications.\n */\nexport const ToolbarToggleButtonTokens = {\n\tHeight: 48,\n\tMinWidth: 95,\n\tIconSize: 24,\n\tPaddingX: 16,\n\tGap: 8,\n} as const;\n","import { AnimatePresence, m, type Variants } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarColors,\n\tgetToolbarColors,\n\ttype ToolbarVariant,\n} from \"./toolbar-colors\";\nimport { ToolbarContext } from \"./toolbar-context\";\nimport type { FloatingToolbarScrollBehavior } from \"./toolbar-scroll-behavior\";\nimport { FloatingToolbarTokens } from \"./toolbar-tokens\";\n\nexport interface FloatingToolbarProps {\n\t/** Whether the toolbar is expanded, showing startContent and endContent */\n\texpanded: boolean;\n\t/** Orientation of the toolbar */\n\torientation?: \"horizontal\" | \"vertical\";\n\t/** Color variant: standard, vibrant, surface-high, surface-highest, tertiary, or xr */\n\tvariant?: ToolbarVariant;\n\t/** Color configuration override */\n\tcolors?: FloatingToolbarColors;\n\t/** Shape variant: full = pill shape (default), large = large rounded */\n\tshape?: \"full\" | \"large\";\n\t/** Padding inside toolbar container */\n\tcontentPadding?: React.CSSProperties | string;\n\t/** Scroll behavior hook result */\n\tscrollBehavior?: FloatingToolbarScrollBehavior;\n\t/** Start content (shown when expanded, usually on the left/top) */\n\tstartContent?: React.ReactNode;\n\t/** End content (shown when expanded, usually on the right/bottom) */\n\tendContent?: React.ReactNode;\n\t/** Main toolbar content (always visible) */\n\tchildren: React.ReactNode;\n\t/** Whether to disable the internal scroll translation (useful when parent handles it) */\n\tdisableScrollTranslation?: boolean;\n\t/** Whether to disable layout animation (useful when nested inside FloatingToolbarWithFab) */\n\tdisableLayoutAnimation?: boolean;\n\t/**\n\t * Gap (px) between items in the center children slot.\n\t * Corresponds to MD3 `ContainerBetweenSpace` token (4dp default).\n\t * @default 4\n\t */\n\titemGap?: number;\n\t/** Alignment (justify-content) of the center children slot */\n\tchildrenAlignment?: \"start\" | \"center\" | \"end\";\n\t/** Custom CSS class applied to each child item in the toolbar slots */\n\titemClassName?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\t\"aria-label\"?: string;\n}\n\n// --- Module-level helpers ---\n\nconst ALIGNMENT_CLASS: Record<\"start\" | \"center\" | \"end\", string> = {\n\tstart: \"justify-start\",\n\tcenter: \"justify-center\",\n\tend: \"justify-end\",\n};\n\nfunction resolveScrollTranslation(\n\tscrollBehavior: FloatingToolbarScrollBehavior | undefined,\n\tdisabled: boolean | undefined,\n): { x: number | string; y: number | string } {\n\tif (!scrollBehavior || disabled) return { x: 0, y: 0 };\n\tconst { offset, exitDirection } = scrollBehavior;\n\tconst percent = offset * -100;\n\tswitch (exitDirection) {\n\t\tcase \"top\":\n\t\t\treturn { y: `${-percent}%`, x: 0 };\n\t\tcase \"bottom\":\n\t\t\treturn { y: `${percent}%`, x: 0 };\n\t\tcase \"start\":\n\t\t\treturn { x: `${-percent}%`, y: 0 };\n\t\tcase \"end\":\n\t\t\treturn { x: `${percent}%`, y: 0 };\n\t\tdefault:\n\t\t\treturn { x: 0, y: 0 };\n\t}\n}\n\nfunction buildSlotVariants(\n\txHidden: string | number,\n\tyHidden: string | number,\n\tisHorizontal: boolean,\n): Variants {\n\treturn {\n\t\thidden: {\n\t\t\tx: xHidden,\n\t\t\ty: yHidden,\n\t\t\topacity: 0,\n\t\t\tscale: 0.9,\n\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\theight: isHorizontal ? \"auto\" : 0,\n\t\t\ttransition: SPRING_TRANSITION,\n\t\t},\n\t\tvisible: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\topacity: 1,\n\t\t\tscale: 1,\n\t\t\twidth: \"auto\",\n\t\t\theight: \"auto\",\n\t\t\ttransition: SPRING_TRANSITION,\n\t\t},\n\t};\n}\n\nfunction applyItemClassName(\n\tnodes: React.ReactNode,\n\titemClassName: string,\n): React.ReactNode {\n\treturn React.Children.map(nodes, (child) => {\n\t\tif (!React.isValidElement(child)) return child;\n\t\tconst element = child as React.ReactElement<{ className?: string }>;\n\t\treturn React.cloneElement(element, {\n\t\t\tclassName: cn(element.props.className, itemClassName),\n\t\t});\n\t});\n}\n\n// --- Component ---\n\n/**\n * Internal component for rendering the toolbar logic.\n * Consumers should use HorizontalFloatingToolbar or VerticalFloatingToolbar.\n */\nconst FloatingToolbarBase = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarProps\n>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\torientation = \"horizontal\",\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\tshape = \"full\",\n\t\t\tcontentPadding,\n\t\t\tscrollBehavior,\n\t\t\tstartContent,\n\t\t\tendContent,\n\t\t\tchildren,\n\t\t\tdisableScrollTranslation,\n\t\t\tdisableLayoutAnimation,\n\t\t\titemGap = FloatingToolbarTokens.ContainerBetweenSpace,\n\t\t\tchildrenAlignment = \"center\",\n\t\t\titemClassName,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\t\tconst isHorizontal = orientation === \"horizontal\";\n\t\tconst isStringPadding = typeof contentPadding === \"string\";\n\n\t\tconst cssVars = {\n\t\t\t\"--toolbar-bg\": colors.toolbarContainerColor,\n\t\t\t\"--toolbar-color\": colors.toolbarContentColor,\n\t\t\t\"--toolbar-size\": `${FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t...(isStringPadding ? {} : contentPadding),\n\t\t\t...style,\n\t\t} as React.CSSProperties;\n\n\t\tconst isScrolledOff = scrollBehavior && scrollBehavior.offset < 0;\n\t\tconst isXr = variant === \"xr\";\n\t\tconst shadowClass = isXr\n\t\t\t? \"shadow-lg border border-white/10 backdrop-blur-md\"\n\t\t\t: expanded\n\t\t\t\t? \"shadow-md\"\n\t\t\t\t: \"shadow-sm\";\n\t\tconst containerShapeClass =\n\t\t\tshape === \"full\" ? \"rounded-full\" : \"rounded-2xl\";\n\n\t\tconst leadingVariants = buildSlotVariants(\n\t\t\tisHorizontal ? \"-100%\" : 0,\n\t\t\tisHorizontal ? 0 : \"100%\",\n\t\t\tisHorizontal,\n\t\t);\n\t\tconst trailingVariants = buildSlotVariants(\n\t\t\tisHorizontal ? \"100%\" : 0,\n\t\t\tisHorizontal ? 0 : \"-100%\",\n\t\t\tisHorizontal,\n\t\t);\n\n\t\tconst processNodes = (nodes: React.ReactNode) =>\n\t\t\titemClassName ? applyItemClassName(nodes, itemClassName) : nodes;\n\n\t\tconst scrollTranslation = resolveScrollTranslation(\n\t\t\tscrollBehavior,\n\t\t\tdisableScrollTranslation,\n\t\t);\n\n\t\treturn (\n\t\t\t<ToolbarContext.Provider value={{ orientation, itemClassName }}>\n\t\t\t\t<m.div\n\t\t\t\t\tref={ref}\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={scrollTranslation}\n\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\taria-label={ariaLabel || \"Floating Toolbar\"}\n\t\t\t\t\t\taria-orientation={orientation}\n\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\tinert={isScrolledOff ? true : undefined}\n\t\t\t\t\t\t{...(disableLayoutAnimation ? {} : { layout: \"position\" as const })}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...cssVars,\n\t\t\t\t\t\t\tbackgroundColor: \"var(--toolbar-bg)\",\n\t\t\t\t\t\t\tcolor: \"var(--toolbar-color)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex pointer-events-auto relative text-(--toolbar-color) [&_.text-m3-on-surface-variant]:text-current\",\n\t\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t\t? \"max-w-[min(90vw,100%)] h-(--toolbar-size)\"\n\t\t\t\t\t\t\t\t: \"max-h-[min(90vh,100%)] w-(--toolbar-size) h-fit\",\n\t\t\t\t\t\t\tcontainerShapeClass,\n\t\t\t\t\t\t\tshadowClass,\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex-1 w-full h-full rounded-[inherit] scrollbar-hide\",\n\t\t\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t\t\t? \"overflow-x-auto overflow-y-visible\"\n\t\t\t\t\t\t\t\t\t: \"overflow-y-auto overflow-x-visible\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center min-w-0 min-h-0\",\n\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row h-full\" : \"flex-col w-full\",\n\t\t\t\t\t\t\t\t\tisStringPadding\n\t\t\t\t\t\t\t\t\t\t? contentPadding\n\t\t\t\t\t\t\t\t\t\t: isHorizontal\n\t\t\t\t\t\t\t\t\t\t\t? \"px-2\"\n\t\t\t\t\t\t\t\t\t\t\t: \"py-2\",\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\tgap: itemGap,\n\t\t\t\t\t\t\t\t\t...(isStringPadding ? {} : contentPadding),\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<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{expanded && startContent && (\n\t\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\t\tkey=\"start\"\n\t\t\t\t\t\t\t\t\t\t\tvariants={leadingVariants}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex shrink-0 items-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{processNodes(startContent)}\n\t\t\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex flex-1 items-center min-w-0 min-h-0 h-full\",\n\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\tALIGNMENT_CLASS[childrenAlignment],\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{processNodes(children)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t{expanded && endContent && (\n\t\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\t\tkey=\"end\"\n\t\t\t\t\t\t\t\t\t\t\tvariants={trailingVariants}\n\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex shrink-0 items-center overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\tisHorizontal ? \"flex-row\" : \"flex-col\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ gap: itemGap }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{processNodes(endContent)}\n\t\t\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</m.div>\n\t\t\t\t</m.div>\n\t\t\t</ToolbarContext.Provider>\n\t\t);\n\t},\n);\nFloatingToolbarBase.displayName = \"FloatingToolbarBase\";\n\n/**\n * A horizontal floating toolbar that displays navigation and key actions.\n * It can be positioned anywhere on the screen and floats over the rest of the content.\n *\n * @example\n * ```tsx\n * const [expanded, setExpanded] = useState(true);\n * const scrollBehavior = useFloatingToolbarScrollBehavior({ exitDirection: 'bottom' });\n *\n * <HorizontalFloatingToolbar\n * expanded={expanded}\n * scrollBehavior={scrollBehavior}\n * startContent={<IconButton icon=\"undo\" />}\n * endContent={<IconButton icon=\"redo\" />}\n * >\n * <IconButton icon=\"bold\" />\n * <IconButton icon=\"italic\" />\n * </HorizontalFloatingToolbar>\n * ```\n *\n * @see https://m3.material.io/components/toolbars/guidelines\n */\nexport const HorizontalFloatingToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tOmit<FloatingToolbarProps, \"orientation\">\n>((props, ref) => (\n\t<FloatingToolbarBase ref={ref} orientation=\"horizontal\" {...props} />\n));\nHorizontalFloatingToolbar.displayName = \"HorizontalFloatingToolbar\";\n\n/**\n * A vertical floating toolbar that displays navigation and key actions.\n * It floats over the rest of the content.\n *\n * @example\n * ```tsx\n * <VerticalFloatingToolbar expanded={true}>\n * <IconButton icon=\"bold\" />\n * </VerticalFloatingToolbar>\n * ```\n */\nexport const VerticalFloatingToolbar = React.forwardRef<\n\tHTMLDivElement,\n\tOmit<FloatingToolbarProps, \"orientation\">\n>((props, ref) => (\n\t<FloatingToolbarBase ref={ref} orientation=\"vertical\" {...props} />\n));\nVerticalFloatingToolbar.displayName = \"VerticalFloatingToolbar\";\n","import { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { SPRING_TRANSITION } from \"../shared/constants\";\nimport {\n\ttype FloatingToolbarProps,\n\tHorizontalFloatingToolbar,\n\tVerticalFloatingToolbar,\n} from \"./floating-toolbar\";\nimport { getToolbarColors } from \"./toolbar-colors\";\nimport {\n\tFabBaselineTokens,\n\tFloatingToolbarTokens,\n\tToolbarToFabGap,\n} from \"./toolbar-tokens\";\n\nexport interface FloatingToolbarWithFabProps extends FloatingToolbarProps {\n\t/** FAB element (use FAB component or custom node) */\n\tfloatingActionButton: React.ReactNode;\n\t/** FAB position for horizontal: 'start' | 'end'. For vertical: 'top' | 'bottom' */\n\tfabPosition?: \"start\" | \"end\" | \"top\" | \"bottom\";\n\t/** Animation duration override */\n\tanimationDuration?: number;\n\t/** Start content (explicitly declared to resolve type issues) */\n\tstartContent?: React.ReactNode;\n\t/** End content (explicitly declared to resolve type issues) */\n\tendContent?: React.ReactNode;\n\t/**\n\t * Size of the FAB container.\n\t * - `\"default\"` → 56×56px (`FabBaselineTokens.ContainerHeight`)\n\t * - `\"medium\"` → 80×80px (`FabBaselineTokens.MediumContainerHeight`)\n\t *\n\t * MD3: pair a medium FAB with the toolbar to give it greater visual prominence.\n\t * @default \"default\"\n\t */\n\tfabSize?: \"default\" | \"medium\";\n}\n\nconst FloatingToolbarWithFabBase = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\torientation = \"horizontal\",\n\t\t\tvariant = \"standard\",\n\t\t\tcolors: customColors,\n\t\t\tfloatingActionButton,\n\t\t\tfabPosition = orientation === \"horizontal\" ? \"end\" : \"bottom\",\n\t\t\tanimationDuration = 0.3,\n\t\t\tscrollBehavior,\n\t\t\tfabSize = \"default\",\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = getToolbarColors(variant, customColors);\n\n\t\tconst isHorizontal = orientation === \"horizontal\";\n\n\t\tconst effectiveExpanded =\n\t\t\texpanded && (!scrollBehavior || scrollBehavior.isExpanded);\n\n\t\tconst isFabBefore = fabPosition === \"start\" || fabPosition === \"top\";\n\n\t\tconst resolvedFabSize =\n\t\t\tfabSize === \"medium\"\n\t\t\t\t? FabBaselineTokens.MediumContainerHeight\n\t\t\t\t: FabBaselineTokens.ContainerHeight;\n\n\t\tconst transitionSpec = {\n\t\t\t...SPRING_TRANSITION,\n\t\t\tduration: animationDuration,\n\t\t};\n\n\t\tconst SHADOW_PADDING = 24;\n\n\t\tconst fabContainerNode = (\n\t\t\t<m.div\n\t\t\t\tlayout\n\t\t\t\tkey=\"fab-container\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: `${resolvedFabSize}px`,\n\t\t\t\t\theight: `${resolvedFabSize}px`,\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center justify-center relative z-10\",\n\t\t\t\t\t\"*:w-full *:h-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{floatingActionButton}\n\t\t\t</m.div>\n\t\t);\n\n\t\treturn (\n\t\t\t<div ref={ref} style={style}>\n\t\t\t\t<m.div\n\t\t\t\t\tlayout\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={{\n\t\t\t\t\t\tgap: effectiveExpanded ? `${ToolbarToFabGap}px` : \"0px\",\n\t\t\t\t\t}}\n\t\t\t\t\ttransition={transitionSpec}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center pointer-events-auto\",\n\t\t\t\t\t\tisHorizontal\n\t\t\t\t\t\t\t? \"flex-row h-(--toolbar-size)\"\n\t\t\t\t\t\t\t: \"flex-col w-(--toolbar-size) h-fit\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--fab-size\": `${resolvedFabSize}px`,\n\t\t\t\t\t\t\t\"--toolbar-size\": `${FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t\t\t\t} as React.CSSProperties\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFabBefore && fabContainerNode}\n\n\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t{effectiveExpanded && (\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tkey=\"toolbar-content-wrapper\"\n\t\t\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t\t\tscale: 0.9,\n\t\t\t\t\t\t\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t\theight: !isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\tscale: 1,\n\t\t\t\t\t\t\t\t\twidth: \"auto\",\n\t\t\t\t\t\t\t\t\theight: \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\texit={{\n\t\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t\t\tscale: 0.9,\n\t\t\t\t\t\t\t\t\twidth: isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t\theight: !isHorizontal ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={transitionSpec}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tpadding: SHADOW_PADDING,\n\t\t\t\t\t\t\t\t\tmargin: -SHADOW_PADDING,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center shrink-0 min-w-0 min-h-0 overflow-hidden relative z-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isHorizontal ? (\n\t\t\t\t\t\t\t\t\t<HorizontalFloatingToolbar\n\t\t\t\t\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\t\t\t\t\tcolors={colors}\n\t\t\t\t\t\t\t\t\t\tdisableScrollTranslation\n\t\t\t\t\t\t\t\t\t\tdisableLayoutAnimation\n\t\t\t\t\t\t\t\t\t\tclassName={className ? cn(\"h-full\", className) : undefined}\n\t\t\t\t\t\t\t\t\t\t{...props}\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<VerticalFloatingToolbar\n\t\t\t\t\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\t\t\t\t\tcolors={colors}\n\t\t\t\t\t\t\t\t\t\tdisableScrollTranslation\n\t\t\t\t\t\t\t\t\t\tdisableLayoutAnimation\n\t\t\t\t\t\t\t\t\t\tclassName={className ? cn(\"w-full\", className) : undefined}\n\t\t\t\t\t\t\t\t\t\t{...props}\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.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t{!isFabBefore && fabContainerNode}\n\t\t\t\t</m.div>\n\t\t\t</div>\n\t\t);\n\t},\n);\nFloatingToolbarWithFabBase.displayName = \"FloatingToolbarWithFabBase\";\n\n/**\n * A horizontal floating toolbar paired with a FAB.\n */\nexport const HorizontalFloatingToolbarWithFab = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>((props, ref) => (\n\t<FloatingToolbarWithFabBase ref={ref} orientation=\"horizontal\" {...props} />\n));\nHorizontalFloatingToolbarWithFab.displayName =\n\t\"HorizontalFloatingToolbarWithFab\";\n\n/**\n * A vertical floating toolbar paired with a FAB.\n */\nexport const VerticalFloatingToolbarWithFab = React.forwardRef<\n\tHTMLDivElement,\n\tFloatingToolbarWithFabProps\n>((props, ref) => (\n\t<FloatingToolbarWithFabBase ref={ref} orientation=\"vertical\" {...props} />\n));\nVerticalFloatingToolbarWithFab.displayName = \"VerticalFloatingToolbarWithFab\";\n","/**\n * @file toolbar-divider.tsx\n *\n * A decorative divider for use inside MD3 Toolbar components.\n * Renders as a thin line that visually separates groups of toolbar actions.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n */\n\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport { FloatingToolbarTokens, ToolbarDividerTokens } from \"./toolbar-tokens\";\n\nexport interface ToolbarDividerProps {\n\t/**\n\t * The toolbar's orientation context.\n\t * - `\"horizontal\"` toolbar → renders a **vertical** divider line.\n\t * - `\"vertical\"` toolbar → renders a **horizontal** divider line.\n\t * @default \"horizontal\"\n\t */\n\torientation?: \"horizontal\" | \"vertical\";\n\tclassName?: string;\n}\n\n/**\n * A thin decorative separator for grouping actions inside a Toolbar.\n *\n * Inherits its color from the toolbar's `--toolbar-color` CSS variable via\n * `currentColor`, so it automatically adapts to both standard and vibrant\n * color configurations.\n *\n * @example\n * ```tsx\n * <HorizontalFloatingToolbar expanded={true}>\n * <IconButton aria-label=\"Bold\"><BoldIcon /></IconButton>\n * <IconButton aria-label=\"Italic\"><ItalicIcon /></IconButton>\n * <ToolbarDivider />\n * <IconButton aria-label=\"Align left\"><AlignLeftIcon /></IconButton>\n * </HorizontalFloatingToolbar>\n * ```\n */\nexport const ToolbarDivider: React.FC<ToolbarDividerProps> = ({\n\torientation: propsOrientation,\n\tclassName,\n}) => {\n\tconst context = useToolbarContext();\n\tconst orientation = propsOrientation || context?.orientation || \"horizontal\";\n\tconst isHorizontalToolbar = orientation === \"horizontal\";\n\n\treturn (\n\t\t<hr\n\t\t\taria-orientation={isHorizontalToolbar ? \"vertical\" : \"horizontal\"}\n\t\t\tclassName={cn(\n\t\t\t\t\"shrink-0 bg-current opacity-30 border-none\",\n\t\t\t\tisHorizontalToolbar\n\t\t\t\t\t? \"w-px h-8 self-center mx-1\"\n\t\t\t\t\t: \"h-px w-8 self-center my-1\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\twidth: isHorizontalToolbar\n\t\t\t\t\t? `${ToolbarDividerTokens.Thickness}px`\n\t\t\t\t\t: `${ToolbarDividerTokens.HeightRatio * FloatingToolbarTokens.ContainerHeight}px`,\n\t\t\t\theight: isHorizontalToolbar\n\t\t\t\t\t? `${ToolbarDividerTokens.HeightRatio * FloatingToolbarTokens.ContainerHeight}px`\n\t\t\t\t\t: `${ToolbarDividerTokens.Thickness}px`,\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nToolbarDivider.displayName = \"ToolbarDivider\";\n","/**\n * @file toolbar-icon-button.tsx\n *\n * A thin wrapper around the MD3 `IconButton` component, pre-configured\n * for use inside Toolbar slots.\n *\n * Supports the three emphasis variants described in the MD3 Flexibility & slots\n * spec, plus narrow/wide sizing for asymmetric visual hierarchy.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { type BaseIconButtonProps, IconButton } from \"../buttons/icon-button\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport {\n\tTOOLBAR_SPRING_TRANSITION,\n\tToolbarIconButtonTokens,\n} from \"./toolbar-tokens\";\n\nexport interface ToolbarIconButtonProps\n\textends Omit<BaseIconButtonProps, \"colorStyle\" | \"size\" | \"shape\"> {\n\t/**\n\t * Visual emphasis variant.\n\t *\n\t * ⚠️ Avoid emphasising more than one action at a time.\n\t * @default \"standard\"\n\t */\n\temphasis?: ToolbarIconButtonVariant;\n\t/**\n\t * Button width sizing.\n\t *\n\t * Height is always `48px` to meet MD3 touch-target requirements.\n\t * @default \"default\"\n\t */\n\ttoolbarSize?: ToolbarIconButtonSize;\n\t/**\n\t * Whether the icon button is in a selected/active toggle state.\n\t */\n\tselected?: boolean;\n\t/**\n\t * Change the default rendered element to the one passed as a child, merging their props and behavior.\n\t */\n\tasChild?: boolean;\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\"aria-label\": string;\n}\n\n/**\n * Width sizing for a toolbar icon button.\n *\n * MD3 guideline: *\"Use wide and narrow icon buttons\"* to create visual hierarchy.\n * Touch-target height is always 48dp regardless of width.\n *\n * - `narrow` → 40px wide (secondary, de-emphasised)\n * - `default` → 48px wide (standard square touch target)\n * - `wide` → 64px wide (primary emphasis, draws eye)\n */\nexport type ToolbarIconButtonSize = \"narrow\" | \"default\" | \"wide\";\n\n/**\n * Visual emphasis variant for a toolbar icon button.\n *\n * MD3 guideline: *\"Use different icon button color styles, such as filled,\n * tonal, and standard.\"*\n *\n * ⚠️ **Avoid emphasising more than one action at a time.**\n * Use `\"filled\"` or `\"tonal\"` for the single highest-priority action and\n * keep all other buttons as `\"standard\"`.\n */\nexport type ToolbarIconButtonVariant = \"standard\" | \"tonal\" | \"filled\";\n\nconst TOOLBAR_ICON_BUTTON_WIDTH: Record<ToolbarIconButtonSize, string> = {\n\tnarrow: \"w-[40px]\",\n\tdefault: \"w-[48px]\",\n\twide: \"w-[64px]\",\n};\n\nconst VARIANT_TO_COLOR_STYLE: Record<\n\tToolbarIconButtonVariant,\n\t\"standard\" | \"filled\" | \"tonal\"\n> = {\n\tstandard: \"standard\",\n\ttonal: \"tonal\",\n\tfilled: \"filled\",\n};\n\n/**\n * An MD3 icon button optimised for use inside Toolbar slots.\n *\n * Wraps the project's `IconButton` and adds:\n * - Three emphasis styles (`standard`, `tonal`, `filled`) via `emphasis` prop.\n * - Three width sizes (`narrow`, `default`, `wide`) for visual hierarchy.\n * - Support for `selected` state (Toggleable Icon Button per MD3 spec).\n * - Support for `asChild` slot delegation.\n * - Always `rounded-full` shape (required for floating toolbars per MD3 spec).\n * - Always 48dp height to meet MD3 accessibility touch-target requirements.\n * - Material Design 3 Expressive spring motion physics (`TOOLBAR_SPRING_TRANSITION`)\n * synchronized with `ButtonDistribute` for responsive press scale and width expansion.\n *\n * @example\n * ```tsx\n * // Standard (default) — use for most actions\n * <ToolbarIconButton aria-label=\"Share\">\n * <ShareIcon />\n * </ToolbarIconButton>\n *\n * // Toggleable state\n * <ToolbarIconButton selected={isSelected} aria-label=\"Bookmark\" onClick={() => setIsSelected(!isSelected)}>\n * <BookmarkIcon />\n * </ToolbarIconButton>\n * ```\n *\n * @see https://m3.material.io/components/toolbars/guidelines\n */\nexport const ToolbarIconButton = React.forwardRef<\n\tHTMLButtonElement,\n\tToolbarIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\temphasis = \"standard\",\n\t\t\ttoolbarSize = \"default\",\n\t\t\tselected,\n\t\t\tasChild,\n\t\t\tclassName,\n\t\t\ttransition,\n\t\t\twhileTap,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useToolbarContext();\n\t\tconst widthClass = TOOLBAR_ICON_BUTTON_WIDTH[toolbarSize];\n\t\tconst colorStyle = VARIANT_TO_COLOR_STYLE[emphasis];\n\n\t\tconst iconButtonProps =\n\t\t\tselected !== undefined\n\t\t\t\t? ({\n\t\t\t\t\t\tvariant: \"toggle\" as const,\n\t\t\t\t\t\tselected: Boolean(selected),\n\t\t\t\t\t} as const)\n\t\t\t\t: ({\n\t\t\t\t\t\tvariant: \"default\" as const,\n\t\t\t\t\t} as const);\n\n\t\tconst motionProps = asChild\n\t\t\t? {\n\t\t\t\t\t...(transition !== undefined && { transition }),\n\t\t\t\t\t...(whileTap !== undefined && { whileTap }),\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttransition: transition ?? TOOLBAR_SPRING_TRANSITION,\n\t\t\t\t\twhileTap: whileTap ?? { scale: 0.95 },\n\t\t\t\t};\n\n\t\treturn (\n\t\t\t<IconButton\n\t\t\t\tref={ref}\n\t\t\t\tasChild={asChild}\n\t\t\t\tcolorStyle={colorStyle}\n\t\t\t\tsize=\"md\"\n\t\t\t\tshape=\"round\"\n\t\t\t\ticonSize={ToolbarIconButtonTokens.IconSize}\n\t\t\t\t{...motionProps}\n\t\t\t\t{...iconButtonProps}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"h-[48px]\",\n\t\t\t\t\twidthClass,\n\t\t\t\t\temphasis === \"standard\" &&\n\t\t\t\t\t\t!selected &&\n\t\t\t\t\t\t\"text-current hover:bg-current/8 active:bg-current/12\",\n\t\t\t\t\temphasis === \"standard\" &&\n\t\t\t\t\t\tselected &&\n\t\t\t\t\t\t\"bg-current/16 text-current hover:bg-current/20 active:bg-current/24\",\n\t\t\t\t\tcontext?.itemClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nToolbarIconButton.displayName = \"ToolbarIconButton\";\n","import { useMotionValueEvent, useScroll } from \"motion/react\";\nimport { type RefObject, useEffect, useRef, useState } from \"react\";\n\n/**\n * Configuration options for the `useFloatingToolbarScrollBehavior` hook.\n */\nexport interface UseFloatingToolbarScrollBehaviorOptions {\n\t/** Direction toolbar exits: 'top' | 'bottom' | 'start' | 'end'. Defaults to 'bottom'. */\n\texitDirection?: \"top\" | \"bottom\" | \"start\" | \"end\";\n\t/** Scroll distance threshold to trigger collapse (in px). Defaults to 10. */\n\tcollapseThreshold?: number;\n\t/** Scroll distance threshold to trigger expand (in px). Defaults to 10. */\n\texpandThreshold?: number;\n\t/** Optional ref to a scrollable container. If not provided, it listens to window scroll. */\n\tscrollContainerRef?: RefObject<HTMLElement | null>;\n}\n\n/**\n * The resulting behavior object returned by `useFloatingToolbarScrollBehavior`.\n */\nexport interface FloatingToolbarScrollBehavior {\n\t/** Current offset. 0 is fully visible, -1 is fully hidden. */\n\toffset: number;\n\t/** Whether the toolbar is currently expanded. */\n\tisExpanded: boolean;\n\t/** Optional scroll handler to bind to a React scrollable container (legacy fallback). */\n\tonScroll?: (event: React.UIEvent<HTMLElement>) => void;\n\t/** Manually update the expanded state of the toolbar. */\n\tsetExpanded: (expanded: boolean) => void;\n\t/** The configured exit direction. */\n\texitDirection: \"top\" | \"bottom\" | \"start\" | \"end\";\n}\n\n/**\n * A hook that provides scroll behavior for floating toolbars, allowing them to\n * collapse (exit) when scrolling down and expand (enter) when scrolling up.\n * Leverages Framer Motion's useScroll internally for optimized performance.\n *\n * @param options Configuration options for scroll behavior.\n * @returns An object containing the current scroll state and handlers.\n *\n * @example\n * ```tsx\n * const scrollBehavior = useFloatingToolbarScrollBehavior({\n * exitDirection: 'bottom',\n * collapseThreshold: 20\n * });\n *\n * <HorizontalFloatingToolbar scrollBehavior={scrollBehavior}>\n * <IconButton icon=\"bold\" />\n * </HorizontalFloatingToolbar>\n * ```\n */\nexport function useFloatingToolbarScrollBehavior(\n\toptions: UseFloatingToolbarScrollBehaviorOptions = {},\n): FloatingToolbarScrollBehavior {\n\tconst {\n\t\texitDirection = \"bottom\",\n\t\tcollapseThreshold = 10,\n\t\texpandThreshold = 10,\n\t\tscrollContainerRef,\n\t} = options;\n\n\tconst [isExpanded, setIsExpanded] = useState(true);\n\tconst [offset, setOffset] = useState(0); // 0 to -1\n\n\tconst { scrollY } = useScroll({\n\t\tcontainer: scrollContainerRef,\n\t});\n\n\tconst lastScrollY = useRef(0);\n\tconst accumulatedScroll = useRef(0);\n\n\tuseMotionValueEvent(scrollY, \"change\", (currentScrollY) => {\n\t\tconst deltaY = currentScrollY - lastScrollY.current;\n\n\t\t// Ignore bouncing (negative scroll or past max scroll on macOS)\n\t\tif (currentScrollY < 0) return;\n\n\t\tlastScrollY.current = currentScrollY;\n\n\t\t// Only accumulate if we are scrolling in the same direction\n\t\tif (Math.sign(deltaY) !== Math.sign(accumulatedScroll.current)) {\n\t\t\taccumulatedScroll.current = deltaY;\n\t\t} else {\n\t\t\taccumulatedScroll.current += deltaY;\n\t\t}\n\n\t\tif (deltaY > 0 && isExpanded) {\n\t\t\t// Scrolling down -> collapse\n\t\t\tif (accumulatedScroll.current > collapseThreshold) {\n\t\t\t\tsetIsExpanded(false);\n\t\t\t\tsetOffset(-1);\n\t\t\t}\n\t\t} else if (deltaY < 0 && !isExpanded) {\n\t\t\t// Scrolling up -> expand\n\t\t\tif (Math.abs(accumulatedScroll.current) > expandThreshold) {\n\t\t\t\tsetIsExpanded(true);\n\t\t\t\tsetOffset(0);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Accessibility: Always force expanded if forced-colors mode or accessibility preferences\n\tuseEffect(() => {\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst matchMedia = window.matchMedia(\"(forced-colors: active)\");\n\t\t\tif (matchMedia.matches) {\n\t\t\t\tsetIsExpanded(true);\n\t\t\t\tsetOffset(0);\n\t\t\t}\n\n\t\t\tconst listener = (e: MediaQueryListEvent) => {\n\t\t\t\tif (e.matches) {\n\t\t\t\t\tsetIsExpanded(true);\n\t\t\t\t\tsetOffset(0);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmatchMedia.addEventListener(\"change\", listener);\n\t\t\treturn () => matchMedia.removeEventListener(\"change\", listener);\n\t\t}\n\t}, []);\n\n\tconst setExpanded = (expanded: boolean) => {\n\t\tsetIsExpanded(expanded);\n\t\tsetOffset(expanded ? 0 : -1);\n\t};\n\n\t// Dummy onScroll for legacy compatibility if users still attach it\n\tconst onScroll = () => {};\n\n\treturn {\n\t\toffset,\n\t\tisExpanded,\n\t\tonScroll,\n\t\tsetExpanded,\n\t\texitDirection,\n\t};\n}\n","/**\n * @file toolbar-toggle-button.tsx\n *\n * An MD3 Expressive toggle button with icon and text label for Toolbar slots.\n * Implements the 'Button toggleable' building block from MD3 Toolbar guidelines.\n *\n * @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Ripple, useRippleState } from \"../ripple\";\nimport { useToolbarContext } from \"./toolbar-context\";\nimport {\n\tTOOLBAR_SPRING_TRANSITION,\n\tToolbarToggleButtonTokens,\n} from \"./toolbar-tokens\";\n\nconst MOTION_PROP_KEYS = [\n\t\"animate\",\n\t\"exit\",\n\t\"initial\",\n\t\"transition\",\n\t\"variants\",\n\t\"whileHover\",\n\t\"whileTap\",\n\t\"whileFocus\",\n\t\"whileDrag\",\n\t\"whileInView\",\n\t\"onAnimationStart\",\n\t\"onAnimationComplete\",\n\t\"onUpdate\",\n\t\"onDragStart\",\n\t\"onDragEnd\",\n\t\"onDrag\",\n\t\"onDirectionLock\",\n\t\"onDragTransitionEnd\",\n\t\"layout\",\n\t\"layoutId\",\n\t\"onLayoutAnimationComplete\",\n] as const;\n\nexport interface ToolbarToggleButtonProps\n\textends Omit<HTMLMotionProps<\"button\">, \"children\"> {\n\t/**\n\t * Visual emphasis variant.\n\t * @default \"standard\"\n\t */\n\temphasis?: \"standard\" | \"tonal\" | \"filled\";\n\t/**\n\t * Whether the button is in a selected/active state.\n\t * @default false\n\t */\n\tselected?: boolean;\n\t/**\n\t * Leading icon component or node.\n\t */\n\ticon?: React.ReactNode;\n\t/**\n\t * Button text label / content.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Scale compression factor when pressed/clicked.\n\t * MD3 Expressive default: 0.95.\n\t * @default 0.95\n\t */\n\tpressScale?: number;\n\t/**\n\t * Horizontal spring bounce offset (in px) when pressed/clicked.\n\t * Oscillates left and right then contracts back to center.\n\t * Set to 0 to disable horizontal bounce.\n\t * @default 6\n\t */\n\tpressBounceOffset?: number;\n\t/**\n\t * Enable MD3 state layer ripple effect on click.\n\t * @default true\n\t */\n\tripple?: boolean;\n\t/**\n\t * Delegation prop to merge props onto a child element (Radix Slot).\n\t */\n\tasChild?: boolean;\n\tclassName?: string;\n}\n\n/**\n * An MD3 pill-shaped toggle button with optional leading icon and text label.\n *\n * Meets MD3 Expressive touch-target requirements (48dp height minimum, ~95dp width).\n * Features Material Design 3 Expressive spring press animation (`FAST_SPATIAL_SPRING`),\n * horizontal spring bounce oscillation (left-right bounce), and configurable ripple state layer.\n *\n * @example\n * ```tsx\n * const [selected, setSelected] = useState(false);\n *\n * <ToolbarToggleButton\n * selected={selected}\n * onClick={() => setSelected(!selected)}\n * icon={<EditIcon />}\n * >\n * Edit\n * </ToolbarToggleButton>\n * ```\n */\nexport const ToolbarToggleButton = React.forwardRef<\n\tHTMLButtonElement,\n\tToolbarToggleButtonProps\n>(\n\t(\n\t\t{\n\t\t\temphasis = \"standard\",\n\t\t\tselected = false,\n\t\t\ticon,\n\t\t\tchildren,\n\t\t\tpressScale = 0.95,\n\t\t\tpressBounceOffset = 6,\n\t\t\tripple = true,\n\t\t\tasChild = false,\n\t\t\tclassName,\n\t\t\ttype = \"button\",\n\t\t\tdisabled,\n\t\t\tonPointerDown: onPointerDownProp,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useToolbarContext();\n\n\t\tconst {\n\t\t\tripples,\n\t\t\tonPointerDown: handleRipplePointerDown,\n\t\t\tremoveRipple,\n\t\t} = useRippleState({\n\t\t\tdisabled: Boolean(disabled) || !ripple,\n\t\t});\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tif (!disabled && ripple) {\n\t\t\t\t\thandleRipplePointerDown(e);\n\t\t\t\t}\n\t\t\t\tonPointerDownProp?.(e);\n\t\t\t},\n\t\t\t[disabled, ripple, handleRipplePointerDown, onPointerDownProp],\n\t\t);\n\n\t\tconst baseClasses =\n\t\t\t\"relative overflow-hidden inline-flex items-center justify-center min-w-[95px] h-[48px] px-4 rounded-full text-sm font-medium transition-colors select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/40 disabled:pointer-events-none disabled:opacity-38\";\n\n\t\tconst variantClasses = {\n\t\t\tstandard: selected\n\t\t\t\t? \"bg-current/16 text-current hover:bg-current/20 active:bg-current/24\"\n\t\t\t\t: \"bg-transparent text-current hover:bg-current/8 active:bg-current/12\",\n\t\t\ttonal: selected\n\t\t\t\t? \"bg-m3-secondary-container text-m3-on-secondary-container hover:shadow-sm\"\n\t\t\t\t: \"bg-m3-surface-container-high text-m3-on-surface hover:bg-m3-surface-container-highest\",\n\t\t\tfilled: selected\n\t\t\t\t? \"bg-m3-primary text-m3-on-primary hover:shadow-sm\"\n\t\t\t\t: \"bg-m3-surface-container-highest text-m3-on-surface hover:bg-m3-surface-container-high\",\n\t\t};\n\n\t\tconst combinedClassName = cn(\n\t\t\tbaseClasses,\n\t\t\tvariantClasses[emphasis],\n\t\t\tcontext?.itemClassName,\n\t\t\tclassName,\n\t\t);\n\n\t\tconst whileTapConfig = React.useMemo(\n\t\t\t() => ({\n\t\t\t\tscale: pressScale,\n\t\t\t\tx: pressBounceOffset\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t-pressBounceOffset,\n\t\t\t\t\t\t\tpressBounceOffset,\n\t\t\t\t\t\t\t-pressBounceOffset / 2,\n\t\t\t\t\t\t\tpressBounceOffset / 2,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t]\n\t\t\t\t\t: 0,\n\t\t\t}),\n\t\t\t[pressScale, pressBounceOffset],\n\t\t);\n\n\t\tconst transitionConfig = React.useMemo(\n\t\t\t() => ({\n\t\t\t\t...TOOLBAR_SPRING_TRANSITION,\n\t\t\t\tscale: TOOLBAR_SPRING_TRANSITION,\n\t\t\t\tx: {\n\t\t\t\t\tduration: 0.35,\n\t\t\t\t\tease: \"easeInOut\" as const,\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[],\n\t\t);\n\n\t\tconst mainContent = (\n\t\t\t<span className=\"inline-flex items-center justify-center h-full gap-2\">\n\t\t\t\t{icon && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"shrink-0 inline-flex items-center justify-center\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t\theight: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{children &&\n\t\t\t\t\t(typeof children === \"string\" || typeof children === \"number\" ? (\n\t\t\t\t\t\t<span>{children}</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tchildren\n\t\t\t\t\t))}\n\t\t\t</span>\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\tconst childContent = child.props.children;\n\n\t\t\tconst innerChildContent = (\n\t\t\t\t<>\n\t\t\t\t\t{ripple && (\n\t\t\t\t\t\t<Ripple\n\t\t\t\t\t\t\tripples={ripples}\n\t\t\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"inline-flex items-center justify-center h-full gap-2\">\n\t\t\t\t\t\t{icon ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 inline-flex items-center justify-center\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\twidth: ToolbarToggleButtonTokens.IconSize,\n\t\t\t\t\t\t\t\t\t\theight: ToolbarToggleButtonTokens.IconSize,\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{icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{typeof childContent === \"string\" ||\n\t\t\t\t\t\t\t\ttypeof childContent === \"number\" ? (\n\t\t\t\t\t\t\t\t\t<span>{childContent}</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tchildContent\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\tchildContent\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t);\n\n\t\t\tconst strippedProps = { ...props } as Record<string, unknown>;\n\t\t\tfor (const key of MOTION_PROP_KEYS) delete strippedProps[key];\n\t\t\tdelete strippedProps.children;\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={selected}\n\t\t\t\t\t\tclassName={combinedClassName}\n\t\t\t\t\t\tonPointerDown={\n\t\t\t\t\t\t\thandlePointerDown as unknown as React.PointerEventHandler<HTMLElement>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{...(strippedProps as React.HTMLAttributes<HTMLElement>)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerChildContent })}\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={type}\n\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\twhileTap={whileTapConfig}\n\t\t\t\t\ttransition={transitionConfig}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tclassName={combinedClassName}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{ripple && (\n\t\t\t\t\t\t<Ripple\n\t\t\t\t\t\t\tripples={ripples}\n\t\t\t\t\t\t\tonRippleDone={removeRipple}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{mainContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nToolbarToggleButton.displayName = \"ToolbarToggleButton\";\n"]}